<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="https://raibledesigns.com/roller-ui/styles/rss.xsl" media="screen"?><rss version="2.0" 
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:atom="http://www.w3.org/2005/Atom" >
<channel>
  <title>Raible Designs</title>
  <link>https://raibledesigns.com/rd/</link>
      <atom:link rel="self" type="application/rss+xml" href="https://raibledesigns.com/rd/feed/entries/rss?tags=appfuse" />
    <description>Raible Designs is an Enterprise Open Source Consulting company. We specialize in UI and Full Stack Architectures using HTML5, CSS, JavaScript and Java. We love HTML5, Angular, Bootstrap, Spring Boot, and especially JHipster.</description>
  <language>en-us</language>
  <copyright>Copyright 2026</copyright>
  <lastBuildDate>Sat, 9 May 2026 04:29:55 -0600</lastBuildDate>
  <generator>Apache Roller (incubating) 5.0.3 (1388864191739:dave)</generator>
        <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/moving_appfuse_into_the_attic</guid>
    <title>Moving AppFuse into the Attic</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/moving_appfuse_into_the_attic</link>
        <pubDate>Thu, 28 Apr 2016 15:40:16 -0600</pubDate>
    <category>Java</category>
    <category>opensource</category>
    <category>appfuse</category>
    <category>attic</category>
    <category>java</category>
    <category>jhipster</category>
            <description>&lt;p&gt;&lt;img src=&quot;http://static.appfuse.org/images/appfuse-icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0; margin-top: -25px&quot;&gt;
In mid-February, I decided to stop working on &lt;a href=&quot;https://github.com/appfuse/appfuse&quot;&gt;AppFuse&lt;/a&gt;. My reason was simple: I was no longer getting any value from my contributions to the project. I sent &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/New-version-of-AppFuse-td4657900.html&quot;&gt;a message&lt;/a&gt; to the developers mailing list the next day:&lt;/p&gt;
&lt;blockquote class=&quot;quote&quot; style=&quot;margin-left: 20px&quot;&gt;
&lt;p style=&quot;margin-top: 0&quot;&gt;Hello everyone, &lt;/p&gt;
&lt;p&gt;
Last night, I started working on AppFuse 4.0, with the following features from the roadmap: &lt;/p&gt;
&lt;ul&gt;
       &lt;li&gt;Remove XML wherever possible&lt;/li&gt;
       &lt;li&gt;Java 8&lt;/li&gt;
       &lt;li&gt;Spring Boot&lt;/li&gt;
       &lt;li&gt;Spring Data&lt;/li&gt;
       &lt;li&gt;JSR 303 (might require removing or developing client-side support)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
As I started removing XML and integrating Spring Boot and Spring Data, it quickly became apparent that it&#8217;d be a lot of work to make all of these changes. My guess is it&#8217;d take over 100 hours of my time to do everything. This is time I&#8217;d be taking away from my family and personal time. 
&lt;/p&gt;
&lt;p&gt;
At the end of last year, I wanted to make AppFuse 4.0 happen because I thought it&#8217;d help me stay up-to-date with Java technologies and learn some things along the way. As I dug into the codebase last night, I realized it&#8217;d be more of a headache than a learning experience. It seems there would be little reward for all the work. 
&lt;/p&gt;
&lt;p&gt;
Because there&#8217;s little-to-no activity on the mailing list these days, it seems like it&#8217;s the right time to shutdown the project and dedicate my free time to other open source endeavors. As you might know, I&#8217;m a big fan of JHipster (&lt;a href=&quot;http://jhipster.github.io/&quot;&gt;http://jhipster.github.io/&lt;/a&gt;). It combines AngularJS and Spring Boot and has all the features that AppFuse has - but with a more modern technology stack. 
&lt;/p&gt;
&lt;p&gt;
If we had everything hosted on GitHub, I think it&#8217;d make sense to add a line to the README that says &#8220;This project is no longer maintained&#8221;. However, since there&#8217;s a lot hosted on appfuse.org (with Confluence), it might not be that easy. Maybe it&#8217;s possible to export everything from Confluence to static HTML pages and host them somewhere with the same URLs so there&#8217;s not a bunch of 404s from shutting down the project. 
&lt;/p&gt;
&lt;p&gt;
Thank you for your contributions over the years. AppFuse was pretty cool back in the day, but now there&#8217;s better solutions. 
&lt;/p&gt;
&lt;p&gt;
Cheers, 
&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0&quot;&gt;
Matt&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
The good news is I&apos;ve worked out a deal with &lt;a href=&quot;http://contegix.com&quot;&gt;Contegix&lt;/a&gt; to keep appfuse.org up and running for the next year. The &lt;a href=&quot;http://demo.appfuse.org&quot;&gt;demos&lt;/a&gt;, &lt;a href=&quot;http://appfuse.org&quot;&gt;documentation&lt;/a&gt; and &lt;a href=&quot;http://issues.appfuse.org&quot;&gt;bug tracker&lt;/a&gt; will be available until April 30, 2017. Bamboo and FishEye will be discontinued in the next week since they&apos;re too memory intensive for a smaller server. I&apos;d love to figure out a way to export all the documentation from Confluence to Asciidoctor so everything can be on GitHub for years to come. However, there&apos;s something to be said for just letting a project fade away rather than holding onto nostalgic artifacts.&lt;/p&gt;
&lt;p&gt;On a related note, &lt;a href=&quot;https://community.oracle.com/community/java/javanet-forge-sunset&quot;&gt;Java.net will be closing in a year from today&lt;/a&gt;. AppFuse started &lt;a href=&quot;https://sourceforge.net/projects/struts/files/appfuse/&quot;&gt;on SourceForge&lt;/a&gt;, but moved to &lt;a href=&quot;http://appfuse.java.net&quot;&gt;appfuse.java.net&lt;/a&gt; shortly after. Today, the only thing left on java.net are AppFuse&apos;s mailing lists. I suppose it makes sense that both projects will cease to exist around the same time. &lt;/p&gt;
&lt;p&gt;AppFuse&apos;s &lt;a href=&quot;https://github.com/appfuse&quot;&gt;source code will remain on GitHub&lt;/a&gt;. I have no plans to delete it.&lt;/p&gt;
&lt;p&gt;Thanks to everyone that used and contributed to AppFuse over the years. It was a pretty wild and crazy ride from 2003-2007! &lt;img src=&quot;https://raibledesigns.com/images/smileys/smile.gif&quot; class=&quot;smiley&quot; alt=&quot;:)&quot; title=&quot;:)&quot; /&gt;&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_reduced</guid>
    <title>AppFuse, Reduced</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_reduced</link>
        <pubDate>Tue, 16 Dec 2014 06:03:31 -0700</pubDate>
    <category>Java</category>
    <category>java</category>
    <category>maven</category>
    <category>maintenance</category>
    <category>lessxml</category>
    <category>appfuse</category>
    <category>spring</category>
    <atom:summary type="html">&lt;p&gt;
In November, I had some time off between clients. To occupy my time, I exercised my body and brain a bit. I spent a couple hours a day exercising and a few hours a day working on
&lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;. AppFuse isn&apos;t used to start projects nearly as much as it once was. This makes sense since there&apos;s been a ton of innovation on the JVM and there&apos;s lots of
&lt;em&gt;get-started-quickly&lt;/em&gt; frameworks now. Among my favorites are Spring Boot, JHipster, Grails and Play.
&lt;p&gt;
    You can see that AppFuse&apos;s community activity has decreased quite a bit over the years by looking at its mailing list
    traffic.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://appfuse.markmail.org/&quot;
       title=&quot;AppFuse Mailing List Traffic, December 2014 by Matt Raible, on Flickr&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7525/15825430580_0531875e59.jpg&quot; width=&quot;500&quot; 
        alt=&quot;AppFuse Mailing List Traffic, December 2014&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    Even though there&apos;s not a lot of users talking on the mailing list, it still seems to get quite a few downloads from
    Maven Central.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://www.flickr.com/photos/mraible/16011987392&quot;
       title=&quot;AppFuse Maven Central Stats, November 2014 by Matt Raible, on Flickr&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7534/16011987392_442236433b.jpg&quot; width=&quot;500&quot; 
        alt=&quot;AppFuse Maven Central Stats, November 2014&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    I think the biggest value that AppFuse provides now is a learning tool for those who work on it. Also, it&apos;s a good place to
    show other developers how they can evolve with open source frameworks (e.g. Spring, Hibernate, JSF, Tapestry, Struts) over several years. Showing how
    we migrated to Spring MVC Test, for example, might be useful. The upcoming move to Spring Data instead of our
    Generic DAO solution might be interesting as well. 
&lt;/p&gt;
&lt;p&gt;
    Regardless of whether AppFuse is used a lot or not, it should be easy to maintain. Over the several weeks, I made some
    opinionated changes and achieved some pretty good progress on simplifying things and making the project easier to
    maintain. The previous structure has a lot of duplicate versions, properties and plugin configurations between
    different projects. I was able to leverage Maven&apos;s inheritance model to make a number of improvements:
&lt;/p&gt;</atom:summary>        <description>&lt;p&gt;
In November, I had some time off between clients. To occupy my time, I exercised my body and brain a bit. I spent a couple hours a day exercising and a few hours a day working on
&lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;. AppFuse isn&apos;t used to start projects nearly as much as it once was. This makes sense since there&apos;s been a ton of innovation on the JVM and there&apos;s lots of
&lt;em&gt;get-started-quickly&lt;/em&gt; frameworks now. Among my favorites are Spring Boot, JHipster, Grails and Play.
&lt;p&gt;
    You can see that AppFuse&apos;s community activity has decreased quite a bit over the years by looking at its mailing list
    traffic.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;http://appfuse.markmail.org/&quot;
       title=&quot;AppFuse Mailing List Traffic, December 2014 by Matt Raible, on Flickr&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7525/15825430580_0531875e59.jpg&quot; width=&quot;500&quot; 
        alt=&quot;AppFuse Mailing List Traffic, December 2014&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    Even though there&apos;s not a lot of users talking on the mailing list, it still seems to get quite a few downloads from
    Maven Central.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
    &lt;a href=&quot;https://www.flickr.com/photos/mraible/16011987392&quot;
       title=&quot;AppFuse Maven Central Stats, November 2014 by Matt Raible, on Flickr&quot;&gt;&lt;img
        src=&quot;https://farm8.staticflickr.com/7534/16011987392_442236433b.jpg&quot; width=&quot;500&quot; 
        alt=&quot;AppFuse Maven Central Stats, November 2014&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
    I think the biggest value that AppFuse provides now is a learning tool for those who work on it. Also, it&apos;s a good place to
    show other developers how they can evolve with open source frameworks (e.g. Spring, Hibernate, JSF, Tapestry, Struts) over several years. Showing how
    we migrated to Spring MVC Test, for example, might be useful. The upcoming move to Spring Data instead of our
    Generic DAO solution might be interesting as well. 
&lt;/p&gt;
&lt;p&gt;
    Regardless of whether AppFuse is used a lot or not, it should be easy to maintain. Over the several weeks, I made some
    opinionated changes and achieved some pretty good progress on simplifying things and making the project easier to
    maintain. The previous structure has a lot of duplicate versions, properties and plugin configurations between
    different projects. I was able to leverage Maven&apos;s inheritance model to make a number of improvements:
&lt;/p&gt;
&lt;ol&gt;
    &lt;li&gt;Changed AppFuse&apos;s parent to be based on the &lt;a
        href=&quot;http://www.infoq.com/news/2014/07/springio-platform&quot;&gt;Spring IO Platform&lt;/a&gt;. This project
        is a dependency manager that defines version numbers for open source projects that work well with Spring.
    &lt;/li&gt;
    &lt;li&gt;Defined plugins, their versions and configurations in &lt;code&gt;&amp;lt;pluginManagement&gt;&lt;/code&gt;.&lt;/li&gt;
    &lt;li&gt;Defined dependencies, their versions and exclusions in &lt;code&gt;&amp;lt;dependencyManagement&gt;&lt;/code&gt;.&lt;/li&gt;
    &lt;li&gt;Simplified archetypes so new projects have minimal dependencies. For example, here&apos;s a basic project&apos;s &lt;code&gt;pom.xml&lt;/code&gt;:
    &lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;project xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd&quot;&amp;gt;

    &amp;lt;modelVersion&amp;gt;4.0.0&amp;lt;/modelVersion&amp;gt;
    &amp;lt;groupId&amp;gt;com.company&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;springmvc-project&amp;lt;/artifactId&amp;gt;
    &amp;lt;packaging&amp;gt;war&amp;lt;/packaging&amp;gt;
    &amp;lt;version&amp;gt;1.0-SNAPSHOT&amp;lt;/version&amp;gt;
    &amp;lt;name&amp;gt;AppFuse Spring MVC Application&amp;lt;/name&amp;gt;

    &amp;lt;parent&amp;gt;
        &amp;lt;groupId&amp;gt;org.appfuse&amp;lt;/groupId&amp;gt;
        &amp;lt;artifactId&amp;gt;appfuse-web&amp;lt;/artifactId&amp;gt;
        &amp;lt;version&amp;gt;3.5.0-SNAPSHOT&amp;lt;/version&amp;gt;
    &amp;lt;/parent&amp;gt;

    &amp;lt;build&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;de.juplo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;hibernate4-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;/plugin&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;dbunit-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;/plugin&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;build-helper-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/build&amp;gt;

    &amp;lt;dependencies&amp;gt;
        &amp;lt;dependency&amp;gt;
            &amp;lt;groupId&amp;gt;org.appfuse&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;appfuse-${web.framework}&amp;lt;/artifactId&amp;gt;
            &amp;lt;version&amp;gt;${appfuse.version}&amp;lt;/version&amp;gt;
            &amp;lt;type&amp;gt;pom&amp;lt;/type&amp;gt;
        &amp;lt;/dependency&amp;gt;
    &amp;lt;/dependencies&amp;gt;

    &amp;lt;properties&amp;gt;
        &amp;lt;amp.genericCore&amp;gt;true&amp;lt;/amp.genericCore&amp;gt;
        &amp;lt;amp.fullSource&amp;gt;false&amp;lt;/amp.fullSource&amp;gt;
        &amp;lt;dao.framework&amp;gt;hibernate&amp;lt;/dao.framework&amp;gt;
        &amp;lt;db.name&amp;gt;mydatabase&amp;lt;/db.name&amp;gt;
        &amp;lt;web.framework&amp;gt;spring&amp;lt;/web.framework&amp;gt;

        &amp;lt;!-- Framework/Plugin versions --&amp;gt;
        &amp;lt;appfuse.version&amp;gt;3.5.0-SNAPSHOT&amp;lt;/appfuse.version&amp;gt;
        &amp;lt;java.version&amp;gt;1.7&amp;lt;/java.version&amp;gt;
    &amp;lt;/properties&amp;gt;

    &amp;lt;profiles&amp;gt;
        &amp;lt;profile&amp;gt;
            &amp;lt;id&amp;gt;itest&amp;lt;/id&amp;gt;
            &amp;lt;build&amp;gt;
                &amp;lt;plugins&amp;gt;
                    &amp;lt;plugin&amp;gt;
                        &amp;lt;groupId&amp;gt;org.codehaus.cargo&amp;lt;/groupId&amp;gt;
                        &amp;lt;artifactId&amp;gt;cargo-maven2-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;/plugin&amp;gt;
                    &amp;lt;plugin&amp;gt;
                        &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                        &amp;lt;artifactId&amp;gt;webtest-maven-plugin&amp;lt;/artifactId&amp;gt;
                    &amp;lt;/plugin&amp;gt;
                &amp;lt;/plugins&amp;gt;
            &amp;lt;/build&amp;gt;
        &amp;lt;/profile&amp;gt;
    &amp;lt;/profiles&amp;gt;

    &amp;lt;reporting&amp;gt;
        &amp;lt;plugins&amp;gt;
            &amp;lt;plugin&amp;gt;
                &amp;lt;groupId&amp;gt;org.codehaus.mojo&amp;lt;/groupId&amp;gt;
                &amp;lt;artifactId&amp;gt;webtest-maven-plugin&amp;lt;/artifactId&amp;gt;
            &amp;lt;/plugin&amp;gt;
        &amp;lt;/plugins&amp;gt;
    &amp;lt;/reporting&amp;gt;
&amp;lt;/project&amp;gt;
&lt;/pre&gt;
&lt;style type=&quot;text/css&quot;&gt;
    span.diffstat {
        white-space: nowrap;
        text-align: right;
        font-family: Helvetica, arial, freesans, clean, sans-serif, &quot;Segoe UI Emoji&quot;, &quot;Segoe UI Symbol&quot;;
        color: #666;
        font-weight: bold;
        font-size: 12px;
        cursor: default;
    }

    span.diffstat .lines-added, span.diffstat .lines-deleted {
        display: inline-block;
        margin-left: 3px;
        font-weight: bold;
    }
&lt;/style&gt;
&lt;p&gt;
    The pull request for these changes says it all:
&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;https://github.com/appfuse/appfuse/pull/20&quot;&gt;AppFuse&lt;/a&gt; &lt;span class=&quot;diffstat&quot;&gt;
          &lt;span class=&quot;lines-added&quot; style=&quot;color: #55a532&quot;&gt;
            &lt;span class=&quot;diffstat-icon&quot;&gt;+&lt;/span&gt;4,822
          &lt;/span&gt;
          &lt;span class=&quot;lines-deleted&quot; style=&quot;color: #bd2c00&quot;&gt;
            &lt;span class=&quot;diffstat-icon&quot;&gt;-&lt;/span&gt;14,369
          &lt;/span&gt;
        &lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;https://github.com/appfuse/appfuse-light/pull/1&quot;&gt;AppFuse Light&lt;/a&gt; &lt;span class=&quot;diffstat&quot;&gt;
              &lt;span class=&quot;lines-added&quot; style=&quot;color: #55a532&quot;&gt;
                &lt;span class=&quot;diffstat-icon&quot;&gt;+&lt;/span&gt;776
              &lt;/span&gt;
              &lt;span class=&quot;lines-deleted&quot; style=&quot;color: #bd2c00&quot;&gt;
                &lt;span class=&quot;diffstat-icon&quot;&gt;-&lt;/span&gt;4,687
              &lt;/span&gt;

            &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That&apos;s right, I was able to eliminate a good chunk of code without affecting any of AppFuse&apos;s functionality&lt;sup&gt;&lt;a
    href=&quot;http://raibledesigns.com/rd/entry/appfuse_reduced#footnote1&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;.
    I think we can all agree that less code == easier maintenance. This theme will continue as we work on future
    releases.
&lt;/p&gt;

&lt;p&gt;Other improvements include migrating all tests to use JUnit4, integrating Spring MVC Test, and configuring the
    surefire plugin to run tests in parallel. I also The &lt;a href=&quot;http://mojo.codehaus.org/build-helper-maven-plugin/&quot;&gt;build-helper-maven-plugin&lt;/a&gt;
    is now used to find open ports for Cargo to run and a lot of testing was done to ensure you can build/test multiple
    AppFuse-derived projects at the same time. Finally, I migrated to the &lt;a href=&quot;http://juplo.de/hibernate4-maven-plugin/&quot;&gt;hibernate4-maven-plugin&lt;/a&gt; and upgraded to Tapestry 5.4.&lt;/p&gt;

&lt;p&gt;In the next version of AppFuse, I plan to remove as
    much XML as possible - moving all of the configuration to Spring&apos;s JavaConfig. We&apos;ll also be moving to Java 8 as a
    minimum. I&apos;m even considering getting rid of all the pom.xml files in favor of another build language that requires
    less code. &lt;/p&gt;
&lt;p&gt;In other words, the upcoming 3.5 release will be the last release that supports Java 7 and uses Spring&apos;s XML for configuration. AppFuse 4.0 will strive for #NoXML.
   &lt;a href=&quot;http://appfuse.org/display/APF/Roadmap&quot;&gt;The project&apos;s roadmap&lt;/a&gt; has more details on additional
    hopes and dreams.&lt;/p&gt;

&lt;p&gt;We&apos;d love to hear your feedback on these change. Do you like the simplification theme? Are you OK with having AppFuse
    as a parent in your projects?
&lt;/p&gt;
&lt;p class=&quot;footnotes&quot; style=&quot;border-top: 1px dotted silver; padding-top: 5px; font-size: .9em&quot;&gt;
    &lt;a name=&quot;footnote1&quot;&gt;&lt;/a&gt;1. For project
    and code stats, see &lt;a href=&quot;https://www.openhub.net/p/appfuse/analyses/latest/languages_summary&quot;&gt;AppFuse on Open
    Hub&lt;/a&gt;.
&lt;/p&gt;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_3_0_released</guid>
    <title>AppFuse 3.0 Released!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_3_0_released</link>
        <pubDate>Mon, 23 Dec 2013 14:31:15 -0700</pubDate>
    <category>Java</category>
    <category>spring</category>
    <category>primefaces</category>
    <category>wicket</category>
    <category>java</category>
    <category>bootstrap3</category>
    <category>maven</category>
    <category>spring4</category>
    <category>appfuse</category>
            <description>&lt;p&gt;
&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//static.appfuse.org/images/appfuse-icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 3.0. This release is AppFuse&apos;s first release as a &lt;a href=&quot;http://raibledesigns.com/rd/entry/happy_10_year_appfuse&quot;&gt;10-year old&lt;/a&gt; and includes a whole slew of improvements.&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Java 7 and Maven 3 are now minimal requirements&lt;/li&gt;
    &lt;li&gt;Replaced MyFaces and Tomahawk with PrimeFaces for JSF&lt;br&gt;
        &lt;ul&gt;
            &lt;li&gt;Removed SiteMesh in favor of JSF&apos;s built-in layout support&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/li&gt;
    &lt;li&gt;Added Wicket support&lt;/li&gt;
    &lt;li&gt;Migrated from jMock to Mockito for tests&lt;/li&gt;
    &lt;li&gt;Integrated wro4j and WebJars&lt;/li&gt;
    &lt;li&gt;Migrated to Bootstrap 3 and defaulted to Bootswatch&apos;s &lt;a href=&quot;http://bootswatch.com/spacelab/&quot;&gt;Spacelab
        theme&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In addition, this release includes upgrades to all dependencies to bring them up-to-date with their latest
    releases. Most notable are Spring 4, Spring Security 3.2 and Bootstrap 3. For more details on specific changes
    see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+3.0.0&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;quote&quot;&gt;&lt;strong&gt;What is AppFuse?&lt;/strong&gt;&lt;br&gt;

    AppFuse is a full-stack framework for building web applications on the JVM. It was
    originally developed to eliminate the ramp-up time when building new web applications. Over
    the years, it has matured into a very testable and secure system for creating Java-based
    webapps.
&lt;/p&gt;
&lt;p&gt;Demos for this release can be viewed at &lt;a href=&quot;http://demo.appfuse.org/&quot;&gt;http://demo.appfuse.org&lt;/a&gt;. Please see
    the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; style=&quot;font-weight: bold&quot;&gt;QuickStart Guide&lt;/a&gt; to
    get started with this release. &lt;/p&gt;

&lt;p&gt;If you have questions about AppFuse, please read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot;&gt;FAQ&lt;/a&gt; or join the
    &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;user mailing list&lt;/a&gt;. If you find any
    issues, please report them on the users mailing list. You can also post them to &lt;a href=&quot;http://stackoverflow.com/questions/tagged/appfuse&quot;&gt;Stack Overflow&lt;/a&gt; with the &quot;appfuse&quot; tag.&lt;/p&gt;

&lt;p&gt;Thanks to everyone for their help contributing patches, writing documentation and participating on the mailing
    lists.&lt;/p&gt;

&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;We greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot;&gt;our
    sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;,
    &lt;a href=&quot;http://contegix.com/&quot;&gt;Contegix&lt;/a&gt;, and &lt;a href=&quot;http://www.jetbrains.com/&quot;&gt;JetBrains&lt;/a&gt;.
    Atlassian and Contegix are especially awesome:
    &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot;&gt;Atlassian has donated licenses to all
        its products and Contegix has donated an entire server&lt;/a&gt; to the AppFuse project. &lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/happy_10_year_appfuse</guid>
    <title>Happy 10 Year AppFuse!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/happy_10_year_appfuse</link>
        <pubDate>Fri, 5 Apr 2013 08:56:45 -0600</pubDate>
    <category>Java</category>
    <category>appfuse</category>
    <category>anniversary</category>
    <category>10years</category>
            <description>&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//raw.github.com/appfuse/appfuse/master/www/logo/appfuse_72_transparent.gif&quot; width=&quot;72&quot; height=&quot;72&quot; class=&quot;picture&quot; /&gt;&lt;/a&gt;
10 years ago yesterday, I released the &lt;a href=&quot;http://raibledesigns.com/rd/entry/announce_struts_resume_and_appfuse&quot;&gt;first version of AppFuse&lt;/a&gt;. It started with XDoclet generating ActionForms from POJOs and became very popular for Struts developers that wanted to use Hibernate. The project&apos;s popularity peaked in 2006, as you can see from the mailing list traffic below.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://appfuse.markmail.org&quot; title=&quot;AppFuse Mailing List Traffic&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8251/8621164287_0acb4af5de.jpg&quot; width=&quot;500&quot; height=&quot;162&quot; alt=&quot;AppFuse Mailing List Traffic&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;It&apos;s possible the decrease in traffic is because we re-wrote everything to be based on Maven. It&apos;s also possible it was because of more attractive full-stack frameworks like &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_vs_grails_vs_rails&quot;&gt;Grails and Rails&lt;/a&gt;. However, the real reason is likely that I stopped working on it all the time due to &lt;span style=&quot;text-decoration: line-through&quot;&gt;getting a divorce&lt;/span&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/5_years&quot;&gt;becoming an awesome dad&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Below is a timeline of how the project evolved over its first 4 years.&lt;/p&gt;
&lt;p style=&quot;text-align: center; background: white&quot;&gt;
&lt;a href=&quot;http://static.raibledesigns.com/repository/images/appfuse-history.png&quot; rel=&quot;lightbox[appfuse-10yr]&quot; title=&quot;AppFuse History: 2003 - 2007&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/appfuse-history.png&quot; alt=&quot;AppFuse History: 2003 - 2007&quot; width=&quot;500&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;AppFuse has been a great project for me to work on and it&apos;s been a large source of my knowledge about Java, Web Frameworks, Spring, Hibernate - as well as build systems like Ant and Maven. We started with CVS, moved to SVN and now we&apos;re &lt;a href=&quot;http://github.com/appfuse&quot;&gt;on GitHub&lt;/a&gt;. We&apos;ve experienced &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_converted_to_maven&quot;&gt;migrating from Tapestry 4 to Tapestry 5&lt;/a&gt; (thanks Serge Eby!), upgrading to &lt;a href=&quot;http://raibledesigns.com/rd/entry/upgrading_to_jsf_2&quot;&gt;JSF 2&lt;/a&gt; and enjoyed the backwards compatibility of Spring and Struts 2 throughout the years. We&apos;ve also added REST support, a Web Services archetype and kept up with the latest Spring and Hibernate releases.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://appfuse.org/download/attachments/84/appfuse-history2.png?version=1&amp;amp;modificationDate=1356633078000&quot; rel=&quot;lightbox[appfuse-10yr]&quot; title=&quot;AppFuse History: 2007 - 2013&quot;&gt;&lt;img src=&quot;//appfuse.org/download/attachments/84/appfuse-history2.png?version=1&amp;amp;modificationDate=1356633078000&quot; width=&quot;500&quot; alt=&quot;AppFuse History: 2007 - 2013&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Last year, we &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_2_1_released&quot;&gt;added Bootstrap and jQuery&lt;/a&gt; as foundational front-end frameworks. For our next release, we&apos;re &lt;a href=&quot;http://raibledesigns.com/rd/entry/switching_appfuse_from_myfaces_to&quot;&gt;switching to PrimeFaces&lt;/a&gt;, adding Wicket and changing from jMock to Mockito. Most of these changes are already in source control, we just need to polish them up a bit and add &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+Maven+Plugin&quot; title=&quot;AppFuse Maven Plugin&quot;&gt;AMP&lt;/a&gt; support. I hope to release 3.0 &lt;a href=&quot;http://www.flickr.com/photos/mraible/sets/72157633155884796/&quot;&gt;before the bus is done&lt;/a&gt;. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;)&quot; title=&quot;;)&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Thanks to all the enthusiastic users of and contributors to AppFuse over the years. It&apos;s been a great ride! </description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/integrating_gwt_into_appfuse</guid>
    <title>Integrating GWT into AppFuse</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/integrating_gwt_into_appfuse</link>
        <pubDate>Thu, 7 Mar 2013 18:49:28 -0700</pubDate>
    <category>Java</category>
    <category>appfuse</category>
    <category>gwt</category>
            <description>&lt;a href=&quot;https://developers.google.com/web-toolkit/images/gwt-logo.png&quot;&gt;&lt;img src=&quot;//developers.google.com/web-toolkit/images/gwt-logo.png&quot; class=&quot;picture&quot;  height=&quot;100&quot; width=&quot;100&quot;&gt;&lt;/a&gt;
I&apos;ve been interested in integrating &lt;a href=&quot;https://developers.google.com/web-toolkit/&quot;&gt;GWT&lt;/a&gt; into &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; ever since &lt;a href=&quot;http://raibledesigns.com/rd/entry/gwt_and_appfuse&quot;&gt;I blogged about it 4 years ago&lt;/a&gt;. A few months after that post, I wrote about &lt;a href=&quot;http://raibledesigns.com/rd/entry/enhancing_evite_com_with_gwt&quot;&gt;Enhancing Evite.com with GWT and Grails&lt;/a&gt;. After Evite, I had a gig near Boston where I developed with GXT for the remainder of the year. When all was said and done, I ended up spending a year with GWT and really enjoyed my experience. I haven&apos;t used it much since.&lt;/p&gt;
&lt;p&gt;GWT is &lt;a href=&quot;http://appfuse.org/display/APF/Roadmap&quot;&gt;scheduled to be integrated into AppFuse&lt;/a&gt; in version 4.0. That&apos;s quite a ways off. The good news is you might not have to wait that long, thanks to &lt;a href=&quot;https://github.com/ivangsa&quot;&gt;Iv&#225;n Garc&#237;a Sainz-Aja&lt;/a&gt;. Iv&#225;n let us know about his work a couple weeks ago in an &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/Creating-a-new-archetype-td4656359.html&quot;&gt;email to the appfuse-dev&lt;/a&gt; mailing list.&lt;/p&gt;
&lt;div class=&quot;quote&quot;&gt;
&lt;p&gt;
It&apos;s still work in progress but it has already most of AppFuse functionality.. 
&lt;/p&gt;&lt;p&gt;
If you want to give it a try 
&lt;/p&gt;&lt;p&gt;
&lt;a href=&quot;https://github.com/ivangsa/appfuse.git&quot;&gt;https://github.com/ivangsa/appfuse.git&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
the quickest way to have a go would be&lt;/p&gt;
&lt;pre&gt;
web/gwt&gt; mvn -P gwtDebug -Dgwt.inplace=true gwt:compile jetty:run  
&lt;/pre&gt;
&lt;p&gt;
at the moment it still requires this fork of gwt-bootstrap to be compiled first 
&lt;/p&gt;&lt;p&gt;
&lt;a href=&quot;https://github.com/ivangsa/gwt-bootstrap.git&quot;&gt;https://github.com/ivangsa/gwt-bootstrap.git&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;
It needs a lot of testing yet but it&apos;s getting quite there 
&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;As you can imagine, I was very excited to hear about Iv&#225;n&apos;s work. So I cloned his repo, built gwt-bootstrap locally and checked it out. Functionality wise, it was great! However, when I dug into the source code, I found a whole lotta code. 
&lt;/p&gt;
&lt;p&gt;
To see how the GWT flavor compared to the other implementations in AppFuse, I &lt;a href=&quot;https://gist.github.com/mraible/5033218&quot;&gt;created a cloc report&lt;/a&gt; on the various web frameworks in AppFuse. I&apos;m sure these reports could be adjusted to be more accurate, but I believe they give a good general overview. I posted some graphs that displays my findings in visual form.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;

&lt;a href=&quot;http://farm9.staticflickr.com/8090/8538497066_be60cb73da_o.png&quot; title=&quot;Lines of Java&quot; rel=&quot;lightbox[appfuse-loc]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8090/8538497066_4f2a6ff71e_m.jpg&quot; width=&quot;240&quot; height=&quot;189&quot; alt=&quot;Lines of Java&quot; style=&quot;border: 1px solid black&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm9.staticflickr.com/8235/8537391497_deaa49c22d_o.png&quot; title=&quot;Number of Files by mraible, on Flickr&quot; rel=&quot;lightbox[appfuse-loc]&quot;&gt;&lt;img src=&quot;//farm9.staticflickr.com/8235/8537391497_3bbafe2383_m.jpg&quot; width=&quot;240&quot; height=&quot;189&quot; alt=&quot;Number of Files&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;&gt;&lt;/a&gt;

&lt;/p&gt;
&lt;p&gt;When I sent this to the mailing list, Ivan &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/Creating-a-new-archetype-tt4656359.html#a4656374&quot;&gt;responded that it was a lot of code&lt;/a&gt; and estimated &lt;em&gt;12 new files&lt;/em&gt; would be needed to &lt;abbr title=&quot;Create, Retrieve, Update, Delete&quot;&gt;CRUD&lt;/a&gt; an entity. This sure seems like a lot to me, but he &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/GWT-RESTFull-backend-tt4656418.html&quot;&gt;defended this yesterday&lt;/a&gt; and noted that his implementation follows many of GWT&apos;s latest best 
practices: MVP pattern, Activities and Places, EventBus, Gin and Guice. He also shared a &lt;a href=&quot;https://github.com/ivangsa/appfuse/wiki&quot;&gt;wiki page&lt;/a&gt; with explanations and diagrams of how things work.&lt;/p&gt;
&lt;p&gt;The reason I&apos;m writing this post is to get more feedback on this implementation. First of all, &lt;em&gt;does GWT really require this much code&lt;/em&gt;? Secondly, are there other GWT implementations that reduce a lot of the boilerplate? &lt;a href=&quot;https://code.google.com/p/smartgwt/&quot;&gt;SmartGWT&lt;/a&gt;, &lt;a href=&quot;https://vaadin.com/home&quot;&gt;Vaadin&lt;/a&gt;* and &lt;a href=&quot;http://www.jboss.org/errai&quot;&gt;Errai&lt;/a&gt; come to mind. 
&lt;/p&gt;
&lt;p&gt;If you were starting a new GWT project and using AppFuse, how would &lt;em&gt;you&lt;/em&gt; want it implemented?&lt;/p&gt;
&lt;p style=&quot;font-size: .9em; border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;* Vaadin 7 claims it &lt;a href=&quot;http://www.infoq.com/news/2013/02/vaadin-7&quot;&gt;can be used as a drop-in replacement for GWT&lt;/a&gt;. I tried &lt;a href=&quot;https://gist.github.com/mraible/5113636&quot;&gt;replacing the gwt-servlet and gwt-user dependencies&lt;/a&gt; with Vaadin&apos;s, but it &lt;a href=&quot;https://gist.github.com/mraible/5113607&quot;&gt;didn&apos;t work&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/switching_appfuse_from_myfaces_to</guid>
    <title>Switching AppFuse from MyFaces to PrimeFaces</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/switching_appfuse_from_myfaces_to</link>
        <pubDate>Wed, 6 Feb 2013 12:19:34 -0700</pubDate>
    <category>Java</category>
    <category>primefaces</category>
    <category>appfuse</category>
    <category>myfaces</category>
    <category>jsf</category>
            <description>When describing &lt;a href=&quot;http://raibledesigns.com/rd/entry/why_the_bias_against_jsf&quot;&gt;my bias against JSF&lt;/a&gt; back in November, I wrote:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
... there&apos;s a lot of folks praising JSF 2 (and &lt;a href=&quot;http://primefaces.org/&quot;&gt;PrimeFaces&lt;/a&gt; moreso). That&apos;s why I&apos;ll be integrating it (or merging your pull request) into the 2.3 release of AppFuse. Since PrimeFaces contains a Bootstrap theme, I hope this is a pleasant experience and my overall opinion of JSF improves.
&lt;/p&gt;
&lt;p&gt;Shortly after the &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_2_1_released&quot;&gt;AppFuse 2.2.1 release&lt;/a&gt; in December, Gilberto Andrade &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1351&quot;&gt;contributed a sample project&lt;/a&gt; that used &lt;a href=&quot;http://javaserverfaces.java.net/&quot;&gt;Mojarra&lt;/a&gt; (the JSF RI) and &lt;a href=&quot;http://primefaces.org&quot;&gt;PrimeFaces&lt;/a&gt; instead of &lt;a href=&quot;http://myfaces.apache.org/&quot;&gt;MyFaces&lt;/a&gt; and its  &lt;a href=&quot;http://myfaces.apache.org/tomahawk/index.html&quot;&gt;Tomahawk&lt;/a&gt; components. Last week, I spent a few hours integrating Gilberto&apos;s changes into AppFuse&apos;s master branch. You can see all the changes I made (which include a Jetty plugin upgrade and some cleanup) in &lt;a href=&quot;http://source.appfuse.org/cru/CR-3&quot;&gt;this Crucible review&lt;/a&gt;. Feel free to leave comments on ask questions in the review itself.&lt;/p&gt;
&lt;p&gt;
The first thing I noticed when integrating PrimeFaces is you have to add a custom repository in order to get its artifacts via Maven.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;repositories&amp;gt;
    &amp;lt;repository&amp;gt;
        &amp;lt;id&amp;gt;prime-repo&amp;lt;/id&amp;gt;
        &amp;lt;name&amp;gt;Prime Repo&amp;lt;/name&amp;gt;
        &amp;lt;url&amp;gt;http://repository.primefaces.org&amp;lt;/url&amp;gt;
    &amp;lt;/repository&amp;gt;
&amp;lt;/repositories&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This is unfortunate since all of AppFuse&apos;s other dependencies can be found in Maven Central. It means that if you&apos;re using a JSF archetype, the PrimeFaces repo will be checked for artifacts first, causing an unnecessary slowdown in artifact resolution. I hope the PrimeFaces developers fix this soon.&lt;/p&gt;
&lt;p&gt;While integrating these two frameworks, I ran into a number of issues.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/switching_appfuse_from_myfaces_to#listener&quot;&gt;An IllegalStateException on startup when using &quot;mvn jetty:run&quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/switching_appfuse_from_myfaces_to#button&quot;&gt;Conditionally rendering a button disables its click-ability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/switching_appfuse_from_myfaces_to#bootstrap&quot;&gt;The PrimeFaces Bootstrap theme 404s on some images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/switching_appfuse_from_myfaces_to#webtest&quot;&gt;Canoo WebTest doesn&apos;t work with fileUpload nor to set checkbox values&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/switching_appfuse_from_myfaces_to#javax.faces.resource&quot;&gt;PrimeFaces resources served up at /javax.faces.resource/* not found&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;listener&quot;&gt;&lt;strong&gt;An IllegalStateException on startup when using &quot;mvn jetty:run&quot;&lt;/strong&gt;&lt;br/&gt;The first issue I encountered was that I was unable to run the app in Jetty. It worked fine in Tomcat but I got the following error in Jetty:
&lt;/p&gt;
&lt;pre&gt;
2013-01-31 22:28:07.683:WARN:/:unavailable
java.lang.IllegalStateException: Application was not properly initialized at startup, could not find Factory: javax.faces.context.FacesContextFactory
at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:951)
at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:316)
at javax.faces.webapp.FacesServlet.init(FacesServlet.java:302)
at org.eclipse.jetty.servlet.ServletHolder.initServlet(ServletHolder.java:492)
at org.eclipse.jetty.servlet.ServletHolder.doStart(ServletHolder.java:312)
&lt;/pre&gt;
&lt;p&gt;I &lt;a href=&quot;http://stackoverflow.com/questions/7886035/could-not-find-factory-javax-faces-context-facescontextfactory/7889899&quot;&gt;found the fix for this on  Stack Overflow&lt;/a&gt; and added the following listener to my web.xml to solve it.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;listener&amp;gt;
    &amp;lt;listener-class&amp;gt;com.sun.faces.config.ConfigureListener&amp;lt;/listener-class&amp;gt;
&amp;lt;/listener&amp;gt;
&lt;/pre&gt;
&lt;p id=&quot;button&quot;&gt;&lt;strong&gt;Conditionally rendering a button disables its click-ability&lt;/strong&gt;&lt;br/&gt;
The next thing I noticed was the Delete button didn&apos;t work when editing a user. It was hidden correctly when adding a user, but clicking on it to delete a user simply refreshes the page. Below is the code I used successfully with MyFaces. For some reason, this doesn&apos;t work with PrimeFaces.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;c:if test=&quot;${not empty userForm.user.id}&quot;&amp;gt;
&amp;lt;h:commandButton value=&quot;#{text&amp;#91;&apos;button.delete&apos;&amp;#93;}&quot; action=&quot;#{userForm.delete}&quot;
    styleClass=&quot;btn&quot; onclick=&quot;return confirmMessage(msgDelConfirm)&quot;/&amp;gt;
&amp;lt;/c:if&amp;gt;
&lt;/pre&gt;
&lt;p&gt;I also tried the following, but no dice. This is currently an &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1366&quot;&gt;open issue&lt;/a&gt;.
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;h:commandButton rendered=&quot;${not empty userForm.user.id}&quot; value=&quot;#{text&amp;#91;&apos;button.delete&apos;&amp;#93;}&quot; 
    action=&quot;#{userForm.delete}&quot; styleClass=&quot;btn&quot; onclick=&quot;return confirmMessage(msgDelConfirm)&quot;/&amp;gt;
&lt;/pre&gt;
&lt;p id=&quot;bootstrap&quot;&gt;
&lt;strong&gt;The PrimeFaces Bootstrap theme 404s on some images&lt;/strong&gt;&lt;br/&gt;
After integrating PrimeFaces&apos; Bootstrap theme, the following error shows up in server logs.
&lt;/p&gt;
&lt;pre&gt;
[INFO] [talledLocalContainer] Feb 02, 2013 10:40:25 PM com.sun.faces.application.resource.ResourceHandlerImpl logMissingResource
[WARNING] [talledLocalContainer] WARNING: JSF1064: Unable to find or serve resource, images/ui-bg_highlight-hard_70_000000_1x100.png, from library, primefaces-bootstrap.
&lt;/pre&gt;
&lt;p&gt;This seems to have &lt;a href=&quot;http://forum.primefaces.org/viewtopic.php?f=9&amp;t=19250&amp;start=10&quot;&gt;happened before in previous releases&lt;/a&gt; and is currently an &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1367&quot;&gt;open issue&lt;/a&gt;. 
&lt;/p&gt;
&lt;p id=&quot;webtest&quot;&gt;&lt;strong&gt;Canoo WebTest doesn&apos;t work with fileUpload nor to set checkbox values&lt;/strong&gt;&lt;br/&gt;
We use &lt;a href=&quot;http://webtest.canoo.com/webtest/manual/WebTestHome.html&quot;&gt;Canoo WebTest&lt;/a&gt; to run integration tests on the UI in AppFuse. For some reason, performing file uploads and setting checkbox values works fine with MyFaces/Tomahawk, but not with Mojarra/PrimeFaces. I&apos;m not sure if this is caused by the JSF core or the component library, but it &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1368&quot;&gt;remains an open issue&lt;/a&gt;. For now, I&apos;ve just commented out the parts of tests that used to do this.
&lt;/p&gt;
&lt;p&gt;On a related note, getting the real path of a resource from the ServletContext worked fine before the switch, but results in a null value now.&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
String uploadDir = getServletContext().getRealPath(&quot;/resources&quot;) + &quot;/&quot; + request.getRemoteUser() + &quot;/&quot;;
&lt;/pre&gt;
&lt;p id=&quot;javax.faces.resource&quot;&gt;&lt;strong&gt;PrimeFaces resources served up at /javax.faces.resource/* not found&lt;/strong&gt;&lt;br/&gt;While I didn&apos;t have problems with this in AppFuse, I did encounter it in AppFuse Light. I don&apos;t know why there was a difference between the two, but it turned out to be caused by the UrlRewriteFilter and my desire for &lt;a href=&quot;http://raibledesigns.com/rd/entry/extensionless_urls_in_java_web&quot;&gt;extensionless URLs&lt;/a&gt;. The outbound-rule to strip .xhtml from URLs was the culprit. Adding a condition to it solved the problem. Yeah, the condition seems backwards, but it works.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;outbound-rule match-type=&quot;regex&quot;&amp;gt;
    &amp;lt;condition type=&quot;query-string&quot; operator=&quot;equal&quot;&amp;gt;ln=primefaces&amp;lt;/condition&amp;gt;
    &amp;lt;from&amp;gt;^(.*)\.xhtml(\?.*)?$&amp;lt;/from&amp;gt;
    &amp;lt;to last=&quot;false&quot;&amp;gt;$1$2&amp;lt;/to&amp;gt;
&amp;lt;/outbound-rule&amp;gt;
&lt;/pre&gt;
&lt;p id=&quot;summary&quot;&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br/&gt;
The initial switch to Mojarra/PrimeFaces was pretty easy thanks to Gilberto&apos;s sample project. However, the small issues encountered after that turned out to be quite frustrating and you can see that several are still not fixed. I guess it just goes to show that not all web frameworks are perfect. Hopefully we&apos;ll get these minor issues fixed before the next release. In the meantime, you can checkout the updated demos for &lt;a href=&quot;http://demo.appfuse.org/appfuse-jsf&quot;&gt;AppFuse JSF&lt;/a&gt; and &lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-jsf&quot;&gt;AppFuse Light JSF&lt;/a&gt;.
 </description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_light_2_2_1</guid>
    <title>AppFuse Light 2.2.1 Released!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_light_2_2_1</link>
        <pubDate>Thu, 24 Jan 2013 19:43:20 -0700</pubDate>
    <category>Java</category>
    <category>hibernate</category>
    <category>spring</category>
    <category>java</category>
    <category>appfuse</category>
    <category>security</category>
    <category>appfuse-light</category>
    <category>maven</category>
            <description>In December, the &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; Team &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_2_1_released&quot;&gt;released 2.2.1&lt;/a&gt;. Right before that release, I decided to wait on enhancing its &quot;light&quot; modules, a.k.a. &lt;a href=&quot;https://github.com/appfuse/appfuse-light&quot;&gt;AppFuse Light&lt;/a&gt;. I&apos;m glad I did, because it took some effort to get jQuery and Bootstrap integrated, as well as to make it more secure. 
&lt;/p&gt;
&lt;p&gt;
The good news is AppFuse Light 2.2.1 is released and it&apos;s sitting out on the &lt;a href=&quot;http://search.maven.org/#search%7Cga%7C1%7Cappfuse-light&quot;&gt;Central Repository&lt;/a&gt;. This release is a refactoring of all  archetypes to be up-to-date with the AppFuse 2.2.1 release. This means Java 7 compatibility, Servlet 3, Bootstrap/jQuery integration, Tapestry 5.3.6 upgrade and security improvements. I integrated Bootstrap and jQuery using &lt;a href=&quot;http://www.webjars.org/documentation&quot;&gt;WebJars Servlet 3 support&lt;/a&gt; since it was simple and straightforward. 
&lt;/p&gt;
&lt;p&gt;
You can create projects using AppFuse&apos;s light archetypes using a command such as the following:
&lt;/p&gt;
&lt;pre class=&quot;brush: shell&quot;&gt;
mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes 
  -DarchetypeArtifactId=appfuse-light-spring-freemarker-archetype -DarchetypeVersion=2.2.1 
  -DgroupId=com.mycompany -DartifactId=myproject 
&lt;/pre&gt;
&lt;p&gt;
The list of archetypes is as follows:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;appfuse-light-jsf-archetype&lt;/li&gt;
&lt;li&gt;appfuse-light-spring-archetype&lt;/li&gt;
&lt;li&gt;appfuse-light-spring-freemarker-archetype&lt;/li&gt;
&lt;li&gt;appfuse-light-spring-security-archetype&lt;/li&gt;
&lt;li&gt;appfuse-light-stripes-archetype&lt;/li&gt;
&lt;li&gt;appfuse-light-struts-archetype&lt;/li&gt;
&lt;li&gt;appfuse-light-tapestry-archetype&lt;/li&gt;
&lt;li&gt;appfuse-light-wicket-archetype&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; will help you get setup and demos are available at the following links:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-jsf&quot;&gt;JSF 2 + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-spring&quot;&gt;Spring MVC 3 + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-spring-freemarker&quot;&gt;Spring MVC 3 + FreeMarker + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-spring-security&quot;&gt;Spring MVC 3 + Spring Security + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-stripes&quot;&gt;Stripes + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-struts&quot;&gt;Struts 2 + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-tapestry&quot;&gt;Tapestry 5 + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-wicket&quot;&gt;Wicket + Hibernate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have questions about AppFuse, we invite you to ask them on the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;users mailing list&lt;/a&gt; or tweet using #appfuse. &lt;/p&gt;
&lt;p&gt;
For those enjoying &lt;a href=&quot;http://twitter.github.com/bootstrap/&quot;&gt;Bootstrap&lt;/a&gt; in your apps, I encourage you to check out &lt;a href=&quot;https://wrapbootstrap.com/&quot;&gt;{wrap}bootstrap&lt;/a&gt; and &lt;a href=&quot;http://bootswatch.com/&quot;&gt;Bootswatch&lt;/a&gt;.&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_2_2_1_released</guid>
    <title>AppFuse 2.2.1 Released!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_2_2_1_released</link>
        <pubDate>Tue, 11 Dec 2012 15:21:44 -0700</pubDate>
    <category>Java</category>
    <category>maven</category>
    <category>security</category>
    <category>appfuse</category>
    <category>java</category>
    <category>hibernate</category>
    <category>spring</category>
            <description>&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//static.appfuse.org/images/appfuse-icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 2.2.1. This release includes upgrades to all dependencies to bring them up-to-date with their latest releases. Most notable are Hibernate 4, Struts 2.3.7, Apache CXF 2.7.0 and Spring Security 3.1.3. In addition, we&apos;ve integrated HTML5, Twitter Bootstrap, jQuery and replaced Compass with Hibernate Search. Last but not least, we&apos;ve added full support for Java 7 and integrated many &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part4&quot;&gt;security improvements&lt;/a&gt;. For more details on specific changes see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.2.1&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;quote&quot;&gt;&lt;strong&gt;What is AppFuse?&lt;/strong&gt;&lt;br/&gt;AppFuse is a full-stack framework for building web applications on the JVM. It was originally developed to eliminate the ramp-up time when building new web applications. Over the years, it has matured into a very testable and secure system for creating Java-based webapps.
&lt;/p&gt;

&lt;p&gt;Demos for this release can be viewed at &lt;a href=&quot;http://demo.appfuse.org/&quot;&gt;http://demo.appfuse.org&lt;/a&gt;. Please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; style=&quot;font-weight: bold&quot;&gt;QuickStart Guide&lt;/a&gt; to get started with this release. &lt;/p&gt;

&lt;p&gt;A number of blog posts were written about features that went into this release while it was being developed:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/improving_appfuse_s_pagespeed_with&quot;&gt;Improving AppFuse&apos;s PageSpeed with Apache&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_news_liquibase_and_wro4j&quot;&gt;New Liquibase and wro4j Tutorials from J. Garc&#237;a&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_news_github_hibernate_search&quot;&gt;AppFuse News: GitHub, Hibernate Search and The Future&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/refreshing_appfuse_s_ui_with&quot;&gt;Refreshing AppFuse&apos;s UI with Twitter Bootstrap&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/upgrading_appfuse_to_spring_security&quot;&gt;Upgrading AppFuse to Spring Security 3.1 and Spring 3.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/integrating_oauth_with_appfuse_and&quot;&gt;Integrating OAuth with AppFuse and its REST API&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;If you have questions about AppFuse, please read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot;&gt;FAQ&lt;/a&gt; or join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;mailing list&lt;/a&gt;. If you find any issues, please &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/ANN-AppFuse-2-2-1-Released-td4656067.html&quot;&gt;report them on the users mailing list&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks to everyone for their help contributing patches, writing documentation and participating on the mailing lists.&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;We greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot; title=&quot;Sponsors&quot; style=&quot;color: #666&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot; style=&quot;color: #666&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://contegix.com&quot; style=&quot;color: #666&quot;&gt;Contegix&lt;/a&gt; and &lt;a href=&quot;http://www.jetbrains.com&quot; style=&quot;color: #666&quot;&gt;JetBrains&lt;/a&gt;. We highly recommend using the new &lt;a href=&quot;http://blogs.jetbrains.com/idea/2012/12/intellij-idea-12-is-available-for-download/&quot;&gt;IntelliJ IDEA 12&lt;/a&gt; for developing web applications.&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/improving_appfuse_s_pagespeed_with</guid>
    <title>Improving AppFuse&apos;s PageSpeed with Apache</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/improving_appfuse_s_pagespeed_with</link>
        <pubDate>Tue, 4 Dec 2012 09:25:05 -0700</pubDate>
    <category>Java</category>
    <category>contegix</category>
    <category>appfuse</category>
    <category>apache</category>
    <category>pagespeed</category>
            <description>&lt;p&gt;One of the most important things when developing webapps is to make them &lt;em&gt;fast&lt;/em&gt;. With AppFuse, we&apos;ve tried to incorporate many of the &lt;a href=&quot;http://stevesouders.com/hpws/rules.php&quot;&gt;14 rules for faster-loading websites&lt;/a&gt;. We had a gzip filter before it was cool (2003) and replaced it with &lt;a href=&quot;http://ehcache.org/documentation/user-guide/web-caching&quot;&gt;the one from EhCache&lt;/a&gt;. However, users experienced issues with both of these, both &lt;a href=&quot;http://issues.appfuse.org/browse/APF-863&quot;&gt;with XFire/CXF&lt;/a&gt; and &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1037&quot;&gt;WebWork/Struts 2 and JSPs&lt;/a&gt;. Because of these issues, we disabled gzipping a few releases ago. &lt;/p&gt;

&lt;p&gt;This article is designed to show you how you can make your AppFuse webapp faster, without modifying any code. The good news is this applies to any webapp that you can deploy behind Apache. &lt;/p&gt;

&lt;p&gt;Last Friday, I sent an email to the good folks at &lt;a href=&quot;http://contegix.com&quot;&gt;Contegix&lt;/a&gt; to see if they could install &lt;a href=&quot;https://developers.google.com/speed/pagespeed/mod&quot;&gt;mod_pagespeed&lt;/a&gt; on the Apache server that sits in front of *.appfuse.org. My goal was to improve the YSlow and PageSpeed scores of the apps hosted on &lt;a href=&quot;http://demo.appfuse.or&quot;&gt;demo.appfuse.org&lt;/a&gt;. I discovered they were getting a dismal score of 24 and figured we could do a lot better. mod_pagespeed speeds up your site and reduces page load time by automatically applying web performance best practices. It seemed like an easy solution.
&lt;/p&gt;

&lt;p&gt;Unfortunately, we were unable to use mod_pagespeed. From the guys at Contegix:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;Attempting to install mod_pagespeed as you requested, we find that it requires Apache httpd 2.2 and libstdc++ 4.1.2, both of which are unsupported in RHEL4. To get mod_pagespeed to work on your present operating system basically means re-rolling the core components, which would make them unsupported. I&apos;m afraid mod_pagespeed is simply not an option on your present configuration.&lt;/p&gt;

&lt;p&gt;Since I still wanted to improve performance, I opted for another route instead: using mod_deflate (for gzipping) and mod_expires (for expires headers). I also turned on KeepAlive as recommended by &lt;a href=&quot;https://developers.google.com/speed/docs/insights/using_chrome&quot;&gt;PageSpeed Insights&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;mod_deflate&lt;/strong&gt;&lt;br&gt;mod_deflate was already installed in Apache (version 2.0.52), so all I had to do was configure it. On RHEL4, Apache is installed at /etc/httpd and there&apos;s a &lt;em&gt;conf.d&lt;/em&gt; directory that contains all the configuration files. I created a file at &lt;em&gt;/etc/httpd/conf.d/deflate.conf&lt;/em&gt; and populated it with the following:&lt;/p&gt;

&lt;pre&gt;#
# mod_deflate configuration
#
&amp;lt;IfModule mod_deflate.c&gt;
    SetOutputFilter DEFLATE
    
    AddOutputFilterByType DEFLATE text/plain text/html text/xml text/css application/xml application/xhtml+xml application/rss+xml application/javascript application/x-javascript
    
    DeflateCompressionLevel 9
    
    BrowserMatch ^Mozilla/4 gzip-only-text/html
    BrowserMatch ^Mozilla/4\.0[678] no-gzip
    BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
    
    DeflateFilterNote Input instream
    DeflateFilterNote Output outstream
    DeflateFilterNote Ratio ratio
    
    LogFormat &apos;&quot;%r&quot; %{outstream}n/%{instream}n (%{ratio}n%%)&apos; deflate
    
&amp;lt;/IfModule&gt;&lt;/pre&gt;

&lt;p&gt;At first, I had separate lines for all the different content types (as recommended by &lt;a href=&quot;http://www.g-loaded.eu/2008/05/10/use-mod_deflate-to-compress-web-content-delivered-by-apache/&quot;&gt;this article&lt;/a&gt;). The Contegix support crew figured out the solution (everything needed to be on one line) in 14 minutes, updated the config and verified it worked using &lt;a href=&quot;http://www.whatsmyip.org/http-compression-test/&quot;&gt;an http compression testing page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;mod_expires&lt;/strong&gt;&lt;br&gt;mod_expires was already installed, so I added a config file at &lt;em&gt;/etc/httpd/conf.d/expires.conf&lt;/em&gt;. I used &lt;a href=&quot;http://www.howtoforge.com/make-browsers-cache-static-files-with-mod_expires-on-apache2-debian-squeeze&quot;&gt;this howto&lt;/a&gt; and asked Contegix for help when it didn&apos;t work. Their response took quite a bit longer this time (49 minutes), but they once again figured it out:&lt;/p&gt;

&lt;p class=&quot;quote&quot;&gt;It appears that FilesMatch does not like to play will JkMount. It does work using content type.&lt;/p&gt;

&lt;p&gt;My final config for &lt;em&gt;expires.conf&lt;/em&gt;:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;IfModule mod_expires.c&gt;
    ExpiresActive On
    
    &amp;lt;FilesMatch &quot;\.(jpe?g|png|gif|js|css)$&quot;&gt;
        ExpiresDefault &quot;access plus 1 week&quot;
    &amp;lt;/FilesMatch&gt;
    
    ExpiresByType image/jpeg &quot;access plus 1 week&quot;
    ExpiresByType image/png &quot;access plus 1 week&quot;
    ExpiresByType image/gif &quot;access plus 1 week&quot;
    ExpiresByType text/css &quot;access plus 1 week&quot;
    ExpiresByType application/javascript &quot;access plus 1 week&quot;
    ExpiresByType application/x-javascript &quot;access plus 1 week&quot;
&amp;lt;/IfModule&gt;
&lt;/pre&gt;

&lt;p&gt;I used &quot;1 week&quot; because we&apos;re changing things quite a bit right now and we haven&apos;t integrated &lt;a href=&quot;http://www.operatornew.com/2012/10/adding-web-resource-fingerprinting-to.html&quot;&gt;resource fingerprinting&lt;/a&gt; yet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;KeepAlive&lt;br&gt;&lt;/strong&gt;The last thing I did to improve performance was to turn on KeepAlive by editing &lt;em&gt;/etc/httpd/conf/httpd.conf &lt;/em&gt;and changing &lt;em&gt;Off &lt;/em&gt;to &lt;em&gt;On&lt;/em&gt;.&lt;/p&gt;
&lt;pre&gt;#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to &quot;Off&quot; to deactivate.
#
KeepAlive On&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;br&gt;&lt;/strong&gt;As a result of these changes, our PageSpeed score went from 24 to 96 and YSlow went from a 90 to a 98. When I started this experiment, I was only trying to fix demo.appfuse.org. However, it also improved the speed of all the other *.appfuse.org sites, including &lt;a href=&quot;http://appfuse.org&quot;&gt;Confluence&lt;/a&gt;, &lt;a href=&quot;http://builds.appfuse.or&quot;&gt;Bamboo&lt;/a&gt;, &lt;a href=&quot;http://issues.appfuse.or&quot;&gt;JIRA&lt;/a&gt; and &lt;a href=&quot;http://source.appfuse.org&quot;&gt;FishEye&lt;/a&gt;. Thanks for all the help Contegix! There&apos;s a good chance you&apos;ve given me back a few minutes in each day.&lt;/p&gt;
&lt;p style=&quot;text-align: right; font-size: .95em; margin-top: -10px&quot;&gt;&lt;em&gt;Originally posted &lt;a href=&quot;http://appfuse.org/display/APF/2012/12/04/Improving+AppFuse%27s+PageSpeed+with+Apache&quot;&gt;on the AppFuse Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_news_liquibase_and_wro4j</guid>
    <title>AppFuse News: Liquibase and wro4j Tutorials from J. Garc&#237;a</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_news_liquibase_and_wro4j</link>
        <pubDate>Fri, 30 Nov 2012 14:32:47 -0700</pubDate>
    <category>Java</category>
    <category>liquibase</category>
    <category>springsecurity</category>
    <category>wro4j</category>
    <category>appfuse</category>
            <description>&lt;p&gt;New committer &lt;a href=&quot;http://www.operatornew.com/&quot;&gt;J. Garc&#237;a&lt;/a&gt; has been doing a lot of work to improve i18n in AppFuse 2.2, as well as our Struts 2 support. In addition, he&apos;s written a couple articles that show
you how to integrate &lt;a href=&quot;http://www.liquibase.org/&quot;&gt;Liquibase&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/wro4j/&quot;&gt;wro4j&lt;/a&gt; in your AppFuse applications. Thanks for the
great documentation J!&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.operatornew.com/2012/10/adding-web-resource-fingerprinting-to.html&quot;&gt;Adding web resource fingerprinting to AppFuse with
wro4j&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://www.operatornew.com/2012/11/automatic-db-migration-for-java-web.html&quot;&gt;Automatic DB migration for Java web apps with
Liquibase&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The 2.2 release is coming along, and we&apos;re down to &lt;a href=&quot;http://issues.appfuse.org/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=10190&quot;&gt;16
open issues&lt;/a&gt;. I&apos;ve updated the &lt;a href=&quot;http://appfuse.org/display/APF/Using+Hibernate&quot;&gt;Hibernate&lt;/a&gt;, &lt;a href=&quot;http://appfuse.org/display/APF/Using+JPA&quot;&gt;JPA&lt;/a&gt;, &lt;a
href=&quot;http://appfuse.org/display/APF/Services&quot;&gt;Services&lt;/a&gt; and &lt;a href=&quot;http://appfuse.org/display/APF/Web+Services&quot;&gt;Web Services&lt;/a&gt; tutorials and hope to finish the web
tutorials in the next week. You can try the latest code using the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; or check it out on the demo
site:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://demo.appfuse.org/appfuse-jsf&quot;&gt;http://demo.appfuse.org/appfuse-jsf&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a
href=&quot;http://demo.appfuse.org/appfuse-spring&quot;&gt;http://demo.appfuse.org/appfuse-spring&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://demo.appfuse.org/appfuse-struts&quot;
class=&quot;external-link&quot;&gt;http://demo.appfuse.org/appfuse-struts&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;http://demo.appfuse.org/appfuse-tapestry&quot;
class=&quot;external-link&quot;&gt;http://demo.appfuse.org/appfuse-tapestry&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Please see &lt;a
href=&quot;http://appfuse.547863.n4.nabble.com/AppFuse-2-2-Ready-for-Testing-td4655722.html&quot;&gt;this thread&lt;/a&gt; on the mailing list if you have any questions or suggestions.&lt;/p&gt;&lt;p&gt;In
related news, &lt;a href=&quot;http://www.captaindebug.com/&quot;&gt;Roger Hughes&lt;/a&gt; has a good article titled &lt;a
href=&quot;http://www.captaindebug.com/2012/11/a-list-of-things-you-can-do-with-spring.html&quot;&gt;Ten Things You Can Do With Spring Security&lt;/a&gt;. Since AppFuse uses Spring Security
extensively, hopefully you can use some of Roger&apos;s tips to improve the security of your app.&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_news_github_hibernate_search</guid>
    <title>AppFuse News: GitHub, Hibernate Search and The Future</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_news_github_hibernate_search</link>
        <pubDate>Tue, 25 Sep 2012 10:42:14 -0600</pubDate>
    <category>Java</category>
    <category>github</category>
    <category>appfuse</category>
    <category>roadmap</category>
            <description>&lt;p&gt;It&apos;s been a while since I&apos;ve written anything about &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;, but since the project
  has had quite a bit of activity lately, now seems like a good time.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;br&gt;First of all,
  we moved the source code from java.net to &lt;a href=&quot;https://github.com/appfuse/appfuse&quot;&gt;GitHub&lt;/a&gt; way back
  in June. Thanks to &lt;a href=&quot;https://twitter.com/sdeby&quot;&gt;Serge&lt;/a&gt; for helping with
  this process and making it &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/Migrating-to-GitHub-td4655148.html&quot;&gt;quick and
    painless&lt;/a&gt;. For some reason, shortly
  after moving, we started having quite a few build issues with &lt;a href=&quot;http://builds.appfuse.org&quot;&gt;Bamboo&lt;/a&gt;.
  I was able to diagnose the
  problem as not enough memory on our server. Thankfully, &lt;a href=&quot;http://www.contegix.com/&quot;&gt;Contegix&lt;/a&gt; was able to
  add another 2GB of
  RAM to our box and get everything back up-to-snuff.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;New Committer: J. Garcia&lt;/strong&gt;&lt;br&gt;
  J. Garcia has been a regular voice on the users and developers mailing list for several
  months. He&apos;s recently started contributing a lot of patches in JIRA and seems genuinely interested in the success of
  AppFuse. That&apos;s why we voted and &lt;a
        href=&quot;http://appfuse.547863.n4.nabble.com/VOTE-Add-J-Garcia-as-an-AppFuse-Committer-td4655395.html&quot;&gt;added him
    as a committer&lt;/a&gt;. To prove this was a smart move, he recently
  &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1298&quot;&gt;replaced Compass with
    Hibernate Search&lt;/a&gt; and &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1297&quot;&gt;upgraded to Hibernate 4&lt;/a&gt;.
  As part of this work, he removed iBATIS support, which brings me to my next point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Future&lt;/strong&gt;&lt;br&gt;

  In mid-August, I sent an email to the
  community, asking them &quot;&lt;a href=&quot;http://appfuse.547863.n4.nabble.com/Anyone-using-iBATIS-td4655369.html&quot;&gt;Anyone using iBATIS?&lt;/a&gt;&quot;&lt;/p&gt;

&lt;p class=&quot;quote&quot;&gt;I&apos;m thinking of replacing AppFuse&apos;s Data Tier with Spring Data, especially because it has NoSQL and REST support. There&apos;s a good intro on InfoQ today: &lt;br&gt;&lt;br&gt;&lt;a href=&quot;http://www.infoq.com/articles/spring-data-intro&quot;&gt;http://www.infoq.com/articles/spring-data-intro&lt;/span&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
Does anyone see an issue with this? The lack of iBATIS support could be an issue, but I doubt it since if we wanted to continue supporting it, we should move to MyBATIS.
&lt;/p&gt;

&lt;p&gt;Everyone agreed this was a good idea and it seemed like a logical time to remove iBATIS support. In
  addition, I posted a roadmap I jotted down in early May. Since we&apos;ve missed all the dates so far, I&apos;ve removed them
  from the listing below. We hope to get 1-2 releases done by the end of this year, with 2.2 in the next 2-3 weeks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;2.2&lt;/strong&gt;&lt;br&gt;Hibernate 4&lt;br&gt;Hibernate Search&lt;br&gt;Bootstrap&lt;br&gt;H5BP&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.3&lt;/strong&gt; &lt;br&gt;AMP for
  all light modules&lt;br&gt;Wicket&lt;br&gt;PrimeFaces&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.4&lt;/strong&gt;&lt;br&gt;JSR 303 (might require removing or developing
  client-side support)&lt;br&gt;Mockito instead of jMock/EasyMock&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.5&lt;/strong&gt;&lt;br&gt;AMP one-to-many&lt;br&gt;Spring Data&lt;br&gt;MyBatis
  (if there&apos;s interest in adding it back in)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.6&lt;/strong&gt;&lt;br&gt;wro4j for concatenation and minimizing JS and
  CSS&lt;br&gt;pjax - &lt;a href=&quot;https://github.com/defunkt/jquery-pjax&quot;&gt;https://github.com/defunkt/jquery-pjax&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.7&lt;/strong&gt;&lt;br&gt;Scala example&lt;br&gt;Gradle example&lt;br&gt;Article about examples&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.0&lt;/strong&gt;&lt;br&gt;GWT
&lt;/p&gt;
&lt;/blockquote&gt;

  &lt;p&gt;&lt;strong&gt;Maven Central Statistics&lt;/strong&gt;&lt;br&gt;To prove there&apos;s still a fair amount of folks using
    AppFuse, here&apos;s some statistic from Sonatype&apos;s &lt;a href=&quot;https://oss.sonatype.org&quot;&gt;OSS Repository Hosting
      Service&lt;/a&gt;.&lt;/p&gt;
  &lt;p style=&quot;text-align: center&quot;&gt;&lt;a rev=&quot;http://www.flickr.com/photos/mraible/8023640406/&quot; href=&quot;http://farm9.staticflickr.com/8452/8023640406_6df4a3c6f8_o.png&quot; rel=&quot;lightbox[appfuse-201209]&quot;
                                        title=&quot;AppFuse Downloads&quot;&gt;&lt;img
        src=&quot;//farm9.staticflickr.com/8452/8023640406_a7e3613b94.jpg&quot; width=&quot;500&quot; height=&quot;188&quot;
        alt=&quot;AppFuse Downloads&quot;&gt;&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;From this screenshot, you can see that AppFuse artifacts are downloaded around 7,000 times per month. The
      following graph is even more interesting. Apparently, around 3,000 new projects are created with AppFuse
      archetypes each month.&lt;/p&gt;

    &lt;p style=&quot;text-align: center&quot;&gt;
      &lt;a rev=&quot;http://www.flickr.com/photos/mraible/8023642969/&quot; href=&quot;http://farm9.staticflickr.com/8182/8023642969_00801e1ce9_o.png&quot; rel=&quot;lightbox[appfuse-201209]&quot;
         title=&quot;AppFuse Archetype Downloads&quot;&gt;&lt;img
            src=&quot;//farm9.staticflickr.com/8182/8023642969_14111307ca.jpg&quot; width=&quot;500&quot; height=&quot;186&quot;
            alt=&quot;AppFuse Archetype Downloads&quot;&gt;&lt;/a&gt;&lt;/p&gt;

    &lt;p&gt;&lt;strong&gt;The AppFuse Name&lt;br&gt;&lt;/strong&gt;Finally, I &lt;a href=&quot;https://twitter.com/#!/search/?q=appfuse&quot;&gt;recently discovered&lt;/a&gt;
      that ShoreTel decided to &lt;a
            href=&quot;http://www.zdnet.com/shoretel-intros-appfuse-integrated-phone-system-aimed-at-salesforce-customers-7000004374/&quot;
            &gt;name a new product AppFuse&lt;/a&gt;. I guess this signifies two things: 1)
      it&apos;s a good name for a product and 2) someone didn&apos;t do their research before naming it. At this point, I&apos;m not
      too concerned, but it is an interesting development.&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/refreshing_appfuse_s_ui_with</guid>
    <title>Refreshing AppFuse&apos;s UI with Twitter Bootstrap</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/refreshing_appfuse_s_ui_with</link>
        <pubDate>Tue, 31 Jan 2012 17:12:17 -0700</pubDate>
    <category>Java</category>
    <category>springmvc</category>
    <category>twitter</category>
    <category>struts2</category>
    <category>bootstrap</category>
    <category>appfuse</category>
    <category>ui</category>
    <category>css</category>
            <description>The last time AppFuse had an update done to its look and feel was in way back in 2006. I&apos;ve done a lot of consulting since then, which has included a fair bit of page speed optimization, HTML5 development and integrating smarter CSS. It was way back in &apos;05 when we first started looking at adding a CSS Framework to AppFuse.  It was Mike Stenhouse&apos;s &lt;a href=&quot;http://www.contentwithstyle.co.uk/content/a-css-framework/&quot;&gt;CSS Framework&lt;/a&gt; that provided the &lt;a href=&quot;http://raibledesigns.com/rd/entry/a_css_framework&quot;&gt;inspiration&lt;/a&gt; and my &lt;a href=&quot;http://raibledesigns.com/rd/entry/css_framework_design_contest_final&quot;&gt;CSS Framework Design Contest&lt;/a&gt; that provided its current themes (&lt;a href=&quot;http://css.appfuse.org/themes/puzzlewithstyle&quot;&gt;puzzlewithstyle&lt;/a&gt;, &lt;a href=&quot;http://css.appfuse.org/themes/andreas01&quot;&gt;andreas01&lt;/a&gt; and &lt;a href=&quot;http://css.appfuse.org/themes/simplicity&quot;&gt;simplicity&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;Since then, a lot of CSS Frameworks have been invented, including &lt;a href=&quot;http://www.blueprintcss.org/&quot;&gt;Blueprint&lt;/a&gt; in 2007 and &lt;a href=&quot;http://compass-style.org/&quot;&gt;Compass&lt;/a&gt; in 2008. However, neither has taken the world by storm like &lt;a href=&quot;http://twitter.github.com/bootstrap/&quot;&gt;Twitter Bootstrap&lt;/a&gt;. From &lt;a href=&quot;http://www.alistapart.com/articles/building-twitter-bootstrap/&quot;&gt;Building Twitter Bootstrap&lt;/a&gt;:
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
A year-and-a-half ago, a small group of Twitter employees set out to improve our team&#8217;s internal analytical and administrative tools. After some early meetings around this one product, we set out with a higher ambition to create a toolkit for anyone to use within Twitter, and beyond. Thus, we set out to build a system that would help folks like us build new projects on top of it, and Bootstrap was conceived.&lt;br/&gt;
...&lt;br/&gt;
Today, it has grown to include dozens of components and has become the most popular project on GitHub with more than 13,000 watchers and 2,000 forks.&lt;/p&gt;
&lt;p&gt;&lt;p&gt;The fact that Bootstrap has become the most popular project on GitHub says a lot. For &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/AppFuse-next-td3634415.html&quot;&gt;AppFuse.next&lt;/a&gt;, I&apos;d like to integrate a lot of my learnings over the past few years, as well as support HTML5 and modern browsers as best we can. This means &lt;a href=&quot;http://code.google.com/speed/page-speed/docs/rules_intro.html&quot;&gt;page speed optimizations&lt;/a&gt;, getting rid of Prototype and Scriptaculous in favor of jQuery, adding &lt;a href=&quot;http://code.google.com/p/wro4j/&quot;&gt;wro4j&lt;/a&gt; for resource optimization and integrating &lt;a href=&quot;http://html5boilerplate.com/&quot;&gt;HTML5 Boilerplate&lt;/a&gt;. I&apos;ve used Twitter Bootstrap for my &lt;a href=&quot;http://raibledesigns.com/rd/entry/my_html5_with_play_scala&quot;&gt;&lt;em&gt;Play More!&lt;/em&gt; app&lt;/a&gt;, as well as some recent client projects. Its excellent documentation has made it easy to use and I love the way you can simply add classes to elements to make them transform into something beautiful.
&lt;/p&gt;
&lt;p&gt;Last week, I spent a couple late nights integrating &lt;a href=&quot;http://thinkvitamin.com/design/twitter-bootstrap-2-0/&quot;&gt;Twitter Bootstrap 2.0&lt;/a&gt; into the Struts 2 and Spring MVC versions of AppFuse. The layout was pretty straightforward thanks to &lt;a href=&quot;http://markdotto.com/bs2/docs/scaffolding.html&quot;&gt;Scaffolding&lt;/a&gt;. Creating the Struts Menu Velocity template to produce &lt;a href=&quot;http://markdotto.com/bs2/docs/javascript.html#dropdowns&quot;&gt;dropdowns&lt;/a&gt; wasn&apos;t too difficult. I added &lt;a href=&quot;http://markdotto.com/bs2/docs/base-css.html#tables&quot;&gt;class=&quot;table table-condensed&quot;&lt;/a&gt; to the list screen tables, &lt;a href=&quot;http://markdotto.com/bs2/docs/base-css.html#forms&quot;&gt;class=&quot;well form-horizontal&quot;&lt;/a&gt; to forms and &lt;a href=&quot;http://markdotto.com/bs2/docs/base-css.html#buttons&quot;&gt;class=&quot;btn primary&quot;&lt;/a&gt; to buttons. 
&lt;/p&gt;
&lt;p&gt;  
I also added validation errors with the &quot;help-inline&quot; class. This is also where things got tricky with Struts and Spring MVC. For the form elements in Bootstrap, they recommend you use a &quot;control-group&quot; element that contains your label and a &quot;controls&quot; element. The control contains the input/select/textarea and also the error message if there is one. Here&apos;s a sample element waiting for data: 
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;div class=&quot;control-group&quot;&amp;gt;
    &amp;lt;label for=&quot;name&quot; class=&quot;control-label&quot;&amp;gt;Name&amp;lt;/label&amp;gt;
    &amp;lt;div class=&quot;controls&quot;&amp;gt;
        &amp;lt;input type=&quot;text&quot; id=&quot;name&quot; name=&quot;name&quot;&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Below is what that element should look like to display a validation error:&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;div class=&quot;control-group error&quot;&amp;gt;
    &amp;lt;label for=&quot;name&quot; class=&quot;control-label&quot;&amp;gt;Name&amp;lt;/label&amp;gt;
    &amp;lt;div class=&quot;controls&quot;&amp;gt;
        &amp;lt;input type=&quot;text&quot; id=&quot;name&quot; name=&quot;name&quot; value=&quot;&quot;&amp;gt;
        &amp;lt;span class=&quot;help-inline&quot;&amp;gt;Please enter your name.&amp;lt;/span&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;You can see this markup is pretty easy, you just need to add an &quot;error&quot; class to &lt;em&gt;control-group&lt;/em&gt; and span to show the error message. With Struts 2, this was pretty easy thanks to its customizable templates for its &lt;a href=&quot;http://struts.apache.org/2.x/docs/struts-tags.html&quot;&gt;tags&lt;/a&gt;. All I had to do was create a &quot;template/css_xhtml&quot; directory in &lt;em&gt;src/main/webapp&lt;/em&gt; and modify checkbox.ftl, controlfooter.ftl, controlheader-core.ftl and controlheader.ftl to match Bootstrap&apos;s conventions. 
&lt;/p&gt;
&lt;p&gt;
Spring MVC was a bit trickier. Since its tags don&apos;t have the concept of writing an entire control (label and field), I had to do a bit of finagling to get things to work. In the current implementation, Struts 2 forms have a single line for a &lt;em&gt;control-group&lt;/em&gt; and its &lt;em&gt;control-label&lt;/em&gt; and &lt;em&gt;controls&lt;/em&gt;.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;&amp;lt;s:textfield key=&quot;user.firstName&quot; required=&quot;true&quot;/&gt;&lt;/pre&gt;
&lt;p&gt;With Spring MVC, it&apos;s a bit more complex:&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;spring:bind path=&quot;user.firstName&quot;&amp;gt;
&amp;lt;fieldset class=&quot;control-group${(not empty status.errorMessage) ? &apos; error&apos; : &apos;&apos;}&quot;&amp;gt;
&amp;lt;/spring:bind&amp;gt;
    &amp;lt;appfuse:label styleClass=&quot;control-label&quot; key=&quot;user.firstName&quot;/&amp;gt;
    &amp;lt;div class=&quot;controls&quot;&amp;gt;
        &amp;lt;form:input path=&quot;firstName&quot; id=&quot;firstName&quot; maxlength=&quot;50&quot;/&amp;gt;
        &amp;lt;form:errors path=&quot;firstName&quot; cssClass=&quot;help-inline&quot;/&amp;gt;
    &amp;lt;/div&amp;gt;
&amp;lt;/fieldset&amp;gt;
&lt;/pre&gt;
&lt;p&gt;You could probably overcome this verbosity with &lt;a href=&quot;http://today.java.net/pub/a/today/2003/11/14/tagfiles.html&quot;&gt;Tag Files&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Figuring out if a &lt;em&gt;control-group&lt;/em&gt; needed an error class before the input tag was rendered was probably the hardest part of this exercise. This was mostly due to Bootstrap&apos;s great documentation and useful examples (viewed by inspecting the markup). Below are some screenshots of the old screens and new ones. 
&lt;/p&gt;
&lt;p style=&quot;text-align: center; vertical-align: top&quot;&gt;
&lt;a href=&quot;http://farm8.staticflickr.com/7173/6787781357_c4c65c7c74_b.jpg&quot; title=&quot;Old UI - Login&quot; rel=&quot;lightbox[appfuse-bootstrap]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7173/6787781357_c4c65c7c74_t.jpg&quot; width=&quot;100&quot; height=&quot;60&quot; alt=&quot;Old UI - Login&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm8.staticflickr.com/7142/6787781421_0c7851b414_b.jpg&quot; title=&quot;Old UI - Users&quot; rel=&quot;lightbox[appfuse-bootstrap]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7142/6787781421_0c7851b414_t.jpg&quot; width=&quot;100&quot; height=&quot;60&quot; alt=&quot;Old UI - Users&quot; style=&quot;margin-left: 10px&quot;&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm8.staticflickr.com/7035/6787781725_3a1f0218c1_b.jpg&quot; title=&quot;Old UI - Edit Profile&quot; rel=&quot;lightbox[appfuse-bootstrap]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7035/6787781725_3a1f0218c1_t.jpg&quot; width=&quot;100&quot; height=&quot;82&quot; alt=&quot;Old UI - Edit Profile&quot; style=&quot;margin-left: 10px&quot;&gt;&lt;/a&gt;

&lt;p&gt;  
&lt;p style=&quot;text-align: center; vertical-align: top&quot;&gt;
&lt;a href=&quot;http://farm8.staticflickr.com/7025/6787781477_ec2ac7a93b_b.jpg&quot; title=&quot;New UI - Login&quot; rel=&quot;lightbox[appfuse-bootstrap]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7025/6787781477_ec2ac7a93b_t.jpg&quot; width=&quot;100&quot; height=&quot;60&quot; alt=&quot;New UI - Login&quot;&gt;&lt;/a&gt;
  
&lt;a href=&quot;http://farm8.staticflickr.com/7015/6787781597_6558d94bb5_b.jpg&quot; title=&quot;New UI - Users&quot; rel=&quot;lightbox[appfuse-bootstrap]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7015/6787781597_6558d94bb5_t.jpg&quot; width=&quot;100&quot; height=&quot;60&quot; alt=&quot;New UI - Users&quot; style=&quot;margin-left: 10px&quot;&gt;&lt;/a&gt;
  
  &lt;a href=&quot;http://farm8.staticflickr.com/7010/6787781681_81b7977414_b.jpg&quot; title=&quot;New UI - Edit Profile&quot; rel=&quot;lightbox[appfuse-bootstrap]&quot;&gt;&lt;img src=&quot;//farm8.staticflickr.com/7010/6787781681_81b7977414_t.jpg&quot; width=&quot;100&quot; height=&quot;82&quot; alt=&quot;New UI - Edit Profile&quot; style=&quot;margin-left: 10px&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #666; text-align: center&quot;&gt;Check out the &lt;a style=&quot;color: #666&quot; href=&quot;http://www.flickr.com/photos/mraible/sets/72157629094630763/&quot;&gt;full set on Flickr&lt;/a&gt; if you&apos;d like a closer look.
  &lt;/p&gt;
  &lt;p&gt;
Even though I like the look of the old UI, I can&apos;t help but think a lot of the themes are designed for blogs and content sites, not webapps. The old &lt;a href=&quot;http://wufoo.com/&quot;&gt;Wufoo&lt;/a&gt; forms were a lot better looking though. And if you&apos;re going to develop &lt;a href=&quot;http://blogs.atlassian.com/2012/01/modern-principles-in-web-development/&quot;&gt;kick-ass webapps&lt;/a&gt;, you need to make them look good. Bootstrap goes a long way in doing this, but it certainly doesn&apos;t replace a good UX Designer. Bootstap simply helps you get into HTML5-land, start using CSS3 and it takes the pain out of making things work cross-browser. Its fluid layouts and responsive web design seems to work great for business applications, which I&apos;m guessing AppFuse is used for the most. 
&lt;/p&gt;
&lt;p&gt;
I can&apos;t thank the Bootstrap developers enough for helping me make this all look good. With Bootstrap 2 &lt;a href=&quot;http://www.markdotto.com/2012/01/24/bootstrap-2-ready-for-testing-and-feedback/&quot;&gt;dropping this week&lt;/a&gt;, I can see myself using this more and more on projects. In the near future, I&apos;ll be helping integrate Bootstrap into AppFuse&apos;s &lt;a href=&quot;http://appfuse.547863.n4.nabble.com/Tapestry-5-3-2-td4339578.html&quot;&gt;Tapestry 5 and JSF versions&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;What do you think of this CSS change? Do you change your CSS and layout a fair bit when starting with AppFuse archetypes? What can we do to make AppFuse apps look better out-of-the-box?
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I &lt;a href=&quot;http://source.appfuse.org/changelog/appfuse/?cs=3593&quot;&gt;updated&lt;/a&gt; AppFuse to the final &lt;a href=&quot;http://raibledesigns.com/rd/entry/twitter_s_open_source_summit&quot;&gt;Bootstrap 2.0 release&lt;/a&gt;. Also, Johannes Geppert wrote a &lt;a href=&quot;http://www.jgeppert.com/2012/02/new-struts2-bootstrap-plugin-released/&quot;&gt;Struts 2 Bootstrap Plugin&lt;/a&gt;. I hope to integrate this into AppFuse in the near future.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/upgrading_appfuse_to_spring_security</guid>
    <title>Upgrading AppFuse to Spring Security 3.1 and Spring 3.1</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/upgrading_appfuse_to_spring_security</link>
        <pubDate>Thu, 5 Jan 2012 08:58:21 -0700</pubDate>
    <category>Java</category>
    <category>appfuse</category>
    <category>springsecurity</category>
    <category>spring</category>
            <description>Before the holiday break, I spent some time upgrading &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; to use the latest releases of Spring and Spring Security. I started with Spring Security in early December and quickly discovered its 3.1 XSD required some changes. After changing to the &lt;a href=&quot;http://www.springframework.org/schema/security/spring-security-3.1.xsd&quot;&gt;3.1 XSD&lt;/a&gt; in my &lt;em&gt;security.xml&lt;/em&gt;, I had to change its &amp;lt;http&amp;gt; element to use &lt;code&gt;security=&quot;none&quot;&lt;/code&gt; instead of &lt;code&gt;filters=&quot;none&quot;&lt;/code&gt;. With Spring Security 3.0.5, I had:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;http auto-config=&quot;true&quot; lowercase-comparisons=&quot;false&quot;&gt;
    &amp;lt;intercept-url pattern=&quot;/images/**&quot; filters=&quot;none&quot;/&gt;
    &amp;lt;intercept-url pattern=&quot;/styles/**&quot; filters=&quot;none&quot;/&gt;
    &amp;lt;intercept-url pattern=&quot;/scripts/**&quot; filters=&quot;none&quot;/&gt;
&lt;/pre&gt;
After upgrading to 3.1, I had to change this to:
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;http pattern=&quot;/images/**&quot; security=&quot;none&quot;/&gt;
&amp;lt;http pattern=&quot;/styles/**&quot; security=&quot;none&quot;/&gt;
&amp;lt;http pattern=&quot;/scripts/**&quot; security=&quot;none&quot;/&gt;

&amp;lt;http auto-config=&quot;true&quot;&gt;
&lt;/pre&gt;
&lt;p&gt;The next thing I had to change was &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/service/src/main/java/org/appfuse/service/UserSecurityAdvice.java?r1=3329&amp;r2=3582&quot;&gt;UserSecurityAdvice.java&lt;/a&gt;. Instead of using &lt;code&gt;Collection&amp;lt;GrantedAuthority&amp;gt;&lt;/code&gt; for Authentication&apos;s &lt;em&gt;getAuthority()&lt;/em&gt; method, I had to change it to use &lt;code&gt;Collection&amp;lt;? extends GrantedAuthority&amp;gt;&lt;/code&gt;.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
Authentication auth = ctx.getAuthentication();
Collection&amp;lt;? extends GrantedAuthority&gt; roles = auth.getAuthorities();
&lt;/pre&gt;
&lt;p style=&quot;text-align: left&quot;&gt;Lastly, I discovered that &lt;code&gt;SPRING_SECURITY_CONTEXT_KEY&lt;/code&gt; &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/common/src/main/java/org/appfuse/webapp/listener/UserCounterListener.java?r1=3579&amp;r2=3582&quot;&gt;moved to  HttpSessionSecurityContextRepository&lt;/a&gt;. &lt;a href=&quot;http://source.appfuse.org/changelog/appfuse/?cs=3582&quot;&gt;Click here&lt;/a&gt; to see the changelog for this upgrade in AppFuse&apos;s FishEye.
&lt;/p&gt;
&lt;p&gt;You can read more about &lt;a href=&quot;http://www.infoq.com/news/2011/12/spring-security-3.1&quot;&gt;what&apos;s new in Spring Security 3.1 on InfoQ&lt;/a&gt;. I&apos;m especially pumped to see http-only cookie support for Servlet 3.0. I discovered Spring Security didn&apos;t support this when &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_application_security_part4&quot;&gt;Pen-Testing with Zed Attack Proxy&lt;/a&gt;.
&lt;p id=&quot;spring-3.1&quot;&gt;&lt;strong&gt;Upgrading to Spring Framework 3.1&lt;/strong&gt;&lt;br/&gt;
Compared to the Spring Security upgrade, upgrading to Spring 3.1 &lt;a href=&quot;http://source.appfuse.org/changelog/appfuse/?cs=3585&quot;&gt;was a breeze&lt;/a&gt;. The first thing I discovered after changing my pom.xml&apos;s version was that Spring Security required some additional exclusions in order to get the latest Spring versions. Of course, this was communicated to me through the following cryptic error.
&lt;/p&gt;
&lt;pre&gt;
-------------------------------------------------------------------------------
Test set: org.appfuse.dao.LookupDaoTest
-------------------------------------------------------------------------------
Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.004 sec &lt;&lt;&lt; FAILURE!
testGetRoles(org.appfuse.dao.LookupDaoTest)  Time elapsed: 0.001 sec  &lt;&lt;&lt; ERROR!
java.lang.NoSuchMethodError: org.springframework.context.support.GenericApplicationContext.getEnvironment()Lorg/springframework/core/env/ConfigurableEnvironment;
	at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:97)
	at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:1)
	at org.springframework.test.context.support.DelegatingSmartContextLoader.loadContext(DelegatingSmartContextLoader.java:228)
	at org.springframework.test.context.TestContext.loadApplicationContext(TestContext.java:124)
	at org.springframework.test.context.TestContext.getApplicationContext(TestContext.java:148)
	at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:109)
&lt;/pre&gt;
&lt;p&gt;
Without these additional exclusions, Spring Security pulled in Spring 3.0.6. I had to exclude spring-expression, spring-context and spring-web from spring-security-taglibs to get the 3.1.0.RELEASE version of Spring.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-security-taglibs&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${spring.security.version}&amp;lt;/version&amp;gt;
    &amp;lt;exclusions&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-expression&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-web&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
    &amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;I also had to exclude spring-context from spring-security-config and spring-context and spring-expression from spring-security-core. &lt;em&gt;Isn&apos;t Maven wonderful?&lt;/em&gt;
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-security-core&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${spring.security.version}&amp;lt;/version&amp;gt;
    &amp;lt;exclusions&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-expression&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
    &amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-security-config&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${spring.security.version}&amp;lt;/version&amp;gt;
    &amp;lt;exclusions&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
    &amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;After making these changes, I got a bit further, but ended up being blocked by a &lt;a href=&quot;https://issues.apache.org/jira/browse/TAP5-1788&quot;&gt;bug in Tapestry 5&apos;s Spring support&lt;/a&gt;. Basically, after upgrading to Spring 3.1, I started seeing the following error:
&lt;/p&gt;
&lt;pre&gt;
java.lang.RuntimeException: Service id &apos;environment&apos; has already been defined by 
org.apache.tapestry5.services.TapestryModule.buildEnvironment(PerthreadManager) 
&lt;/pre&gt;
&lt;p&gt;Luckily, I was able to easily fix this with advice I &lt;a href=&quot;http://tapestry.1045711.n5.nabble.com/tapestry-5-2-4-and-spring-3-1M1-td4462226.html&quot;&gt;found on Tapestry&apos;s mailing list&lt;/a&gt;. Unfortunately, even though I submitted a fix on December 15th, it didn&apos;t make it into &lt;a href=&quot;http://tapestry.apache.org/2011/12/21/announcing-tapestry-531.html&quot;&gt;Tapestry&apos;s 5.3.1 release on December 21st&lt;/a&gt;. As soon as Tapestry 5.3.2 is released, I hope to get the AppFuse&apos;s build passing again (it&apos;s &lt;a href=&quot;http://builds.appfuse.org/browse/APF-TRUNK-535&quot;&gt;currently failing&lt;/a&gt;). 
&lt;/p&gt;
&lt;p&gt;I hope this article helps you upgrade your AppFuse-started applications to the latest versions of Spring and Spring Security. Over the next few weeks, I&apos;ll be exploring many of &lt;a href=&quot;http://blog.springsource.org/2011/12/13/spring-framework-3-1-goes-ga/&quot;&gt;Spring 3.1&apos;s new features&lt;/a&gt; and implementing them as I see fit. Right now, I&apos;m thinking environments/profiles, Servlet 3 / Java 7 support and Hibernate 4 support. These seem to be the best new features to learn about for &lt;a href=&quot;http://www.meetup.com/SV-SUG/events/43376082/&quot;&gt;my talk in a few weeks&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/integrating_oauth_with_appfuse_and</guid>
    <title>Integrating OAuth with AppFuse and its REST API</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/integrating_oauth_with_appfuse_and</link>
        <pubDate>Tue, 5 Jul 2011 10:56:48 -0600</pubDate>
    <category>Java</category>
    <category>appfuse</category>
    <category>springsecurity</category>
    <category>rest</category>
    <category>oauth</category>
    <category>enunciate</category>
            <description>One of the new features in &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_1_released&quot;&gt;AppFuse 2.1&lt;/a&gt; is an &lt;a href=&quot;http://issues.appfuse.org/browse/APF-897&quot;&gt;appfuse-ws&lt;/a&gt; archetype. This archetype leverages &lt;a href=&quot;http://enunciate.codehaus.org/&quot;&gt;Enunciate&lt;/a&gt; and &lt;a href=&quot;http://cxf.apache.org/&quot;&gt;CXF&lt;/a&gt; to create a project with a REST API and generated HTML documentation. Enunciate is a very useful tool, allowing you to develop web services with JAX-RS and JAX-WS annotations and have all types of client libraries generated. For me, it seems very useful for developing the backend of &lt;abbr title=&quot;Service Oriented Front End Applications&quot;&gt;SOFEA&lt;/abbr&gt; (a.k.a. modern) applications. &lt;/p&gt;
&lt;p&gt;Back in March, &lt;a href=&quot;http://www.java.net/blogs/stoicflame/&quot;&gt;Ryan Heaton&lt;/a&gt; published a nice article on &lt;a href=&quot;http://docs.codehaus.org/display/ENUNCIATE/Securing+Web+Services&quot;&gt;Securing Web Services&lt;/a&gt; in an Enunciate application. I decided to take his tutorial a step further and not only secure my web services, but also to integrate with  OAuth 2. In this tutorial, I&apos;ll show you how to create a new application with AppFuse WS, secure it, add OAuth support, and then use a client app to authenticate and retrieve data.&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;#create-appfuse-ws&quot;&gt;Create a New AppFuse WS Project&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#integrate-oauth&quot;&gt;Integrate Spring Security and OAuth&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#oauth-client&quot;&gt;Authenticate and Retrieve Data with Client&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p id=&quot;create-appfuse-ws&quot;&gt;
&lt;strong&gt;Create a New AppFuse WS Project&lt;/strong&gt;&lt;br/&gt;
To begin, I visited the &lt;a href=&quot;http://static.appfuse.org/archetypes.html&quot;&gt;Create AppFuse Archetypes&lt;/a&gt; page and created a new application using the &quot;Web Services Only&quot; option in the &lt;em&gt;Web Framework&lt;/em&gt; dropdown. Below is the command I used to create the &quot;appfuse-oauth&quot; project.
&lt;/p&gt;
&lt;pre&gt;
mvn archetype:generate -B -DarchetypeGroupId=org.appfuse.archetypes \
-DarchetypeArtifactId=appfuse-ws-archetype -DarchetypeVersion=2.1.0 \
-DgroupId=org.appfuse.example -DartifactId=appfuse-oauth 
&lt;/pre&gt;
&lt;p&gt;After doing this, I started the app using &lt;strong&gt;mvn jetty:run&lt;/strong&gt; and confirmed it started OK. At this point, I was able to view the generated documentation for the application at &lt;a href=&quot;http://localhost:8080&quot;&gt;http://localhost:8080&lt;/a&gt;. The screenshot below shows what the app looks like at this point.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm7.static.flickr.com/6004/5891597325_7f9829e158.jpg&quot; title=&quot;AppFuse WS Homepage&quot; rel=&quot;lightbox[appfuse-oauth]&quot;&gt;&lt;img src=&quot;//farm7.static.flickr.com/6004/5891597325_7f9829e158_m.jpg&quot; width=&quot;240&quot; height=&quot;198&quot; alt=&quot;AppFuse WS Homepage&quot;&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;font-weight: italic; color: #666; margin-left: 10px&quot;&gt;
NOTE: You might notice the REST endpoint of /{username}. This is &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1246&quot; style=&quot;color: #666&quot;&gt;a bug&lt;/a&gt; in AppFuse 2.1.0 and has been fixed in SVN. It does not affect this tutorial.&lt;/p&gt;
&lt;p id=&quot;integrate-oauth&quot;&gt;
&lt;strong&gt;Integrate Spring Security and OAuth&lt;/strong&gt;&lt;br/&gt;
I originally tried to integrate Spring Security with Enunciate&apos;s &lt;a href=&quot;http://docs.codehaus.org/display/ENUNCIATE/Securing+Web+Services&quot;&gt;Securing Web Services Tutorial&lt;/a&gt;. However, it only secures endpoints and doesn&apos;t do enough filtering for OAuth support, so I ended up using a custom web.xml. I put this file in &lt;em&gt;src/main/resources&lt;/em&gt; and loaded it in my &lt;em&gt;enunciate.xml&lt;/em&gt; file. I also upgraded Spring Security and imported my security.xml file.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml; auto-links: false&quot;&gt;
  &amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
  &amp;lt;enunciate xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
             xsi:noNamespaceSchemaLocation=&quot;http://enunciate.codehaus.org/schemas/enunciate-1.22.xsd&quot;&amp;gt;
      ...
      &amp;lt;webapp mergeWebXML=&quot;src/main/resources/web.xml&quot;/&amp;gt;
      &amp;lt;modules&amp;gt;
      ...
          &amp;lt;spring-app disabled=&quot;false&quot; springVersion=&quot;3.0.5.RELEASE&quot;&amp;gt;
              &amp;lt;springImport uri=&quot;classpath:/applicationContext-resources.xml&quot;/&amp;gt;
              &amp;lt;springImport uri=&quot;classpath:/applicationContext-dao.xml&quot;/&amp;gt;
              &amp;lt;springImport uri=&quot;classpath:/applicationContext-service.xml&quot;/&amp;gt;
              &amp;lt;springImport uri=&quot;classpath:/applicationContext.xml&quot;/&amp;gt;
              &amp;lt;springImport uri=&quot;classpath:/security.xml&quot;/&amp;gt;
          &amp;lt;/spring-app&amp;gt;
      &amp;lt;/modules&amp;gt;
  &amp;lt;/enunciate&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Then I created &lt;em&gt;src/main/resources/web.xml&lt;/em&gt; with a filter for Spring Security and a DispatcherServlet for OAuth support.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml; auto-links: false&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;web-app xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;
         xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
         xsi:schemaLocation=&quot;http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd&quot;
         version=&quot;3.0&quot;&amp;gt;

    &amp;lt;filter&amp;gt;
        &amp;lt;filter-name&amp;gt;securityFilter&amp;lt;/filter-name&amp;gt;
        &amp;lt;filter-class&amp;gt;org.springframework.web.filter.DelegatingFilterProxy&amp;lt;/filter-class&amp;gt;
        &amp;lt;init-param&amp;gt;
            &amp;lt;param-name&amp;gt;targetBeanName&amp;lt;/param-name&amp;gt;
            &amp;lt;param-value&amp;gt;springSecurityFilterChain&amp;lt;/param-value&amp;gt;
        &amp;lt;/init-param&amp;gt;
    &amp;lt;/filter&amp;gt;

    &amp;lt;filter-mapping&amp;gt;
        &amp;lt;filter-name&amp;gt;securityFilter&amp;lt;/filter-name&amp;gt;
        &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
    &amp;lt;/filter-mapping&amp;gt;

    &amp;lt;servlet&amp;gt;
        &amp;lt;servlet-name&amp;gt;appfuse-oauth&amp;lt;/servlet-name&amp;gt;
        &amp;lt;servlet-class&amp;gt;org.springframework.web.servlet.DispatcherServlet&amp;lt;/servlet-class&amp;gt;
        &amp;lt;load-on-startup&amp;gt;1&amp;lt;/load-on-startup&amp;gt;
    &amp;lt;/servlet&amp;gt;

    &amp;lt;servlet-mapping&amp;gt;
        &amp;lt;servlet-name&amp;gt;appfuse-oauth&amp;lt;/servlet-name&amp;gt;
        &amp;lt;url-pattern&amp;gt;/oauth/*&amp;lt;/url-pattern&amp;gt;
    &amp;lt;/servlet-mapping&amp;gt;
&amp;lt;/web-app&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Next, I created a &lt;em&gt;src/main/resources/security.xml&lt;/em&gt; and used it to secure my API, specify a login page, supply the users and integrate OAuth (see the last 4 beans below). &lt;/p&gt;
&lt;pre class=&quot;brush: xml; auto-links: false&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/security&quot;
             xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
             xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
             xmlns:oauth=&quot;http://www.springframework.org/schema/security/oauth2&quot;
             xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security.xsd
                           http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2.xsd&quot;&amp;gt;

    &amp;lt;http auto-config=&quot;true&quot;&amp;gt;
        &amp;lt;intercept-url pattern=&quot;/api/**&quot; access=&quot;ROLE_USER&quot;/&amp;gt;
        &amp;lt;intercept-url pattern=&quot;/oauth/**&quot; access=&quot;ROLE_USER&quot;/&amp;gt;
        &amp;lt;intercept-url pattern=&quot;/**&quot; access=&quot;IS_AUTHENTICATED_ANONYMOUSLY&quot;/&amp;gt;
        &amp;lt;form-login login-page=&quot;/login.jsp&quot; authentication-failure-url=&quot;/login.jsp?error=true&quot;
                    login-processing-url=&quot;/j_security_check&quot;/&amp;gt;
    &amp;lt;/http&amp;gt;

    &amp;lt;authentication-manager&amp;gt;
        &amp;lt;authentication-provider&amp;gt;
            &amp;lt;user-service&amp;gt;
                &amp;lt;user name=&quot;admin&quot; password=&quot;admin&quot; authorities=&quot;ROLE_USER,ROLE_ADMIN&quot;/&amp;gt;
                &amp;lt;user name=&quot;user&quot; password=&quot;user&quot; authorities=&quot;ROLE_USER&quot;/&amp;gt;
            &amp;lt;/user-service&amp;gt;
        &amp;lt;/authentication-provider&amp;gt;
    &amp;lt;/authentication-manager&amp;gt;

    &amp;lt;!--hook up the spring security filter chain--&amp;gt;
    &amp;lt;beans:alias name=&quot;springSecurityFilterChain&quot; alias=&quot;securityFilter&quot;/&amp;gt;

    &amp;lt;beans:bean id=&quot;tokenServices&quot;
                class=&quot;org.springframework.security.oauth2.provider.token.InMemoryOAuth2ProviderTokenServices&quot;&amp;gt;
        &amp;lt;beans:property name=&quot;supportRefreshToken&quot; value=&quot;true&quot;/&amp;gt;
    &amp;lt;/beans:bean&amp;gt;

    &amp;lt;oauth:provider client-details-service-ref=&quot;clientDetails&quot; token-services-ref=&quot;tokenServices&quot;&amp;gt;
        &amp;lt;oauth:verification-code user-approval-page=&quot;/oauth/confirm_access&quot;/&amp;gt;
    &amp;lt;/oauth:provider&amp;gt;

    &amp;lt;oauth:client-details-service id=&quot;clientDetails&quot;&amp;gt;
        &amp;lt;!--&amp;lt;oauth:client clientId=&quot;my-trusted-client&quot; authorizedGrantTypes=&quot;password,authorization_code,refresh_token&quot;/&amp;gt;
        &amp;lt;oauth:client clientId=&quot;my-trusted-client-with-secret&quot;
                      authorizedGrantTypes=&quot;password,authorization_code,refresh_token&quot; secret=&quot;somesecret&quot;/&amp;gt;
        &amp;lt;oauth:client clientId=&quot;my-less-trusted-client&quot; authorizedGrantTypes=&quot;authorization_code&quot;/&amp;gt;--&amp;gt;
        &amp;lt;oauth:client clientId=&quot;ajax-login&quot; authorizedGrantTypes=&quot;authorization_code&quot;/&amp;gt;
    &amp;lt;/oauth:client-details-service&amp;gt;
&amp;lt;/beans:beans&amp;gt;
&lt;/pre&gt;
&lt;p&gt;I used the &lt;a href=&quot;http://static.springsource.org/spring-security/oauth/tutorial.html&quot;&gt;OAuth for Spring Security sample apps&lt;/a&gt; to figure this out. In this example, I used authorizedGrantTypes=&quot;authorization_code&quot;, but you can see from the commented &amp;lt;oauth:client&gt; elements above that there&apos;s a few different options. You should also note that the clientId is hard-coded to &quot;ajax-login&quot;, signifying I only want to allow a single application to authenticate.
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;At this point, I&apos;d like to give a shoutout to Ryan Heaton for creating &lt;em&gt;both&lt;/em&gt; Enunciate and Spring Security&apos;s OAuth support. Nice work Ryan!&lt;/p&gt;
&lt;p&gt;At this point, I needed to do a number of additional tasks to finish integrating oauth. The first was to modify the Jetty Plugin&apos;s configuration to 1) run on port 9000, 2) load my custom files and 3) allow jetty:run to recognize Enunciate&apos;s generated files. Below is the final configuration in my pom.xml.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;plugin&amp;gt;
    &amp;lt;groupId&amp;gt;org.mortbay.jetty&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;maven-jetty-plugin&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;6.1.26&amp;lt;/version&amp;gt;
    &amp;lt;configuration&amp;gt;
        &amp;lt;connectors&amp;gt;
            &amp;lt;connector implementation=&quot;org.mortbay.jetty.nio.SelectChannelConnector&quot;&amp;gt;
                &amp;lt;port&amp;gt;9000&amp;lt;/port&amp;gt;
                &amp;lt;maxIdleTime&amp;gt;60000&amp;lt;/maxIdleTime&amp;gt;
            &amp;lt;/connector&amp;gt;
        &amp;lt;/connectors&amp;gt;
        &amp;lt;webAppConfig&amp;gt;
            &amp;lt;baseResource implementation=&quot;org.mortbay.resource.ResourceCollection&quot;&amp;gt;
                &amp;lt;resourcesAsCSV&amp;gt;
                    ${basedir}/src/main/webapp,
                    ${project.build.directory}/${project.build.finalName}
                &amp;lt;/resourcesAsCSV&amp;gt;
            &amp;lt;/baseResource&amp;gt;
            &amp;lt;contextPath&amp;gt;/appfuse-oauth&amp;lt;/contextPath&amp;gt;
        &amp;lt;/webAppConfig&amp;gt;
        &amp;lt;webXml&amp;gt;${project.build.directory}/${project.build.finalName}/WEB-INF/web.xml&amp;lt;/webXml&amp;gt;
    &amp;lt;/configuration&amp;gt;
&amp;lt;/plugin&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Next, I added the necessary OAuth dependencies for Spring Security to my pom.xml. Since the latest release is a milestone release, I had to add Spring&apos;s milestone repo too. 
&lt;/p&gt;
&lt;pre class=&quot;brush: xml; auto-links: false&quot;&gt;
&amp;lt;repository&amp;gt;
    &amp;lt;id&amp;gt;spring-milestone&amp;lt;/id&amp;gt;
    &amp;lt;url&amp;gt;http://s3.amazonaws.com/maven.springframework.org/milestone&amp;lt;/url&amp;gt;
&amp;lt;/repository&amp;gt;
...
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.security&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-security-taglibs&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
    &amp;lt;exclusions&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-web&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-support&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
    &amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.security.oauth&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-security-oauth&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0.0.M3&amp;lt;/version&amp;gt;
    &amp;lt;exclusions&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-beans&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-core&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
    &amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-webmvc&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${spring.version}&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;servlet-api&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;2.5&amp;lt;/version&amp;gt;
    &amp;lt;scope&amp;gt;provided&amp;lt;/scope&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;javax.servlet&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;jstl&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.1.2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;taglibs&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;standard&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.1.2&amp;lt;/version&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Since I named my DispatcherServlet &quot;appfuse-oauth&quot; in web.xml, I created a &lt;em&gt;src/main/webapp/WEB-INF/appfuse-oauth-servlet.xml&lt;/em&gt; to configure Spring MVC. I had to create the &lt;em&gt;src/main/webapp/WEB-INF&lt;/em&gt; directory. &lt;/p&gt;
&lt;pre class=&quot;brush: xml; auto-links: false&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans xmlns=&quot;http://www.springframework.org/schema/beans&quot;
       xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
       xmlns:context=&quot;http://www.springframework.org/schema/context&quot;
       xmlns:mvc=&quot;http://www.springframework.org/schema/mvc&quot;
       xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
                http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd&quot;&amp;gt;

    &amp;lt;!-- Scans the classpath of this application for @Components to deploy as beans --&amp;gt;
    &amp;lt;context:component-scan base-package=&quot;org.appfuse.examples.webapp&quot;/&amp;gt;

    &amp;lt;!-- Configures the @Controller programming model --&amp;gt;
    &amp;lt;mvc:annotation-driven/&amp;gt;

    &amp;lt;!-- Resolves view names to protected .jsp resources within the /WEB-INF/views directory --&amp;gt;
    &amp;lt;bean class=&quot;org.springframework.web.servlet.view.InternalResourceViewResolver&quot;&amp;gt;
        &amp;lt;property name=&quot;viewClass&quot; value=&quot;org.springframework.web.servlet.view.JstlView&quot;/&amp;gt;
        &amp;lt;property name=&quot;prefix&quot; value=&quot;/&quot;/&amp;gt;
        &amp;lt;property name=&quot;suffix&quot; value=&quot;.jsp&quot;/&amp;gt;
    &amp;lt;/bean&amp;gt;
&amp;lt;/beans&amp;gt;
&lt;/pre&gt;
&lt;p&gt;In order to show the OAuth confirmation page, I needed to create &lt;em&gt;src/main/java/org/appfuse/examples/webapp/AccessConfirmationController.java&lt;/em&gt; and map it to /oauth/confirm_access. I copied this from one of the sample projects and modified to use Spring&apos;s annotations.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
package org.appfuse.examples.webapp;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.oauth2.provider.ClientAuthenticationToken;
import org.springframework.security.oauth2.provider.ClientDetails;
import org.springframework.security.oauth2.provider.ClientDetailsService;
import org.springframework.security.oauth2.provider.verification.ClientAuthenticationCache;
import org.springframework.security.oauth2.provider.verification.DefaultClientAuthenticationCache;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.TreeMap;

/**
 * Controller for retrieving the model for and displaying the confirmation page
 * for access to a protected resource.
 *
 * @author Ryan Heaton
 */
@Controller
@RequestMapping(&quot;/confirm_access&quot;)
public class AccessConfirmationController {

    private ClientAuthenticationCache authenticationCache = new DefaultClientAuthenticationCache();
    @Autowired
    private ClientDetailsService clientDetailsService;

    @RequestMapping(method = RequestMethod.GET)
    protected ModelAndView confirm(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ClientAuthenticationToken clientAuth = authenticationCache.getAuthentication(request, response);
        if (clientAuth == null) {
            throw new IllegalStateException(&quot;No client authentication request to authorize.&quot;);
        }

        TreeMap&amp;lt;String, Object&amp;gt; model = new TreeMap&amp;lt;String, Object&amp;gt;();
        ClientDetails client = clientDetailsService.loadClientByClientId(clientAuth.getClientId());
        model.put(&quot;auth_request&quot;, clientAuth);
        model.put(&quot;client&quot;, client);

        return new ModelAndView(&quot;access_confirmation&quot;, model);
    }
}
&lt;/pre&gt;
&lt;p&gt;This controller delegates to &lt;em&gt;src/main/webapp/access_confirmation.jsp&lt;/em&gt;. I created this file and filled it with code to display Accept and Deny buttons.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml; auto-links: false&quot;&gt;
&amp;lt;%@ page import=&quot;org.springframework.security.core.AuthenticationException&quot; %&amp;gt;
&amp;lt;%@ page import=&quot;org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException&quot; %&amp;gt;
&amp;lt;%@ page import=&quot;org.springframework.security.oauth2.provider.verification.BasicUserApprovalFilter&quot; %&amp;gt;
&amp;lt;%@ page import=&quot;org.springframework.security.oauth2.provider.verification.VerificationCodeFilter&quot; %&amp;gt;
&amp;lt;%@ page import=&quot;org.springframework.security.web.WebAttributes&quot; %&amp;gt;
&amp;lt;%@ taglib prefix=&quot;authz&quot; uri=&quot;http://www.springframework.org/security/tags&quot; %&amp;gt;
&amp;lt;%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Confirm Access&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;all&quot;
          href=&quot;http://demo.appfuse.org/appfuse-struts/styles/simplicity/theme.css&quot;/&amp;gt;
    &amp;lt;style type=&quot;text/css&quot;&amp;gt;
        h1 {
            margin-left: -300px;
            margin-top: 50px
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;

&amp;lt;body&amp;gt;

&amp;lt;h1&amp;gt;Confirm Access&amp;lt;/h1&amp;gt;

&amp;lt;div id=&quot;content&quot;&amp;gt;

    &amp;lt;% if (session.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION) != null &amp;amp;&amp;amp; 
                 !(session.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION) instanceof UnapprovedClientAuthenticationException)) { %&amp;gt;
    &amp;lt;div class=&quot;error&quot;&amp;gt;
        &amp;lt;h2&amp;gt;Woops!&amp;lt;/h2&amp;gt;

        &amp;lt;p&amp;gt;Access could not be granted.
            (&amp;lt;%= ((AuthenticationException) session.getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION)).getMessage() %&amp;gt;)&amp;lt;/p&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;% } %&amp;gt;
    &amp;lt;c:remove scope=&quot;session&quot; var=&quot;SPRING_SECURITY_LAST_EXCEPTION&quot;/&amp;gt;

    &amp;lt;authz:authorize ifAnyGranted=&quot;ROLE_USER,ROLE_ADMIN&quot;&amp;gt;
        &amp;lt;h2&amp;gt;Please Confirm&amp;lt;/h2&amp;gt;

        &amp;lt;p&amp;gt;You hereby authorize &quot;&amp;lt;c:out value=&quot;${client.clientId}&quot; escapeXml=&quot;true&quot;/&amp;gt;&quot; to access your protected resources.&amp;lt;/p&amp;gt;

        &amp;lt;form id=&quot;confirmationForm&quot; name=&quot;confirmationForm&quot;
              action=&quot;&amp;lt;%=request.getContextPath() + VerificationCodeFilter.DEFAULT_PROCESSING_URL%&amp;gt;&quot; method=&quot;POST&quot;&amp;gt;
            &amp;lt;input name=&quot;&amp;lt;%=BasicUserApprovalFilter.DEFAULT_APPROVAL_REQUEST_PARAMETER%&amp;gt;&quot;
                   value=&quot;&amp;lt;%=BasicUserApprovalFilter.DEFAULT_APPROVAL_PARAMETER_VALUE%&amp;gt;&quot; type=&quot;hidden&quot;/&amp;gt;
            &amp;lt;label&amp;gt;&amp;lt;input name=&quot;authorize&quot; value=&quot;Authorize&quot; type=&quot;submit&quot;&amp;gt;&amp;lt;/label&amp;gt;
        &amp;lt;/form&amp;gt;
        &amp;lt;form id=&quot;denialForm&quot; name=&quot;denialForm&quot;
              action=&quot;&amp;lt;%=request.getContextPath() + VerificationCodeFilter.DEFAULT_PROCESSING_URL%&amp;gt;&quot; method=&quot;POST&quot;&amp;gt;
            &amp;lt;input name=&quot;&amp;lt;%=BasicUserApprovalFilter.DEFAULT_APPROVAL_REQUEST_PARAMETER%&amp;gt;&quot;
                   value=&quot;not_&amp;lt;%=BasicUserApprovalFilter.DEFAULT_APPROVAL_PARAMETER_VALUE%&amp;gt;&quot; type=&quot;hidden&quot;/&amp;gt;
            &amp;lt;label&amp;gt;&amp;lt;input name=&quot;deny&quot; value=&quot;Deny&quot; type=&quot;submit&quot;&amp;gt;&amp;lt;/label&amp;gt;
        &amp;lt;/form&amp;gt;
    &amp;lt;/authz:authorize&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Finally, I needed to create &lt;em&gt;src/main/webapp/login.jsp&lt;/em&gt; to allow users to login.&lt;/p&gt;
&lt;pre class=&quot;brush: xml; auto-links: false&quot;&gt;
&amp;lt;%@ page language=&quot;java&quot; pageEncoding=&quot;UTF-8&quot; contentType=&quot;text/html;charset=utf-8&quot; %&amp;gt;
&amp;lt;%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;
&amp;lt;%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/fmt&quot; prefix=&quot;fmt&quot; %&amp;gt;
&amp;lt;%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %&amp;gt;

&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Login&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&quot;stylesheet&quot; type=&quot;text/css&quot; media=&quot;all&quot;
          href=&quot;http://demo.appfuse.org/appfuse-struts/styles/simplicity/theme.css&quot;/&amp;gt;
    &amp;lt;style type=&quot;text/css&quot;&amp;gt;
        h1 {
            margin-left: -300px;
            margin-top: 50px
        }
    &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;Login&amp;lt;/h1&amp;gt;

&amp;lt;form method=&quot;post&quot; id=&quot;loginForm&quot; action=&quot;&amp;lt;c:url value=&apos;/j_security_check&apos;/&amp;gt;&quot;&amp;gt;
    &amp;lt;fieldset style=&quot;padding-bottom: 0&quot;&amp;gt;
        &amp;lt;ul&amp;gt;
            &amp;lt;c:if test=&quot;${param.error != null}&quot;&amp;gt;
                &amp;lt;li class=&quot;error&quot;&amp;gt;
                    ${sessionScope.SPRING_SECURITY_LAST_EXCEPTION.message}
                &amp;lt;/li&amp;gt;
            &amp;lt;/c:if&amp;gt;
            &amp;lt;li&amp;gt;
                &amp;lt;label for=&quot;j_username&quot; class=&quot;required desc&quot;&amp;gt;
                    Username &amp;lt;span class=&quot;req&quot;&amp;gt;*&amp;lt;/span&amp;gt;
                &amp;lt;/label&amp;gt;
                &amp;lt;input type=&quot;text&quot; class=&quot;text medium&quot; name=&quot;j_username&quot;
                       id=&quot;j_username&quot; tabindex=&quot;1&quot;/&amp;gt;
            &amp;lt;/li&amp;gt;

            &amp;lt;li&amp;gt;
                &amp;lt;label for=&quot;j_password&quot; class=&quot;required desc&quot;&amp;gt;
                    Password &amp;lt;span class=&quot;req&quot;&amp;gt;*&amp;lt;/span&amp;gt;
                &amp;lt;/label&amp;gt;
                &amp;lt;input type=&quot;password&quot; class=&quot;text medium&quot; name=&quot;j_password&quot;
                       id=&quot;j_password&quot; tabindex=&quot;2&quot;/&amp;gt;
            &amp;lt;/li&amp;gt;
            &amp;lt;li&amp;gt;
                &amp;lt;input type=&quot;submit&quot; class=&quot;button&quot; name=&quot;login&quot; value=&quot;Login&quot;
                       tabindex=&quot;3&quot;/&amp;gt;
            &amp;lt;/li&amp;gt;
        &amp;lt;/ul&amp;gt;
    &amp;lt;/fieldset&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;All the changes described in the above section are necessary to implement OAuth if you create a project with AppFuse WS 2.1. It may seem like a lot of code, but I was able to copy/paste and get it all working in an app in under 5 minutes. Hopefully you can do the same. I&apos;m also considering adding it by default to the next version of AppFuse. Now let&apos;s look at integrating OAuth into a client to authenticate and retrieve data from this application.
&lt;/p&gt;
&lt;p id=&quot;oauth-client&quot;&gt;&lt;strong&gt;Authenticate and Retrieve Data with Client&lt;/strong&gt;&lt;br/&gt;
I originally thought my &lt;a href=&quot;http://raibledesigns.com/rd/entry/implementing_oauth_with_gwt&quot;&gt;GWT OAuth&lt;/a&gt; application would provide a nice client. However, after 30 minutes of trying to get GWT 1.7.1 and the GWT Maven plugin (1.1) working with my 64-bit Java 6 JDK on OS X, I gave up. So I opted to use the &lt;a href=&quot;https://github.com/mraible/ajax-login&quot;&gt;Ajax Login&lt;/a&gt; application I&apos;ve been using in my recent security tutorials.
&lt;/p&gt;
&lt;p&gt;In this example, I used OAuth2RestTemplate from Spring Security OAuth. While this works, and works well, I&apos;d still like to get things working with GWT (or jQuery) to demonstrate how to do it from a pure client-side perspective.
&lt;/p&gt;
&lt;p&gt;To begin, I got the latest source of Ajax Login from GitHub (as of this morning) and made some changes. First of all, I added the Spring Security OAuth dependencies to pom.xml:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml; auto-links: false&quot;&gt;
&amp;lt;repository&amp;gt;
    &amp;lt;id&amp;gt;spring-milestone&amp;lt;/id&amp;gt;
    &amp;lt;url&amp;gt;http://s3.amazonaws.com/maven.springframework.org/milestone&amp;lt;/url&amp;gt;
&amp;lt;/repository&amp;gt;
...
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.springframework.security.oauth&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;spring-security-oauth&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;1.0.0.M3&amp;lt;/version&amp;gt;
    &amp;lt;exclusions&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-beans&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-context&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-core&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
    &amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Then I modified &lt;em&gt;src/main/webapp/WEB-INF/security.xml&lt;/em&gt; and added an OAuth Token Service and defined the location of the OAuth server.&lt;/p&gt; 
&lt;pre class=&quot;brush: xml; auto-links: false&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&amp;gt;
&amp;lt;beans:beans xmlns=&quot;http://www.springframework.org/schema/security&quot;
             xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
             xmlns:beans=&quot;http://www.springframework.org/schema/beans&quot;
             xmlns:oauth=&quot;http://www.springframework.org/schema/security/oauth2&quot;
             xsi:schemaLocation=&quot;http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
              http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.0.xsd
              http://www.springframework.org/schema/security/oauth2 http://www.springframework.org/schema/security/spring-security-oauth2.xsd&quot;&amp;gt;

...
    &amp;lt;oauth:client token-services-ref=&quot;oauth2TokenServices&quot;/&amp;gt;

    &amp;lt;beans:bean id=&quot;oauth2TokenServices&quot;
                class=&quot;org.springframework.security.oauth2.consumer.token.InMemoryOAuth2ClientTokenServices&quot;/&amp;gt;

    &amp;lt;oauth:resource id=&quot;appfuse&quot; type=&quot;authorization_code&quot; clientId=&quot;ajax-login&quot;
                    accessTokenUri=&quot;http://localhost:9000/appfuse-oauth/oauth/authorize&quot;
                    userAuthorizationUri=&quot;http://localhost:9000/appfuse-oauth/oauth/user/authorize&quot;/&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Next, I created a Controller that uses OAuth2RestTemplate to make the request and get the data from the AppFuse OAuth application&apos;s API. I created &lt;em&gt;src/main/java/org/appfuse/examples/webapp/oauth/UsersApiController.java&lt;/em&gt; and filled it with the following code:&lt;/p&gt;
&lt;pre class=&quot;brush: java; auto-links: false&quot;&gt;
package org.appfuse.examples.webapp.oauth;

import org.appfuse.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.common.exceptions.InvalidTokenException;
import org.springframework.security.oauth2.consumer.*;
import org.springframework.security.oauth2.consumer.token.OAuth2ClientTokenServices;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.List;

@RequestMapping(&quot;/appfuse/users&quot;)
@Controller
public class UsersApiController {

    private OAuth2RestTemplate apiRestTemplate;
    @Autowired
    private OAuth2ClientTokenServices tokenServices;

    private static final String REMOTE_DATA_URL = &quot;http://localhost:9000/appfuse-oauth/api/users&quot;;

    @Autowired
    public UsersApiController(OAuth2ProtectedResourceDetails resourceDetails) {
        this.apiRestTemplate = new OAuth2RestTemplate(resourceDetails);
    }

    @RequestMapping(method = RequestMethod.GET)
    @ResponseBody
    public List&amp;lt;User&amp;gt; getUsers() {
        try {
            List users = apiRestTemplate.getForObject(REMOTE_DATA_URL, List.class);
            return new ArrayList&amp;lt;User&amp;gt;(users);
        } catch (InvalidTokenException badToken) {
            //we&apos;ve got a bad token, probably because it&apos;s expired.
            OAuth2ProtectedResourceDetails resource = apiRestTemplate.getResource();
            OAuth2SecurityContext context = OAuth2SecurityContextHolder.getContext();
            if (context != null) {
                // this one is kind of a hack for this application
                // the problem is that the sparklr photos page doesn&apos;t remove the &apos;code=&apos; request parameter.
                ((OAuth2SecurityContextImpl) context).setVerificationCode(null);
            }
            //clear any stored access tokens...
            tokenServices.removeToken(SecurityContextHolder.getContext().getAuthentication(), resource);
            //go get a new access token...
            throw new OAuth2AccessTokenRequiredException(resource);
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;At this point, I thought everything would work and I spent quite some time banging my head against the wall when it didn&apos;t. As I was composing an email to the Enunciate users mailing list, I realized the issue. It appeared to be working, but from the server side, and the redirect back to the client was not happening. The Ajax Login app uses UrlRewriteFilter (for pretty URLs) to redirect from /app/* to /$1 and this redirect was losing the code parameter in the URL. 
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;rule&amp;gt;
    &amp;lt;from&amp;gt;/app/**&amp;lt;/from&amp;gt;
    &amp;lt;to last=&quot;true&quot; type=&quot;redirect&quot;&amp;gt;%{context-path}/$1&amp;lt;/to&amp;gt;
&amp;lt;/rule&amp;gt;
&lt;/pre&gt;
&lt;p&gt;To fix this, I added use-query-string=&quot;true&quot; to the root element in &lt;em&gt;src/main/webapp/WEB-INF/urlrewrite.xml&lt;/em&gt;:
&lt;pre class=&quot;brush: xml; toolbar: false&quot;&gt;
&amp;lt;urlrewrite default-match-type=&quot;wildcard&quot; use-query-string=&quot;true&quot;&gt;
&lt;/pre&gt;
&lt;p&gt;After making all these changes, I ran &lt;strong&gt;mvn jetty:run&lt;/strong&gt; on both apps and opened &lt;a href=&quot;http://localhost:8080/appfuse/users&quot;&gt;http://localhost:8080/appfuse/users&lt;/a&gt; in my browser. It all worked and a smile crept across my face. I&apos;ve checked in the client changes into &lt;a href=&quot;https://github.com/mraible/ajax-login&quot;&gt;ajax-login on GitHub&lt;/a&gt; and the appfuse-oauth example into &lt;a href=&quot;http://code.google.com/p/appfuse-demos/&quot;&gt;AppFuse Demos on Google Code&lt;/a&gt;. If you&apos;d like to see this example in action, I&apos;d encourage you to checkout both projects and let me know if you find any issues.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_2_1_released</guid>
    <title>AppFuse 2.1 Released!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_2_1_released</link>
        <pubDate>Mon, 4 Apr 2011 09:38:05 -0600</pubDate>
    <category>Java</category>
    <category>myfaces</category>
    <category>javaee</category>
    <category>ibatis</category>
    <category>appfuse</category>
    <category>springmvc</category>
    <category>tapestry5</category>
    <category>appfuse-light</category>
    <category>jsf2</category>
    <category>hibernate</category>
    <category>jpa</category>
    <category>spring</category>
    <category>struts2</category>
    <category>java</category>
    <category>maven</category>
            <description>&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//static.appfuse.org/images/appfuse-icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 2.1. This release includes upgrades to all dependencies to bring them up-to-date with their latest releases. Most notable are JPA 2, JSF 2, Tapestry 5 and Spring 3. In addition, we&apos;ve migrated from XFire to CXF and enabled REST for web services. There&apos;s even a new &lt;b&gt;appfuse-ws&lt;/b&gt; archetype that leverages &lt;a href=&quot;http://enunciate.codehaus.org&quot;&gt;Enunciate&lt;/a&gt; to generate web service endpoints, documentation and downloadable clients. This release fixes many issues with archetypes, improving startup time and allowing jetty:run to be used for quick turnaround while developing. For more details on specific changes see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.1.0&quot; title=&quot;Release Notes 2.1.0&quot;&gt;release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is AppFuse?&lt;/strong&gt;&lt;br/&gt;AppFuse is an open source project and application that uses open source frameworks to help you develop Web applications with Java quickly and efficiently. It was originally developed to eliminate the ramp-up time when building new web applications. At its core, AppFuse is a project skeleton, similar to the one that&apos;s created by your IDE when you click through a wizard to create a new web project. If you use &lt;a href=&quot;http://appfuse.org/display/APF/Using+JRebel+with+IntelliJ+IDEA&quot;&gt;JRebel with IntelliJ&lt;/a&gt;, you can achieve zero-turnaround in your project and develop features without restarting the server.
&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Release Details&lt;/b&gt;&lt;br/&gt;
&lt;a href=&quot;http://static.appfuse.org/archetypes.html&quot;&gt;Archetypes&lt;/a&gt; now include all the source for the web modules so using jetty:run and your IDE will work much smoother now. The backend is still embedded in JARs, enabling you to choose with persistence framework (Hibernate, iBATIS or JPA) you&apos;d like to use. If you want to modify the source for that, &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+Core+Classes&quot;&gt;add the core classes to your project&lt;/a&gt; or run &quot;appfuse:full-source&quot;. &lt;/p&gt;

&lt;p&gt;AppFuse comes in a number of different flavors. It offers &quot;light&quot;, &quot;basic&quot; and &quot;modular&quot; and archetypes. Light archetypes use an embedded H2 database and contain a simple CRUD example. Light archetypes allow code generation and full-source features, but do not currently support Stripes or Wicket. Basic archetypes have web services using CXF, authentication from Spring Security and features including signup, login, file upload and CSS theming. Modular archetypes are similar to basic archetypes, except they have multiple modules which allows you to separate your services from your web project.&lt;/p&gt;

&lt;p&gt;AppFuse provides archetypes for JSF, Spring MVC, Struts 2 and Tapestry 5. The light archetypes are available for these frameworks, as well as for Spring MVC + FreeMarker, Stripes and Wicket. You can see demos of these archetypes at &lt;a href=&quot;http://demo.appfuse.org&quot;&gt;http://demo.appfuse.org&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For information on creating a new project, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;If you have questions about AppFuse, please read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot;&gt;FAQ&lt;/a&gt; or join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;user mailing list&lt;/a&gt;. If you find any issues, please report them on the mailing list or &lt;a href=&quot;http://issues.appfuse.org/secure/CreateIssue%21default.jspa&quot;&gt;create an issue in JIRA&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks to everyone for their help contributing patches, writing documentation and participating on the mailing lists.&lt;/p&gt;
&lt;p style=&quot;border-top: 1px dotted silver; padding-top: 5px; color: #666&quot;&gt;We greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot; title=&quot;Sponsors&quot; style=&quot;color: #666&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot; style=&quot;color: #666&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://contegix.com&quot; style=&quot;color: #666&quot;&gt;Contegix&lt;/a&gt; and &lt;a href=&quot;http://www.jetbrains.com&quot; style=&quot;color: #666&quot;&gt;JetBrains&lt;/a&gt;. Atlassian and Contegix are especially awesome: &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot; style=&quot;color: #666&quot;&gt;Atlassian has donated licenses to all its products and Contegix has donated an entire server&lt;/a&gt; to the AppFuse project.&lt;/p&gt;&lt;p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/adding_search_to_appfuse</guid>
    <title>Adding Search to AppFuse with Compass</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/adding_search_to_appfuse</link>
        <pubDate>Tue, 15 Mar 2011 17:11:12 -0600</pubDate>
    <category>Java</category>
    <category>appfuse</category>
    <category>search</category>
    <category>compass</category>
    <category>elasticsearch</category>
            <description>Over 5 years ago, I recognized that &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; needed to have a search feature and &lt;a href=&quot;http://issues.appfuse.org/browse/APF-267&quot;&gt;entered an issue in JIRA&lt;/a&gt;. Almost 4 years later, a &lt;a href=&quot;http://code.google.com/p/pagingappfuse/wiki/CompassSearching&quot;&gt;Compass Tutorial&lt;/a&gt; was created and shortly after &lt;a href=&quot;http://www.kimchy.org/&quot;&gt;Shay Banon&lt;/a&gt; (Compass Founder), sent in a &lt;a href=&quot;http://issues.appfuse.org/browse/APF-267?focusedCommentId=12620&amp;page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-12620&quot;&gt;patch&lt;/a&gt;. From the message he sent me:&lt;/p&gt;
&lt;div class=&quot;quote&quot; style=&quot;margin-left: 0; margin-bottom: 10px&quot;&gt;
&lt;p&gt;A quick breakdown of enabling search:
&lt;/p&gt;
&lt;ol style=&quot;margin-bottom: 0&quot;&gt;
&lt;li&gt;Added Searchable annotations to the User and Address.&lt;/li&gt;
&lt;li&gt;Defined Compass bean, automatically scanning the model package for mapped searchable classes. It also automatically integrates with Spring transaction manager, and stores the index on the file system ([work dir]/target/test-index).&lt;/li&gt;
&lt;li&gt;Defined CompassTemplate (similar in concept to HibernateTemplate).&lt;/li&gt;
&lt;li&gt;Defined CompassSearchHelper. Really helps to perform search since it does pagination and so on.&lt;/li&gt;
&lt;li&gt;Defined CompassGps, basically it allows for index operation allowing to completely reindex the data from the database. JPA and Hiberante also automatically mirror changes done through their API to the index. iBatis uses AOP. &lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;p&gt;Fast forward 2 years and I finally found the time/desire to put a UI on the backend Compass implementation that Shay provided. Yes, I realize that &lt;a href=&quot;http://www.kimchy.org/the_future_of_compass/&quot;&gt;Compass is being replaced by ElasticSearch&lt;/a&gt;. I may change to use ElasticSearch in the future; now that the search feature exists, I hope to see it evolve and improve.
&lt;/p&gt;
&lt;p&gt;Since Shay&apos;s patch integrated the necessary Spring beans for indexing and searching, the only thing I had to do was to implement the UI. Rather than having an &quot;all objects&quot; results page, I elected to implement it so you could search on an entity&apos;s list screen. I started with Spring MVC and added a search() method to the UserController:
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@RequestMapping(method = RequestMethod.GET)
public ModelAndView handleRequest(@RequestParam(required = false, value = &quot;q&quot;) String query) throws Exception {
    if (query != null &amp;&amp; !&quot;&quot;.equals(query.trim())) {
        return new ModelAndView(&quot;admin/userList&quot;, Constants.USER_LIST, search(query));
    } else {
        return new ModelAndView(&quot;admin/userList&quot;, Constants.USER_LIST, mgr.getUsers());
    }
}

public List&amp;lt;User&amp;gt; search(String query) {
    List&amp;lt;User&amp;gt; results = new ArrayList&amp;lt;User&amp;gt;();
    CompassDetachedHits hits = compassTemplate.findWithDetach(query);
    log.debug(&quot;No. of results for &apos;&quot; + query + &quot;&apos;: &quot; + hits.length());
    for (int i = 0; i &amp;lt; hits.length(); i++) {
        results.add((User) hits.data(i));
    }
    return results;
}
&lt;/pre&gt;
&lt;p&gt;At first, I used &lt;em&gt;compassTemplate.find()&lt;/em&gt;, but got an error because I wasn&apos;t using an OpenSessionInViewFilter. I decided to go with findWithDetach() and added the following search form to the top of the userList.jsp page:&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
&amp;lt;div id=&quot;search&quot;&amp;gt;
&amp;lt;form method=&quot;get&quot; action=&quot;${ctx}/admin/users&quot; id=&quot;searchForm&quot;&amp;gt;
    &amp;lt;input type=&quot;text&quot; size=&quot;20&quot; name=&quot;q&quot; id=&quot;query&quot; value=&quot;${param.q}&quot;
           placeholder=&quot;Enter search terms&quot;/&amp;gt;
    &amp;lt;input type=&quot;submit&quot; value=&quot;&amp;lt;fmt:message key=&quot;button.search&quot;/&amp;gt;&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p style=&quot;color: #666; margin-left: 20px&quot;&gt;&lt;em&gt;NOTE: I tried using HTML5&apos;s &amp;lt;input type=&quot;search&quot;&amp;gt;, but found &lt;a href=&quot;http://lists.canoo.com/pipermail/webtest/2011q1/013697.html&quot; style=&quot;color: #666&quot;&gt;Canoo WebTest doesn&apos;t support it.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Next, I wrote a unit test to verify everything worked as expected. I found I had to call compassGps.index() as part of my test to make sure my index was created and up-to-date.&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
public class UserControllerTest extends BaseControllerTestCase {
    @Autowired
    private CompassGps compassGps;
    @Autowired
    private UserController controller;

    public void testSearch() throws Exception {
        compassGps.index();
        ModelAndView mav = controller.handleRequest(&quot;admin&quot;);
        Map m = mav.getModel();
        List results = (List) m.get(Constants.USER_LIST);
        assertNotNull(results);
        assertTrue(results.size() &amp;gt;= 1);
        assertEquals(&quot;admin/userList&quot;, mav.getViewName());
    }
}
&lt;/pre&gt;
&lt;p&gt;After getting this working, I started integrating similar code into AppFuse&apos;s other web framework modules (Struts, JSF and Tapestry). When I was finished, they all looked pretty similar from a UI perspective.
&lt;/p&gt;
&lt;p&gt;&lt;strong style=&quot;color: #666&quot;&gt;Struts:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;div id=&quot;search&quot;&amp;gt;
&amp;lt;form method=&quot;get&quot; action=&quot;${ctx}/admin/users&quot; id=&quot;searchForm&quot;&amp;gt;
    &amp;lt;input type=&quot;text&quot; size=&quot;20&quot; name=&quot;q&quot; id=&quot;query&quot; value=&quot;${param.q}&quot;
           placeholder=&quot;Enter search terms...&quot;/&amp;gt;
    &amp;lt;input type=&quot;submit&quot; value=&quot;&amp;lt;fmt:message key=&quot;button.search&quot;/&amp;gt;&quot;/&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong style=&quot;color: #666&quot;&gt;JSF:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;div id=&quot;search&quot;&amp;gt;
&amp;lt;h:form id=&quot;searchForm&quot;&amp;gt;
    &amp;lt;h:inputText id=&quot;q&quot; name=&quot;q&quot; size=&quot;20&quot; value=&quot;#{userList.query}&quot;/&amp;gt;
    &amp;lt;h:commandButton value=&quot;#{text&amp;#91;&apos;button.search&apos;&amp;#93;}&quot; action=&quot;#{userList.search}&quot;/&amp;gt;
&amp;lt;/h:form&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong style=&quot;color: #666&quot;&gt;Tapestry:&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;div id=&quot;search&quot;&amp;gt;
&amp;lt;t:form method=&quot;get&quot; t:id=&quot;searchForm&quot;&amp;gt;
    &amp;lt;t:textfield size=&quot;20&quot; name=&quot;q&quot; t:id=&quot;q&quot;/&amp;gt;
    &amp;lt;input t:type=&quot;submit&quot; value=&quot;${message:button.search}&quot;/&amp;gt;
&amp;lt;/t:form&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;
&lt;p&gt;One frustrating thing I found was that &lt;a href=&quot;http://tapestry.1045711.n5.nabble.com/Is-there-any-way-to-render-the-quot-get-quot-method-of-form-td2643651.html&quot;&gt;Tapestry doesn&apos;t support method=&quot;get&quot;&lt;/a&gt; and AFAICT, neither does JSF 2. With JSF, I had to make my UserList bean session-scoped or the query parameter would be null when it listed the results. Tapestry took me the longest to implement, mainly because I had issues figuring out how it&apos;s easy-to-understand-once-you-know onSubmit() handlers worked and I had the proper @Property and @Persist annotations on my &quot;q&quot; property. &lt;a href=&quot;http://www.crazymcphee.net/x/2009/08/26/tapestry-5-web-framework/&quot;&gt;This tutorial&lt;/a&gt; was the greatest help for me. Of course, now that it&apos;s all finished, the code looks pretty intuitive.&lt;/p&gt;
&lt;p&gt;Feeling proud of myself for getting this working, I started integrating this feature into AppFuse&apos;s code generation and found I had to add quite a bit of code to the generated list pages/controllers. 
&lt;/p&gt;
&lt;p&gt;
So I went on a bike ride...&lt;/p&gt;
&lt;p&gt;While riding, I thought of a much better solution and added the following search method to AppFuse&apos;s GenericManagerImpl.java. In the code I added to pages/controllers previously, I&apos;d already refactored to use CompassSearchHelper and I continued to do so in the service layer implementation.
&lt;/p&gt;
&lt;pre class=&quot;brush: java&quot;&gt;
@Autowired
private CompassSearchHelper compass;

public List&amp;lt;T&amp;gt; search(String q, Class clazz) {
    if (q == null || &quot;&quot;.equals(q.trim())) {
        return getAll();
    }

    List&amp;lt;T&amp;gt; results = new ArrayList&amp;lt;T&amp;gt;();

    CompassSearchCommand command = new CompassSearchCommand(q);
    CompassSearchResults compassResults = compass.search(command);
    CompassHit&amp;#91;&amp;#93; hits = compassResults.getHits();

    if (log.isDebugEnabled() &amp;amp;&amp;amp; clazz != null) {
        log.debug(&quot;Filtering by type: &quot; + clazz.getName());
    }

    for (CompassHit hit : hits) {
        if (clazz != null) {
            if (hit.data().getClass().equals(clazz)) {
                results.add((T) hit.data());
            }
        } else {
            results.add((T) hit.data());
        }
    }

    if (log.isDebugEnabled()) {
        log.debug(&quot;Number of results for &apos;&quot; + q + &quot;&apos;: &quot; + results.size());
    }

    return results;
}
&lt;/pre&gt;
&lt;p&gt;This greatly simplified my page/controller logic because now all I had to do was call manager.search(query, User.class) instead of doing the Compass login in the controller. Of course, it&apos;d be great if I didn&apos;t have to pass in the Class to filter by object, but that&apos;s the &lt;a href=&quot;http://javanotepad.blogspot.com/2007/09/instanceof-doesnt-work-with-generics.html&quot;&gt;nature of generics and type erasure&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Other things I learned along the way:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;To index on startup, I added compassGps.index() to the StartupListener.&lt;/a&gt;.
&lt;li&gt;In unit tests that leveraged transactions around methods, I had to call compassGps.index() before any transactions started.&lt;/li&gt;
&lt;li&gt;To scan multiple packages for searchable classes, I had to add a &lt;a href=&quot;http://forum.compass-project.org/thread.jspa?threadID=216821&amp;tstart=0&quot;&gt;LocalCompassBeanPostProcessor&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But more than anything, I was reminded it always helps to take a bike ride when you don&apos;t like the design of your code. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;
&lt;/p&gt;
&lt;p&gt;
This feature and many more will be in AppFuse 2.1, which I hope to &lt;a href=&quot;http://issues.appfuse.org/secure/IssueNavigator.jspa?mode=hide&amp;requestId=10160&quot; title=&quot;Open Issues for 2.1&quot;&gt;finish by the end of the month&lt;/a&gt;. In the meantime, please feel free to try out the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;latest snapshot&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/upgrading_to_jsf_2</guid>
    <title>Upgrading to JSF 2</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/upgrading_to_jsf_2</link>
        <pubDate>Mon, 7 Mar 2011 13:24:53 -0700</pubDate>
    <category>Java</category>
    <category>urlrewritefilter</category>
    <category>myfaces</category>
    <category>jsf</category>
    <category>richfaces</category>
    <category>springsecurity</category>
    <category>tomahawk</category>
    <category>appfuse</category>
    <category>java</category>
    <category>facelets</category>
            <description>Last week, I spent a few hours upgrading &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; from JSF 1.2 to JSF 2.0. In reality, I upgraded from &lt;a href=&quot;http://myfaces.apache.org&quot;&gt;MyFaces&lt;/a&gt; 1.2.7 to 2.0.4, but all JSF implementations should be the same, right? All in all, it was a pretty easy upgrade with a few minor AppFuse-specific things. My goal in upgrading was to do the bare minimum to get things working and to leave integration of JSF 2 features for a later date.&lt;/p&gt;

&lt;p&gt;In addition to upgrading MyFaces, I had to upgrade Tomahawk by changing the dependency&apos;s artifactId to &lt;strong&gt;tomahawk20&lt;/strong&gt;. I was also able to remove the following listener from my web.xml:
&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false&quot;&gt;
&amp;lt;listener&gt;
    &amp;lt;listener-class&gt;org.apache.myfaces.webapp.StartupServletContextListener&amp;lt;/listener-class&gt;
&amp;lt;listener&gt;
&lt;/pre&gt;
&lt;p&gt;After that, I discovered that MyFaces uses a new URI (/javax.faces.resource/) for serving up some of its resource files. I kindly asked Spring Security to ignore these requests by adding the following to my security.xml file.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false&quot;&gt;
&amp;lt;intercept-url pattern=&quot;/javax.faces.resource/**&quot; filters=&quot;none&quot;/&gt;
&lt;/pre&gt;
&lt;p&gt;Since JSF 2 includes Facelets by default, I tried removing Facelets as a dependency. After doing this, I received the following error:
&lt;/p&gt;
&lt;pre&gt;
ERROR [308855416@qtp-120902214-7] ViewHandlerWrapper.fillChain(158) | Error instantiation parent Faces ViewHandler
java.lang.ClassNotFoundException: com.sun.facelets.FaceletViewHandler
        at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)
        at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:244)
        at org.codehaus.plexus.classworlds.realm.ClassRealm.loadClass(ClassRealm.java:230)
        at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:401)
        at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:363)
        at org.ajax4jsf.framework.ViewHandlerWrapper.fillChain(ViewHandlerWrapper.java:144)
        at org.ajax4jsf.framework.ViewHandlerWrapper.calculateRenderKitId(ViewHandlerWrapper.java:68)
        at org.apache.myfaces.lifecycle.DefaultRestoreViewSupport.isPostback(DefaultRestoreViewSupport.java:179)
        at org.apache.myfaces.lifecycle.RestoreViewExecutor.execute(RestoreViewExecutor.java:113)
        at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:171)
        at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)
&lt;/pre&gt;
&lt;p&gt;Figuring this was caused by the following element in my web.xml ...
&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false&quot;&gt;
&amp;lt;context-param&amp;gt;
    &amp;lt;param-name&amp;gt;org.ajax4jsf.VIEW_HANDLERS&amp;lt;/param-name&amp;gt;
    &amp;lt;param-value&amp;gt;com.sun.facelets.FaceletViewHandler&amp;lt;/param-value&amp;gt;
&amp;lt;/context-param&amp;gt;
&lt;/pre&gt;
&lt;p&gt;... I removed it and tried again. This time I received a NoClassDefFoundError:&lt;/p&gt;
&lt;pre&gt;
java.lang.NoClassDefFoundError: com/sun/facelets/tag/TagHandler
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClassCond(ClassLoader.java:632)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:616)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
        at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
        at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:392)
        at org.mortbay.jetty.webapp.WebAppClassLoader.loadClass(WebAppClassLoader.java:363)
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:247)
        at org.apache.myfaces.shared_impl.util.ClassUtils.classForName(ClassUtils.java:184)
        at org.apache.myfaces.view.facelets.util.ReflectionUtil.forName(ReflectionUtil.java:67)
&lt;/pre&gt;
&lt;p&gt;Since everything seemed to work with Facelets in the classpath, I decided to save this headache for a later date. I entered two issues in AppFuse&apos;s JIRA, one for &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1234&quot;&gt;removing Facelets&lt;/a&gt; and one for &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1233&quot;&gt;replacing Ajax4JSF with RichFaces&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;The next issue I encountered was redirecting from AppFuse&apos;s password hint page. The navigation-rule for this page is as follows:&lt;/p&gt;
&lt;pre class=&quot;brush: xml; toolbar: false&quot;&gt;
&amp;lt;navigation-rule&amp;gt;
    &amp;lt;from-view-id&amp;gt;/passwordHint.xhtml&amp;lt;/from-view-id&amp;gt;
    &amp;lt;navigation-case&amp;gt;
        &amp;lt;from-outcome&amp;gt;success&amp;lt;/from-outcome&amp;gt;
        &amp;lt;to-view-id&amp;gt;/login&amp;lt;/to-view-id&amp;gt;
        &amp;lt;redirect/&amp;gt;
    &amp;lt;/navigation-case&amp;gt;
&amp;lt;/navigation-rule&amp;gt;
&lt;/pre&gt;
&lt;p&gt;With JSF 2.0, the rule changes the URL to /login.xhtml when redirecting (where it was left as /login with 1.2) and it was caught by the security setting in my web.xml that prevents users from viewing raw templates.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;security-constraint&amp;gt;
    &amp;lt;web-resource-collection&amp;gt;
        &amp;lt;web-resource-name&amp;gt;Protect XHTML Templates&amp;lt;/web-resource-name&amp;gt;
        &amp;lt;url-pattern&amp;gt;*.xhtml&amp;lt;/url-pattern&amp;gt;
    &amp;lt;/web-resource-collection&amp;gt;
    &amp;lt;auth-constraint/&amp;gt;
&amp;lt;/security-constraint&amp;gt;
&lt;/pre&gt;
&lt;p&gt;To solve this issue, I had to make a couple of changes:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Comment out the security-constraint in web.xml and move it to Spring Security&apos;s security.xml file.
&lt;pre class=&quot;brush: xml; toolbar: false&quot; style=&quot;margin: 5px 0 0 0&quot;&gt;
&amp;lt;intercept-url pattern=&quot;/**/*.xhtml&quot; access=&quot;ROLE_NOBODY&quot;/&gt;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;Add a rule to urlrewrite.xml that redirects back to login (since login.xhtml doesn&apos;t exist and I&apos;m using extensionless URLs).
&lt;pre class=&quot;brush: xml&quot; style=&quot;margin: 5px 0 0 0&quot;&gt;
&amp;lt;rule match-type=&quot;regex&quot;&amp;gt;
    &amp;lt;from&amp;gt;^/login.xhtml$&amp;lt;/from&amp;gt;
    &amp;lt;to type=&quot;redirect&quot;&amp;gt;%{context-path}/login&amp;lt;/to&amp;gt;
&amp;lt;/rule&amp;gt;
&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After getting the Password Hint feature passing in the browser, I tried running the integration tests (powered by &lt;a href=&quot;http://webtest.canoo.com&quot;&gt;Canoo WebTest&lt;/a&gt;). The Password Hint test kept failing with the following error:
&lt;/p&gt;
&lt;pre&gt;
[ERROR] /Users/mraible/dev/appfuse/web/jsf/src/test/resources/web-tests.xml:51: JavaScript error loading
page http://localhost:9876/appfuse-jsf-2.1.0-SNAPSHOT/passwordHint?username=admin: syntax error (http://
localhost:9876/appfuse-jsf-2.1.0-SNAPSHOT/javax.faces.resource/oamSubmit.js.jsf?ln=org.apache.myfaces#122)
&lt;/pre&gt;
&lt;p&gt;Figuring this was caused by my hack to &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/jsf/src/main/webapp/passwordHint.xhtml?r=2866&quot;&gt;submit the form when the page was loaded&lt;/a&gt;, I turned to &lt;a href=&quot;http://ocpsoft.com/prettyfaces/&quot;&gt;Pretty Faces&lt;/a&gt;, which allows you to call a method directly from a URL. After adding the Pretty Faces dependencies to my pom.xml, I created a src/main/webapp/WEB-INF/pretty-config.xml file with the following XML:&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;url-mapping&amp;gt;
    &amp;lt;pattern value=&quot;/editProfile&quot;/&amp;gt;
    &amp;lt;view-id value=&quot;/userForm.jsf&quot;/&amp;gt;
    &amp;lt;action&amp;gt;#{userForm.edit}&amp;lt;/action&amp;gt;
&amp;lt;/url-mapping&amp;gt;

&amp;lt;url-mapping&amp;gt;
    &amp;lt;pattern value=&quot;/passwordHint/#{username}&quot;/&amp;gt;
    &amp;lt;view-id value=&quot;/passwordHint.jsf&quot;/&amp;gt;
    &amp;lt;action&amp;gt;#{passwordHint.execute}&amp;lt;/action&amp;gt;
&amp;lt;/url-mapping&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This allowed me to remove both editProfile.xhtml and passwordHint.xhtml, both of which simply auto-submitted forms.&lt;/p&gt;
&lt;p&gt;At this point, I figured I&apos;d be good to go and ran my integration tests again. The first thing I discovered was that &quot;.jsf&quot; was being tacked onto my pretty URL, most likely by the UrlRewriteFilter. Adding the following to my PasswordHint.java class solved this.
&lt;/p&gt;
&lt;pre class=&quot;brush: java; toolbar: false&quot;&gt;
if (username.endsWith(&quot;.jsf&quot;)) {
    username = username.substring(0, username.indexOf(&quot;.jsf&quot;));
}
&lt;/pre&gt;
&lt;p&gt;The next thing was a cryptic error that took me a while to figure out.&lt;/p&gt;
&lt;pre&gt;
DEBUG [1152467051@qtp-144702232-0] PasswordHint.execute(38) | Processing Password Hint...
2011-03-05 05:48:52.471:WARN::/passwordHint/admin
com.ocpsoft.pretty.PrettyException: Exception occurred while processing &amp;lt;:#{passwordHint.execute}&gt; null
        at com.ocpsoft.pretty.faces.beans.ActionExecutor.executeActions(ActionExecutor.java:71)
        at com.ocpsoft.pretty.faces.event.PrettyPhaseListener.processEvent(PrettyPhaseListener.java:214)
        at com.ocpsoft.pretty.faces.event.PrettyPhaseListener.afterPhase(PrettyPhaseListener.java:108)
        at org.apache.myfaces.lifecycle.PhaseListenerManager.informPhaseListenersAfter(PhaseListenerManager.java:111)
        at org.apache.myfaces.lifecycle.LifecycleImpl.executePhase(LifecycleImpl.java:185)
        at org.apache.myfaces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:189)
&lt;/pre&gt;
&lt;p&gt;Digging into the bowels of MyFaces, I discovered a class was looking for a viewId with an extension and no view-id was being set. Adding the following to the top of my execute() method solved this.
&lt;/p&gt;
&lt;pre class=&quot;brush: java; toolbar: false&quot;&gt;
getFacesContext().getViewRoot().setViewId(&quot;/passwordHint.xhtml&quot;);
&lt;/pre&gt;
&lt;p&gt;After making this change, all AppFuse&apos;s integration tests are passing and the upgrade seems complete. The only other issues I encountered were logging-related. The first is an error about Tomahawk that doesn&apos;t seem to affect anything.
&lt;/p&gt;
&lt;pre&gt;
Mar 5, 2011 6:44:01 AM com.sun.facelets.compiler.TagLibraryConfig loadImplicit
SEVERE: Error Loading Library: jar:file:/Users/mraible/.m2/repository/org/apache/myfaces/tomahawk/tomahawk20/1.1.10/tomahawk20-1.1.10.jar!/META-INF/tomahawk.taglib.xml
java.io.IOException: Error parsing [jar:file:/Users/mraible/.m2/repository/org/apache/myfaces/tomahawk/tomahawk20/1.1.10/tomahawk20-1.1.10.jar!/META-INF/tomahawk.taglib.xml]: 
        at com.sun.facelets.compiler.TagLibraryConfig.create(TagLibraryConfig.java:410)
        at com.sun.facelets.compiler.TagLibraryConfig.loadImplicit(TagLibraryConfig.java:431)
        at com.sun.facelets.compiler.Compiler.initialize(Compiler.java:87)
        at com.sun.facelets.compiler.Compiler.compile(Compiler.java:104)
&lt;/pre&gt;
&lt;p&gt;The second is excessive logging from MyFaces. As far as I can tell, this is because MyFaces switched to java.util.logging instead of commons logging. With all the frameworks that AppFuse leverages, I think it has all the logging frameworks in its classpath now. I was hoping to fix this by &lt;a href=&quot;http://old.nabble.com/Turn-down-logging-in-2.0.4--td31068698.html&quot;&gt;posting a message to the mailing list&lt;/a&gt;, but haven&apos;t received a reply yet.
&lt;/p&gt;
&lt;pre&gt;
[WARNING] [talledLocalContainer] Mar 5, 2011 6:50:25 AM org.apache.myfaces.config.annotation.TomcatAnnotationLifecycleProvider newInstance
[WARNING] [talledLocalContainer] INFO: Creating instance of org.appfuse.webapp.action.BasePage
[WARNING] [talledLocalContainer] Mar 5, 2011 6:50:25 AM org.apache.myfaces.config.annotation.TomcatAnnotationLifecycleProvider destroyInstance
[WARNING] [talledLocalContainer] INFO: Destroy instance of org.appfuse.webapp.action.BasePage
&lt;/pre&gt;
&lt;p&gt;After successfully upgrading AppFuse, I turned to AppFuse Light, where things were &lt;a href=&quot;http://source.appfuse.org/changelog/appfuse-light/?cs=243&quot;&gt;much easier&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
Now that AppFuse uses JSF 2, I hope to start leveraging some of its &lt;a href=&quot;http://www.ibm.com/developerworks/java/library/j-jsf2fu1/index.html&quot;&gt;new features&lt;/a&gt;. If you&apos;re yearning to get started with them today, I invite you to &lt;a href=&quot;http://appfuse.org/display/APF/Source+Repository&quot;&gt;grab the source&lt;/a&gt; and start integrating them yourself.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/implementing_extensionless_urls_with_tapestry</guid>
    <title>Implementing Extensionless URLs with Tapestry, Spring MVC, Struts 2 and JSF</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/implementing_extensionless_urls_with_tapestry</link>
        <pubDate>Thu, 10 Feb 2011 16:53:27 -0700</pubDate>
    <category>Java</category>
    <category>tapestry5</category>
    <category>extensionlessurls</category>
    <category>jsf</category>
    <category>springmvc</category>
    <category>struts2</category>
    <category>appfuse</category>
    <category>webframeworks</category>
    <category>java</category>
            <description>For the past couple of weeks, I&apos;ve spent several evening hours implementing extensionless URLs in &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;. I&apos;ve been wanting to do this ever since I &lt;a href=&quot;http://raibledesigns.com/rd/entry/extensionless_urls_in_java_web&quot;&gt;wrote about how to do it&lt;/a&gt; a few years ago. This article details my experience and will hopefully help others implement this feature in their webapps.
&lt;/p&gt;
&lt;p&gt;First of all, I used the &lt;a href=&quot;http://www.tuckey.org/urlrewrite/&quot;&gt;UrlRewriteFilter&lt;/a&gt;, one of my favorite Java open source projects. Then I followed a pattern I found in Spring&apos;s &quot;mvc-basic&quot; sample app from &lt;a href=&quot;http://blog.springsource.com/2009/12/21/mvc-simplifications-in-spring-3-0/&quot;&gt;MVC Simplifications in Spring 3.0&lt;/a&gt;. The app has since changed (because SpringSource integrated UrlRewriteFilter-type functionality in Spring MVC), but the pattern was basically path-matching instead of extension-mapping. That is, the &quot;dispatcher&quot; for the web framework was mapped to /app/* instead of *.html. 
&lt;/p&gt;
&lt;p&gt;
Prior to the move to extensionless URLs, AppFuse used *.html for its mapping and this seemed to cause users problems when they wanted to serve up static HTML files. To begin with, I removed all extensions from URLs in tests (&lt;a href=&quot;http://webtest.canoo.com&quot;&gt;Canoo WebTest&lt;/a&gt; is used for testing the UI). I also did this for any links in the view pages and redirects in the Java code. This provided a decent foundation to verify my changes worked. Below are details about each framework I did this for, starting with the one that was easiest and moving to hardest.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tapestry 5&lt;/strong&gt;&lt;br/&gt;
Tapestry was by far the easiest to integrate extensionless URLs into. This is because it&apos;s a native feature of the framework and was already integrated as part of &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1116&quot;&gt;Serge Eby&apos;s Tapestry 5 implementation&lt;/a&gt;. In the end, the only things I had to do where 1) add a couple entries for CXF (mapped to /services/*) and DWR (/dwr/*) to my urlrewrite.xml and 2) change the UrlRewriteFilter so it was only mapped to REQUEST instead of both REQUEST and FORWARD. Below are the mappings I added for CXF and DWR.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;urlrewrite default-match-type=&quot;wildcard&quot;&amp;gt;
    ...
    &amp;lt;rule&amp;gt;
        &amp;lt;from&amp;gt;/dwr/**&amp;lt;/from&amp;gt;
        &amp;lt;to&amp;gt;/dwr/$1&amp;lt;/to&amp;gt;
    &amp;lt;/rule&amp;gt;
    &amp;lt;rule&amp;gt;
        &amp;lt;from&amp;gt;/services/**&amp;lt;/from&amp;gt;
        &amp;lt;to&amp;gt;/services/$1&amp;lt;/to&amp;gt;
    &amp;lt;/rule&amp;gt;
&amp;lt;/urlrewrite&amp;gt;
&lt;/pre&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spring MVC&lt;/strong&gt;&lt;br/&gt;
I had a fair amount of experience with Spring MVC and extensionless URLs. Both the Spring MVC applications we developed last year at Time Warner Cable used them. To change from a *.html mapping to /app/* was pretty easy and involved removing more code than I added. Previously, I had a &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/common/src/main/java/org/appfuse/webapp/filter/StaticFilter.java?r=3250&quot;&gt;StaticFilter&lt;/a&gt; that looked for HTML files and if it didn&apos;t find them, it dispatched to Spring&apos;s DispatcherServlet. I was able to remove this class and make the web.xml file quite a bit cleaner. 
&lt;/p&gt;
&lt;p&gt;To make UrlRewriteFilter and Spring Security play well together, I had to move the securityFilter so it came &lt;em&gt;after&lt;/em&gt; the rewriteFilter and add an INCLUDE dispatcher so included JSPs would have a security context available to them. 
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;filter-mapping&amp;gt;
    &amp;lt;filter-name&amp;gt;rewriteFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
&amp;lt;/filter-mapping&amp;gt;
&amp;lt;filter-mapping&amp;gt;
    &amp;lt;filter-name&amp;gt;securityFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;/*&amp;lt;/url-pattern&amp;gt;
    &amp;lt;dispatcher&amp;gt;REQUEST&amp;lt;/dispatcher&amp;gt;
    &amp;lt;dispatcher&amp;gt;FORWARD&amp;lt;/dispatcher&amp;gt;
    &amp;lt;dispatcher&amp;gt;INCLUDE&amp;lt;/dispatcher&amp;gt;
&amp;lt;/filter-mapping&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The only other things I had to change were &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/spring/src/main/webapp/WEB-INF/security.xml?r2=3458&amp;r1=3379&quot;&gt;security.xml&lt;/a&gt; and &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/spring/src/main/webapp/WEB-INF/dispatcher-servlet.xml?r2=3458&amp;r1=3334&quot;&gt;dispatcher-servlet.xml&lt;/a&gt; to remove the .html extensions. The urlrewrite.xml file was fairly straightforward. I used the following at the bottom as a catch-all for dispatching to Spring MVC.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;rule&amp;gt;
    &amp;lt;from&amp;gt;/**&amp;lt;/from&amp;gt;
    &amp;lt;to&amp;gt;/app/$1&amp;lt;/to&amp;gt;
&amp;lt;/rule&amp;gt;
&amp;lt;outbound-rule&amp;gt;
    &amp;lt;from&amp;gt;/app/**&amp;lt;/from&amp;gt;
    &amp;lt;to&amp;gt;/$1&amp;lt;/to&amp;gt;
&amp;lt;/outbound-rule&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
Then I added a number of other rules for j_security_check, DWR, CXF and static assets (/images, /scripts, /styles, /favicon.ico). You can view the &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/spring/src/main/webapp/WEB-INF/urlrewrite.xml?r=HEAD&quot;&gt;current urlrewrite.xml in FishEye&lt;/a&gt;. The only major issue I ran into was that Spring Security recorded protected URLs as /app/URL so I had to add a rule to redirect when this happened after logging in.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;rule&amp;gt;
    &amp;lt;from&amp;gt;/app/**&amp;lt;/from&amp;gt;
    &amp;lt;to last=&quot;true&quot; type=&quot;redirect&quot;&amp;gt;%{context-path}/$1&amp;lt;/to&amp;gt;
&amp;lt;/rule&amp;gt;
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Struts 2&lt;/strong&gt;&lt;br/&gt;
Using extensionless URLs with Struts 2 is likely pretty easy thanks to the &lt;a href=&quot;http://struts.apache.org/2.1.8/docs/convention-plugin.html&quot;&gt;Convention Plugin&lt;/a&gt;. Even though this plugin is included in AppFuse, it&apos;s not configured with the proper &lt;a href=&quot;http://struts.apache.org/2.1.8/docs/converting-application-from-codebehind-to-convention-plugin.html&quot;&gt;constants&lt;/a&gt; and I have struts.convention.action.disableScanning=true in struts.xml. It looks like I had to do this when I &lt;a href=&quot;http://appfuse.markmail.org/thread/ktbqtx2mslvrkjkq&quot;&gt;upgraded from Struts 2.0.x to Struts 2.1.6&lt;/a&gt;. It&apos;s true AppFuse&apos;s Struts 2 support could use a bit of love to be aligned with Struts 2&apos;s recommended practices, but I didn&apos;t want to spend the time doing it as part of this exercise. 
&lt;/p&gt;
&lt;p&gt;With Struts 2, I tried the path-mapping like I did with Spring MVC, but ran into issues. Instead, I opted to use an &quot;.action&quot; extension by changing &lt;code&gt;struts.action.extension&lt;/code&gt; from &quot;html&quot; to &quot;action,&quot; in struts.xml. Then I had to do a bunch of filter re-ordering and dispatcher changes. Before, with a .html extension, I had all filters mapped to /* and in the following order.&lt;/p&gt;
&lt;table class=&quot;comparison&quot; style=&quot;width: 250px&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Filter Name&lt;/th&gt;&lt;th&gt;Dispatchers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;securityFilter&lt;/td&gt;
&lt;td&gt;request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;rewriteFilter&lt;/td&gt;
&lt;td&gt;request, forward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;struts-prepare&lt;/td&gt;
&lt;td&gt;request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sitemesh&lt;/td&gt;
&lt;td&gt;request, forward, include&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;staticFilter&lt;/td&gt;
&lt;td&gt;request, forward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;struts&lt;/td&gt;
&lt;td&gt;request&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Similar to Spring MVC, I had to remove the rewriteFilter in front of the securityFilter and I was able to remove the staticFilter. I also had to map the struts filter to *.action instead of /* to stop Struts from trying to catch static asset and DWR/CXF requests. Below is the order of filters and their dispatchers that seems to work best.
&lt;table class=&quot;comparison&quot; style=&quot;width: 250px&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Filter Name&lt;/th&gt;&lt;th&gt;Dispatchers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;rewriteFilter&lt;/td&gt;
&lt;td&gt;request&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;securityFilter&lt;/td&gt;
&lt;td&gt;request, forward, include&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;struts-prepare&lt;/td&gt;
&lt;td&gt;request, forward&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sitemesh&lt;/td&gt;
&lt;td&gt;request, forward, include&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;struts&lt;/td&gt;
&lt;td&gt;forward&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;From there, it was a matter of modifying &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/struts/src/main/webapp/WEB-INF/urlrewrite.xml?r=HEAD&quot;&gt;urlrewrite.xml&lt;/a&gt; to have the following catch-all and rules for static assets, j_security_check and DWR/CXF.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;rule match-type=&quot;regex&quot;&amp;gt;
    &amp;lt;from&amp;gt;^(&amp;#91;^?&amp;#93;*)/(&amp;#91;^?/\.&amp;#93;+)(\?.*)?$&amp;lt;/from&amp;gt;
    &amp;lt;to last=&quot;true&quot;&amp;gt;$1/$2.action$3&amp;lt;/to&amp;gt;
&amp;lt;/rule&amp;gt;
&amp;lt;outbound-rule match-type=&quot;regex&quot;&amp;gt;
    &amp;lt;from&amp;gt;^(.*)\.action(\?.*)?$&amp;lt;/from&amp;gt;
    &amp;lt;to last=&quot;false&quot;&amp;gt;$1$2&amp;lt;/to&amp;gt;
&amp;lt;/outbound-rule&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;JSF&lt;/strong&gt;&lt;br/&gt;
JSF was by far the most difficult to get extensionless URLs working with. I&apos;m not convinced it&apos;s impossible, but I spent a several hours over a few days and was unsuccessful in completely removing them. I was able to make things work so I could request pages without an extension, but found when clicking buttons and links, the extension would often show up in the URL. I&apos;m also still using JSF 1.2, so it&apos;s possible that upgrading to 2.0 would solve many of the issues I encountered. &lt;/p&gt;
&lt;p&gt;For the time being, I&apos;ve changed my FacesServlet mapping from *.html to *.jsf. As with Struts, I had issues when I tried to map it to /app/*. Other changes include &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/jsf/src/main/webapp/WEB-INF/web.xml?r1=3384&amp;r2=3458#l188&quot;&gt;changing the order of dispatchers and filters&lt;/a&gt;, the good ol&apos; catch-all in &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/jsf/src/main/webapp/WEB-INF/urlrewrite.xml?r=HEAD&quot;&gt;urlrewrite.xml&lt;/a&gt; and &lt;a href=&quot;http://source.appfuse.org/browse/appfuse/trunk/web/jsf/src/main/webapp/WEB-INF/security.xml?r1=3384&amp;r2=3458#l188&quot;&gt;modifying security.xml&lt;/a&gt;. For some reason, I wasn&apos;t able to get file upload working without adding an exception to the outbound-rule.&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;rule match-type=&quot;regex&quot;&amp;gt;
    &amp;lt;from&amp;gt;^(&amp;#91;^?&amp;#93;*)/(&amp;#91;^?/\.&amp;#93;+)(\?.*)?$&amp;lt;/from&amp;gt;
    &amp;lt;to last=&quot;true&quot;&amp;gt;$1/$2.jsf&amp;lt;/to&amp;gt;
&amp;lt;/rule&amp;gt;
&amp;lt;outbound-rule match-type=&quot;regex&quot;&amp;gt;
  &amp;lt;!-- TODO: Figure out how to make file upload work w/o using *.jsf --&amp;gt;
    &amp;lt;condition type=&quot;path-info&quot;&amp;gt;selectFile&amp;lt;/condition&amp;gt;
    &amp;lt;from&amp;gt;^(.*)\.jsf(\?.*)?$&amp;lt;/from&amp;gt;
    &amp;lt;to last=&quot;false&quot;&amp;gt;$1$2&amp;lt;/to&amp;gt;
&amp;lt;/outbound-rule&amp;gt;
&lt;/pre&gt;
&lt;p&gt;I also spent a couple hours trying to get &lt;a href=&quot;http://ocpsoft.com/prettyfaces/&quot;&gt;Pretty Faces&lt;/a&gt; to work. I wrote about my issues &lt;a href=&quot;http://ocpsoft.com/support/topic/rewrite-every-jsf&quot;&gt;on the forums&lt;/a&gt;. I tried writing a custom Processor to strip the extension, but found that I&apos;d get into an infinite loop where the processor kept getting called. To workaround this, I tried using Spring&apos;s RequestContextHolder to ensure the processor only got invoked once, but that proved fruitless. Finally, I tried inbound &lt;em&gt;and&lt;/em&gt; outbound custom processors, but failed to get those working. The final thing I tried was url-mappings for each page in pretty-config.xml.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;url-mapping&amp;gt;
  &amp;lt;pattern value=&quot;/admin/users&quot;/&amp;gt;
  &amp;lt;view-id value=&quot;/admin/users.jsf&quot;/&amp;gt;
&amp;lt;/url-mapping&amp;gt;
&amp;lt;url-mapping&amp;gt;
  &amp;lt;pattern value=&quot;/mainMenu&quot;/&amp;gt;
  &amp;lt;view-id value=&quot;/mainMenu.jsf&quot;/&amp;gt;
&amp;lt;/url-mapping&amp;gt;
&lt;/pre&gt;
&lt;p&gt;The issue with doing this was that some of the navigation rules in my faces-config.xml stopped working. I didn&apos;t spend much time trying to diagnose the problem because I didn&apos;t like having to add an entry for each page in the application. The one nice thing about Pretty Faces is it did allow me to do things like the following, which I formerly did with a form that auto-submitted when the page loaded.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;url-mapping&amp;gt;
  &amp;lt;pattern value=&quot;/passwordHint/#{username}&quot;/&amp;gt;
  &amp;lt;view-id value=&quot;/passwordHint.jsf&quot;/&amp;gt;
  &amp;lt;action&amp;gt;#{passwordHint.execute}&amp;lt;/action&amp;gt;
&amp;lt;/url-mapping&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br/&gt;
My journey implementing extensionless URLs was an interesting one, and I solidified my knowledge about ordering of filters, dispatchers and the UrlRewriteFilter. I still think I have more to learn about properly implementing extensionless URLs in Struts 2 and JSF and I hope to do that in the near future. I believe Struts&apos; Convention Plugin will help me and JSF 2 + Pretty Faces will hopefully work nicely too. Of course, it&apos;d be great if all Java Web Frameworks had an easy mechanism for producing and consuming extensionless URLs. In the meantime, thank goodness for the UrlRewriteFilter.
&lt;/p&gt;
&lt;p&gt;If you&apos;d like to try AppFuse and its shiny new URLs, see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; and choose the 2.1.0-SNAPSHOT version.

</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_2_1_milestone_2</guid>
    <title>AppFuse 2.1 Milestone 2 Released</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_2_1_milestone_2</link>
        <pubDate>Mon, 15 Nov 2010 15:28:57 -0700</pubDate>
    <category>Java</category>
    <category>myfaces</category>
    <category>appfuse-light</category>
    <category>webframeworks</category>
    <category>java</category>
    <category>appfuse</category>
    <category>jsf</category>
    <category>springmvc</category>
    <category>freemarker</category>
    <category>wicket</category>
    <category>maven2</category>
    <category>spring</category>
    <category>maven</category>
    <category>stripes</category>
    <category>hibernate</category>
    <category>java5</category>
    <category>ibatis</category>
    <category>archetypes</category>
    <category>jpa</category>
    <category>tapestry</category>
    <category>maven3</category>
    <category>struts2</category>
            <description>I&apos;m pleased to announce the 2nd milestone release of AppFuse 2.1. This release includes upgrades to all dependencies to bring them up-to-date with their latest releases. Most notable are Spring 3 and Struts 2.1. This release fixes many issues with archetypes and contains many improvements to support Maven 3. For more details on specific changes see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.1.0+M2&quot;&gt;2.1.0 M2 release notes&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;What is AppFuse?&lt;/strong&gt;&lt;br/&gt;
AppFuse is an open source project and application that uses open source frameworks to help you develop Web applications quickly and efficiently. It was originally developed to eliminate the ramp-up time when building new web applications. At its core, AppFuse is a project skeleton, similar to the one that&apos;s created by your IDE when you click through a wizard to create a new web project. If you use &lt;a href=&quot;http://raibledesigns.com/rd/entry/using_jrebel_with_intellij_idea&quot;&gt;JRebel with AppFuse&lt;/a&gt;, you can achieve zero-turnaround in your project and develop features without restarting the server.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;
Release Details&lt;/strong&gt;&lt;br/&gt;
Archetypes now include all the source for the web modules so using jetty:run and your IDE will work much smoother now. The backend is still embedded in JARs, enabling you to choose with persistence framework (Hibernate, iBATIS or JPA) you&apos;d like to use. If you want to modify the source for that, &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+Core+Classes&quot;&gt;add the core classes to your project&lt;/a&gt; or run &quot;appfuse:full-source&quot;.
&lt;/p&gt;
&lt;p&gt;
AppFuse comes in a number of different flavors. It offers &quot;light&quot;, &quot;basic&quot; and &quot;modular&quot; and archetypes. Light archetypes use an embedded H2 database and contain a simple CRUD example. In the final 2.1.0 release, the light archetypes will allow code generation like the basic and modular archetypes. Basic archetypes have web services using CXF, authentication from Spring Security and features including signup, login, file upload and CSS theming. Modular archetypes are similar to basic archetypes, except they have multiple modules which allows you to separate your services from your web project.
&lt;/p&gt;
&lt;p&gt;
AppFuse provides &lt;a href=&quot;http://static.appfuse.org/archetype.html&quot;&gt;archetypes&lt;/a&gt; for JSF, Spring MVC, Struts 2 and Tapestry 5. The light archetypes are available for these frameworks, as well as for Spring MVC + FreeMarker, Stripes and Wicket.
&lt;/p&gt;
&lt;p&gt;
Please note that this release does not contain updates to the documentation. Code generation will work, but it&apos;s likely that some content in the &lt;a href=&quot;http://appfuse.org/display/APF/Tutorials&quot;&gt;tutorials&lt;/a&gt; won&apos;t match. For example, you can use annotations (vs. XML) for Spring MVC and Tapestry is a whole new framework. I&apos;ll be working on documentation over the next several weeks in preparation for the 2.1 final release.
&lt;/p&gt;
&lt;p&gt;
For information on creating a new project, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
If you have questions about AppFuse, please read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot;&gt;FAQ&lt;/a&gt; or join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot;&gt;user mailing list&lt;/a&gt;. If you find bugs, please &lt;a href=&quot;http://issues.appfuse.org/browse/APF&quot;&gt;create an issue in JIRA&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
Thanks to everyone for their help contributing patches, writing documentation and participating on the mailing lists.
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/happy_8th_birthday_to_this</guid>
    <title>Happy 8th Birthday to this blog!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/happy_8th_birthday_to_this</link>
        <pubDate>Sun, 1 Aug 2010 15:48:38 -0600</pubDate>
    <category>Roller</category>
    <category>birthday</category>
    <category>appfuse</category>
    <category>devoxx2010</category>
    <category>java</category>
    <category>abbie</category>
    <category>jack</category>
    <category>roller</category>
    <category>blogiversary</category>
            <description>Eight years ago today, this blog &lt;a href=&quot;http://raibledesigns.com/page/rd/20020801&quot;&gt;was born&lt;/a&gt; in the wee hours of the morning. I was inspired to start it after reading &lt;a href=&quot;http://onjava.com/pub/a/onjava/2002/04/17/wblogosj2ee.html&quot;&gt;Dave Johnson&apos;s article on Roller&lt;/a&gt;. I have to say, it&apos;s been a great ride and I remember the early days like they were yesterday. Many of the Java bloggers wrote daily and shared short tips, tricks and snippets on their blogs; much in the same way we do on Twitter today.&lt;/p&gt;
&lt;p&gt;A lot has happened in my life since this blog was started: &lt;a href=&quot;http://raibledesigns.com/rd/entry/our_little_girl_has_arrived1&quot;&gt;Abbie was born&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/rd/entry/our_little_boy_has_arrived&quot;&gt;Jack was born&lt;/a&gt;, I &lt;a href=&quot;http://today.java.net/pub/a/today/2004/07/15/thefuse.html&quot;&gt;started AppFuse&lt;/a&gt;, &lt;a href=&quot;http://www.amazon.com/Spring-Primer-Matt-Raible/dp/0974884375&quot;&gt;wrote Spring Live&lt;/a&gt;, had some &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_linkedin_journey_continues&quot;&gt;really&lt;/a&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/enhancing_evite_com_with_gwt&quot;&gt;cool&lt;/a&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/how_we_hired_a_team&quot;&gt;gigs&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/5_years&quot;&gt;gained a whole new perspective on my life&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
For those long time readers, you might&apos;ve noticed the vacation posts have picked up recently and the technology posts have subsided somewhat. The good news is this indicates I&apos;m having a lot of fun; the bad news is I&apos;m not learning as much as I&apos;d like. Hopefully that&apos;ll change soon and I&apos;ll be writing about developing apps for the online video space in the near future. There&apos;s a good chance the posts about my life and how much fun I&apos;m having will continue, especially as Abbie and Jack continue to grow into world-class skiers. 
&lt;/p&gt;
&lt;p&gt;As usual, I have many ambitions for this fall, including &lt;a href=&quot;http://rollerweblogger.org/project/entry/roller_needs_you&quot;&gt;helping Apache Roller&lt;/a&gt;, finishing AppFuse 2.1 and learning how to play the guitar. Along the way, I&apos;ll be helping build/release some kick-ass software for a major cable provider, building a sauna in my basement and enjoying the hell out of &lt;a href=&quot;http://www.devoxx.com/display/Devoxx2K10/Matt+Raible&quot;&gt;Devoxx 2010&lt;/a&gt;. You can sure I&apos;ll be blogging about these along the way, as well as many years into the future.&lt;/p&gt;
&lt;p&gt;Thanks for reading all these years, it&apos;s been a fantastic experience. &lt;img src=&quot;https://raibledesigns.com/images/smileys/smile.gif&quot; class=&quot;smiley&quot; alt=&quot;:)&quot; title=&quot;:)&quot; /&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/adding_expires_headers_with_oscache</guid>
    <title>Adding Expires Headers with OSCache&apos;s CacheFilter</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/adding_expires_headers_with_oscache</link>
        <pubDate>Mon, 23 Nov 2009 11:17:05 -0700</pubDate>
    <category>Roller</category>
    <category>oscache</category>
    <category>appfuse</category>
    <category>roller</category>
    <category>ehcache</category>
    <category>highperformance</category>
    <category>expiresheaders</category>
            <description>A couple of weeks ago, I wrote about how I improved this site&apos;s YSlow grade by &lt;a href=&quot;http://raibledesigns.com/rd/entry/javascript_and_css_concatenation&quot;&gt;concatenating JavaScript and CSS with wro4j&lt;/a&gt;. Even though I loved the improvements, there was still work to do:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I&apos;m now sitting at a YSlow (V2) score of 75; 90 if I use the &quot;Small Site or Blog&quot; ruleset. I believe I can improve this by adding expires headers to my images, js and css.
&lt;/p&gt;
&lt;p&gt;Last Monday, &lt;a href=&quot;http://groups.google.com/group/wro4j/browse_thread/thread/364dc86a194d712a&quot;&gt;wro4j 1.1.0 was released&lt;/a&gt; and I thought it would solve my last remaining issue. Unfortunately, it only adds expires headers (and ETags) to images referenced in included CSS. Of course, this makes sense, but I thought they&apos;d add a filter to explicitly add expires headers.&lt;/p&gt;
&lt;p&gt;Since I still wanted this feature, I did some searching around and found what I was looking for: &lt;a href=&quot;http://www.opensymphony.com/oscache/wiki/CacheFilter.html&quot;&gt;OSCache&apos;s CacheFilter&lt;/a&gt;. It was surprisingly easy to setup, I &lt;a href=&quot;https://oscache.dev.java.net/files/documents/629/61424/oscache-2.4.1.jar&quot;&gt;downloaded OSCache 2.4.1&lt;/a&gt;, added it to my WEB-INF/lib directory, and added the following to my web.xml.
&lt;/p&gt;
&lt;pre class=&quot;brush: xml&quot;&gt;
&amp;lt;filter&amp;gt;
    &amp;lt;filter-name&amp;gt;CacheFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;filter-class&amp;gt;com.opensymphony.oscache.web.filter.CacheFilter&amp;lt;/filter-class&amp;gt;
    &amp;lt;init-param&amp;gt;
        &amp;lt;param-name&amp;gt;expires&amp;lt;/param-name&amp;gt;
        &amp;lt;param-value&amp;gt;time&amp;lt;/param-value&amp;gt;
    &amp;lt;/init-param&amp;gt;
    &amp;lt;init-param&amp;gt;
        &amp;lt;param-name&amp;gt;time&amp;lt;/param-name&amp;gt;
        &amp;lt;param-value&amp;gt;2592000&amp;lt;/param-value&amp;gt; &amp;lt;!-- one month --&amp;gt;
    &amp;lt;/init-param&amp;gt;
    &amp;lt;init-param&amp;gt;
        &amp;lt;param-name&amp;gt;scope&amp;lt;/param-name&amp;gt;
        &amp;lt;param-value&amp;gt;session&amp;lt;/param-value&amp;gt;
    &amp;lt;/init-param&amp;gt;
&amp;lt;/filter&amp;gt;

&amp;lt;filter-mapping&amp;gt;
    &amp;lt;filter-name&amp;gt;CacheFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;*.gif&amp;lt;/url-pattern&amp;gt;
&amp;lt;/filter-mapping&amp;gt;
&amp;lt;filter-mapping&amp;gt;
    &amp;lt;filter-name&amp;gt;CacheFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;*.jpg&amp;lt;/url-pattern&amp;gt;
&amp;lt;/filter-mapping&amp;gt;
&amp;lt;filter-mapping&amp;gt;
    &amp;lt;filter-name&amp;gt;CacheFilter&amp;lt;/filter-name&amp;gt;
    &amp;lt;url-pattern&amp;gt;*.png&amp;lt;/url-pattern&amp;gt;
&amp;lt;/filter-mapping&amp;gt;
&lt;/pre&gt;
&lt;p&gt;After restarting Tomcat and clearing out my Firefox cache, I was in business. 
&lt;/p&gt;
&lt;p&gt;
I did experience one issue along the way when I tried to remove the oscache.jar from my WEB-INF/lib directory. I&apos;m using the &lt;a href=&quot;http://wiki.java.net/bin/view/Javanet/JSPWikiPlugin&quot;&gt;JSPWiki Plugin&lt;/a&gt; and it seems to rely on a class in oscache.jar. I&apos;m not sure which version oscache.jar is, but the packages got moved around somewhere along the way. The good news is it seems OK to have both oscache.jar and oscache-2.4.1.jar in Roller&apos;s classpath.
&lt;/p&gt;
&lt;p&gt;After discovering the duplicate JARs issue, I got to thinkin&apos; that EhCache would probably have a solution. Sure enough, it has a &lt;a href=&quot;http://ehcache.org/documentation/web_caching.html&quot;&gt;SimpleCachingHeadersPageCachingFilter&lt;/a&gt;. Since I already had a working solution, I didn&apos;t bother trying EhCache (especially since my Roller install uses EhCache 1.1 and the filter is only available in a later version). However, when I implement expires headers in &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;, I&apos;ll definitely try EhCache&apos;s solution.&lt;/p&gt;
&lt;p&gt;As for my YSlow score, it didn&apos;t improve as much as I&apos;d hoped (low 80s instead of mid 80s). Some of this is due to my &lt;a href=&quot;http://raibledesigns.com/rd/entry/building_sofea_applications_with_gwt&quot;&gt;embedded presentation from Slideshare&lt;/a&gt;. There&apos;s also some external images I&apos;m using in my &lt;a href=&quot;http://raibledesigns.com/rd/entry/lightbox_js&quot;&gt;Lightbox JS&lt;/a&gt; implementation. So if I can find a better Lightbox implementation (supports rel=&quot;lightbox&quot; syntax), there&apos;s a good chance I&apos;ll switch. In the meantime, I&apos;m lovin&apos; how much faster this site loads.
&lt;/p&gt;
&lt;p&gt;In case you&apos;re wondering, I do plan on adding css/js concatenation and expires headers to both AppFuse 2.1 and &lt;a href=&quot;http://roller.apache.org&quot;&gt;Roller&lt;/a&gt; 5.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; FWIW, I did try to configure expires headers in Apache, but the AJP 1.3 Connector doesn&apos;t seem to allow this to work. To quote Keith from &lt;a href=&quot;http://kgbinternet.com/&quot;&gt;KGB Internet&lt;/a&gt;:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I added an expires directive and it didn&apos;t touch the header for anything served from Tomcat, but does for content served directly by Apache.  This might have to be set up in Tomcat.
&lt;/p&gt;&lt;p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_2_1_milestone_1</guid>
    <title>AppFuse 2.1 Milestone 1 Released</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_2_1_milestone_1</link>
        <pubDate>Thu, 19 Nov 2009 07:16:36 -0700</pubDate>
    <category>Java</category>
    <category>webframeworks</category>
    <category>tapestry</category>
    <category>archetypes</category>
    <category>appfuse-light</category>
    <category>appfuse</category>
    <category>freemarker</category>
    <category>java</category>
    <category>wicket</category>
    <category>maven2</category>
    <category>spring</category>
    <category>springmvc</category>
    <category>jsf</category>
    <category>stripes</category>
    <category>maven</category>
    <category>struts2</category>
    <category>hibernate</category>
    <category>java5</category>
    <category>myfaces</category>
    <category>ibatis</category>
    <category>jpa</category>
            <description>&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the first milestone release of AppFuse 2.1. This release includes upgrades to all dependencies to bring them up-to-date with their latest releases. Most notable are &lt;a href=&quot;http://raibledesigns.com/rd/entry/upgrading_hibernate_to_3_4&quot;&gt;Hibernate&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/rd/entry/moving_from_spring_s_xml&quot;&gt;Spring&lt;/a&gt; and Tapestry 5. 
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What is AppFuse?&lt;/strong&gt;&lt;br/&gt;
AppFuse is an open source project and application that uses open source tools built on the Java platform to help you develop Web applications quickly and efficiently. It was originally developed to eliminate the ramp-up time found when building new web applications for customers. At its core, AppFuse is a project skeleton, similar to the one that&apos;s created by your IDE when you click through a wizard to create a new web project.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Release Details&lt;/strong&gt;&lt;br/&gt;
&lt;a href=&quot;http://static.appfuse.org/archetypes.html&quot;&gt;Archetypes&lt;/a&gt; now include all the source for the web modules so using &lt;em&gt;jetty:run&lt;/em&gt; and your IDE will work much smoother now. The backend is still embedded in JARs, enabling you to choose which persistence framework (Hibernate, iBATIS or JPA) you&apos;d like to use. If you want to modify the source for that, &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+Core+Classes&quot;&gt;add the core classes to your project&lt;/a&gt; or run &lt;em&gt;appfuse:full-source&lt;/em&gt;. 
&lt;/p&gt;
&lt;p&gt;
In addition, AppFuse Light has been &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_converted_to_maven&quot;&gt;converted to Maven&lt;/a&gt; and has archetypes available. AppFuse provides archetypes for JSF, Spring MVC, Struts 2 and Tapestry 5. The &lt;em&gt;light&lt;/em&gt; archetypes are available for these frameworks, as well as for Spring MVC + FreeMarker, Stripes and Wicket.
&lt;/p&gt;
&lt;p&gt;Other notable improvements:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Added &lt;a href=&quot;http://issues.appfuse.org/browse/APF-267&quot;&gt;Compass support&lt;/a&gt; thanks to a patch from &lt;a href=&quot;http://www.kimchy.org/&quot;&gt;Shay Banon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Upgraded from &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1125&quot;&gt;XFire to CXF&lt;/a&gt; for Web Services.&lt;/li&gt;
&lt;li&gt;Moved Maven repository to &lt;a href=&quot;https://docs.sonatype.com/display/NX/OSS+Repository+Hosting&quot;&gt;Sonatype&apos;s OSS Repository Hosting&lt;/a&gt; for snapshots and releasing to Maven Central. There are no longer any AppFuse-specific artifacts, all are available in central. Thanks to &lt;a href=&quot;http://sonatype.com&quot;&gt;Sonatype&lt;/a&gt; for this great service and its &lt;a href=&quot;http://raibledesigns.com/rd/entry/nexus_is_a_kick_ass&quot;&gt;excellent repository manager&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Upgraded to Canoo WebTest 3.0. &lt;em&gt;Now if we could just get its &lt;a href=&quot;http://people.apache.org/~sgoeschl/download/maven-plugins/webtest-maven-plugin/site/index.html&quot;&gt;Maven Plugin&lt;/a&gt; moved to Codehaus.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Added &lt;a href=&quot;http://raibledesigns.com/rd/entry/ajaxified_body&quot;&gt;Ajaxified Body&lt;/a&gt; to AppFuse Light archetypes.&lt;/li&gt;
&lt;li&gt;Infrastructure upgrades, including &lt;a href=&quot;http://issues.appfuse.org/&quot;&gt;JIRA 4&lt;/a&gt;, &lt;a href=&quot;http://appfuse.org/&quot;&gt;Confluence 3&lt;/a&gt;, &lt;a href=&quot;http://source.appfuse.org&quot;&gt;FishEye 2&lt;/a&gt;, &lt;a href=&quot;http://builds.appfuse.org&quot;&gt;Bamboo 2&lt;/a&gt; and &lt;a href=&quot;http://login.appfuse.org&quot;&gt;Crowd 1.6&lt;/a&gt;. Many thanks to &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt; and &lt;a href=&quot;http://contegix.com&quot;&gt;Contegix&lt;/a&gt; for their excellent products and services.&lt;/li&gt;
&lt;li&gt;For more details on specific changes see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.1.0+M1&quot; title=&quot;Release Notes 2.1.0 M1&quot;&gt;release notes&lt;/a&gt;.
&lt;/ul&gt;
&lt;p&gt;Please note that this release does not contain updates to the documentation. Code generation will work, but it&apos;s likely that some content in the &lt;a href=&quot;http://appfuse.org/display/APF/Tutorials&quot;&gt;tutorials&lt;/a&gt; won&apos;t match. For example, you can use annotations (vs. XML) for dependency injection and Tapestry is a whole new framework. I&apos;ll be working on documentation over the next several weeks in preparation for Milestone 2.
&lt;/p&gt;
&lt;p&gt;AppFuse is available as several Maven archetypes. For information on creating a new project, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt;.
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
To learn more about AppFuse, please read Ryan Withers&apos; &lt;a href=&quot;http://www.ociweb.com/jnb/jnbMay2008.html&quot;&gt;Igniting your applications with AppFuse&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;The 2.x series of AppFuse has a minimum requirement of the following specification versions:&lt;/p&gt;

&lt;ul class=&quot;glassList&quot;&gt;
	&lt;li&gt;Java Servlet 2.4 and JSP 2.0 (2.1 for JSF)&lt;/li&gt;
	&lt;li&gt;Java 5+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have questions about AppFuse, please read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;FAQ&lt;/a&gt; or join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt;. If you find bugs, please &lt;a href=&quot;http://issues.appfuse.org/secure/CreateIssue!default.jspa&quot;&gt;create an issue in JIRA&lt;/a&gt;.&lt;/p&gt; 

&lt;p&gt;Thanks to everyone for their help contributing code, writing documentation, posting to the mailing lists, and logging issues. </description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/javascript_and_css_concatenation</guid>
    <title>JavaScript and CSS Concatenation with wro4j</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/javascript_and_css_concatenation</link>
        <pubDate>Mon, 9 Nov 2009 10:44:44 -0700</pubDate>
    <category>Roller</category>
    <category>roller</category>
    <category>compression</category>
    <category>yuicompressor</category>
    <category>minification</category>
    <category>javascript</category>
    <category>wro4j</category>
    <category>appfuse</category>
    <category>css</category>
    <category>yslow</category>
    <category>jawr</category>
            <description>This past weekend, I decided it was about time to fix my &lt;a href=&quot;http://developer.yahoo.com/yslow/&quot;&gt;YSlow&lt;/a&gt; score on this site. I did the easiest thing first by moving all my JavaScript files to the bottom of each page. Then I turned on GZip compression using Roller&apos;s built-in CompressionFilter. These changes helped, but the most glaring problem continued to be &lt;em&gt;too many requests&lt;/em&gt;. To solve this, I turned to &lt;a href=&quot;http://wro4j.googlecode.com&quot;&gt;wro4j&lt;/a&gt; (as &lt;a href=&quot;http://twitter.com/alexobjelean/status/5481711667&quot;&gt;recommended on Twitter&lt;/a&gt;) to concatenate my JS and CSS files into one.
&lt;/p&gt;
&lt;p&gt;I have to say, I&apos;m very happy with the results. I&apos;m now sitting at a YSlow (V2) score of 75; 90 if I use the &quot;Small Site or Blog&quot; ruleset. I believe I can improve this by adding expires headers to my images, js and css. More than anything, I&apos;m impressed with wro4j, its &lt;a href=&quot;http://groups.google.com/group/wro4j/browse_thread/thread/33b85936c8f1e8b3?hl=en&quot;&gt;great support&lt;/a&gt; and &lt;a href=&quot;http://code.google.com/p/wro4j/wiki/GettingStarted&quot;&gt;easy setup&lt;/a&gt;. I was looking for a runtime solution (b/c I didn&apos;t want to have to rebuild Roller) and it seems to be perfect for the job. Furthermore, wro4j minifies everything on the fly and they&apos;ll have an &lt;a href=&quot;http://groups.google.com/group/wro4j/msg/b85b4aba0f9500ba?hl=en&quot;&gt;expires header filter in the next release&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://jawr.dev.java.net&quot;&gt;JAWR&lt;/a&gt; and the &lt;a href=&quot;http://developer.yahoo.com/yui/compressor/&quot;&gt;YUI Compressor&lt;/a&gt; are other alternatives to this filter, but I&apos;m currently sold on wro4j. First of all, it passed the 10-minute test. Secondly, it didn&apos;t require me to modify Roller&apos;s build system.  
&lt;/p&gt;
&lt;p&gt;At this point, if I&apos;m going to implement JS/CSS concatenation and minification in &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; and &lt;a href=&quot;http://roller.apache.org&quot;&gt;Roller&lt;/a&gt;, wro4j seems like the best option. If you disagree, I&apos;d love to hear your reasoning.&lt;/p&gt;
&lt;p style=&quot;font-style: italic; color: #666; border-top: 1px dotted silver&quot;&gt;
&lt;strong&gt;TIP:&lt;/strong&gt; See &lt;a href=&quot;http://www.sonatype.com/people/2009/11/javascript-compression-in-nexus/&quot;&gt;Javascript Compression in Nexus&lt;/a&gt; for information on using YUI Compressor with Maven.
&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/a_letter_to_the_appfuse</guid>
    <title>A Letter to the AppFuse Community</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/a_letter_to_the_appfuse</link>
        <pubDate>Wed, 4 Nov 2009 00:17:17 -0700</pubDate>
    <category>Java</category>
    <category>spring</category>
    <category>seam</category>
    <category>rubyonrails</category>
    <category>letter</category>
    <category>springroo</category>
    <category>appfuse</category>
    <category>grails</category>
    <category>play</category>
    <category>community</category>
            <description>The last &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; release was way back in &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_0_2_released&quot;&gt;May 2008&lt;/a&gt;. Many folks have asked when the next release would be ever since. Often, I&apos;ve said &quot;sometimes this quarter&quot;, but obviously, that&apos;s never happened. For that, I apologize.
&lt;/p&gt;
&lt;p&gt;There are many reasons I haven&apos;t worked on AppFuse for the past 18 months, but it mostly comes down to the fact that I didn&apos;t make time for it. The good news is I&apos;m working on it again and &lt;em&gt;will&lt;/em&gt; have a release out sometime this month. Unfortunately, it probably won&apos;t be a 2.1 final release, but there&apos;s so many things that&apos;ve changed, I feel like a milestone release is a good idea. Here&apos;s a brief summary of changes so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Changed archetypes to include all source and tests for the &quot;webapp&quot; portion of the application. No more warpath plugin, merging wars and IDE issues. Using &quot;mvn jetty:run&quot; should work as expected.&lt;/li&gt;
&lt;li&gt;Moved from &lt;a href=&quot;http://raibledesigns.com/rd/entry/moving_from_spring_s_xml&quot;&gt;Spring XML to Annotations&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;AppFuse Light &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_converted_to_maven&quot;&gt;converted to Maven modules&lt;/a&gt; and now depends on AppFuse&apos;s backend.&lt;/li&gt;
&lt;li&gt;Published easier to use archetype selection form in the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Published &lt;a href=&quot;http://static.appfuse.org/light/archetypes.html&quot;&gt;archetype selection form for AppFuse Light&lt;/a&gt;. I do plan on combining these forms as soon as I figure out the best UI and instructions for users to choose AppFuse or AppFuse Light.&lt;/li&gt;
&lt;li&gt;Upgraded all libraries to latest released versions (Spring 3 hasn&apos;t had a final release yet).&lt;/li&gt;
&lt;li&gt;Upgraded to Tapestry 5 thanks to &lt;a href=&quot;http://code.google.com/p/tapestry5-appfuse/&quot;&gt;Serge Eby&lt;/a&gt;. I still need to complete tests and code generation for tests.&lt;/li&gt;
&lt;li&gt;Added &lt;a href=&quot;http://issues.appfuse.org/browse/APF-267&quot;&gt;Compass support&lt;/a&gt; thanks to a patch from &lt;a href=&quot;http://www.kimchy.org/&quot;&gt;Shay Banon&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Upgraded from &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1125&quot;&gt;XFire to CXF&lt;/a&gt; for Web Services.&lt;/li&gt;
&lt;li&gt;Moved Maven repository to &lt;a href=&quot;https://docs.sonatype.com/display/NX/OSS+Repository+Hosting&quot;&gt;Sonatype&apos;s OSS Repository Hosting&lt;/a&gt; for snapshots and releasing to Maven Central. There are no longer any AppFuse-specific artifacts, all are available in central.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I realize there&apos;s many full-stack frameworks that do the same thing as AppFuse with less code. Examples include &lt;a href=&quot;http://rubyonrails.org&quot;&gt;Ruby on Rails&lt;/a&gt;, &lt;a href=&quot;http://grails.org&quot;&gt;Grails&lt;/a&gt;, &lt;a href=&quot;http://seamframework.org&quot;&gt;Seam&lt;/a&gt;, &lt;a href=&quot;http://www.springsource.org/roo&quot;&gt;Spring Roo&lt;/a&gt; and the &lt;a href=&quot;http://www.playframework.org/&quot;&gt;Play framework&lt;/a&gt;. However, there seems to be quite a few folks that continue to use AppFuse and it stills serves the community as a nice example of how to integrate frameworks. Furthermore, it helps me keep up with the latest framework releases, their quirks and issues that happen when you try to integrate them. In short, working on it helps me stay up to speed with Java open source frameworks.
&lt;/p&gt;
&lt;p&gt;
For those folks that like the 1.x, Ant-based version of AppFuse, there will &lt;em&gt;not&lt;/em&gt; be a 1.9.5 release. I know I promised it for years, but it&apos;s simply something I will not use, so I&apos;d rather not invest my time in it. I&apos;m sorry for lying to those that expected it.&lt;/p&gt;
&lt;p&gt;So what&apos;s the future of AppFuse? Will it continue to integrate web frameworks with Spring and popular persistence frameworks? Possibly, but it seems more logical to align it with the types of Ajax + REST applications I&apos;m creating these days. I&apos;m currently thinking AppFuse 3.0 would be nice as a RESTful backend with GWT and Flex UIs. I might create the backend with &lt;a href=&quot;http://cxf.apache.org/&quot;&gt;CXF&lt;/a&gt;, but it&apos;s possible I&apos;d use one of the frameworks mentioned above and simply leverage it to create the default features AppFuse users have come to expect.&lt;/p&gt;
&lt;p&gt;More than anything, I&apos;m writing this letter to let you know that the AppFuse project is not dead and you can expect a release in the near future.&lt;/p&gt;
&lt;p&gt;Thanks for your support,&lt;/p&gt;
&lt;p&gt;Matt</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/life_update_new_treehouse_new</guid>
    <title>Life Update: New Treehouse, New Kittens and More</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/life_update_new_treehouse_new</link>
        <pubDate>Wed, 6 May 2009 07:19:59 -0600</pubDate>
    <category>General</category>
    <category>jack</category>
    <category>appfuse</category>
    <category>eyesurgery</category>
    <category>prk</category>
    <category>treehouse</category>
    <category>abbie</category>
    <category>life</category>
    <category>kittens</category>
    <category>cancun</category>
    <category>mexico</category>
            <description>It&apos;s been awhile since I wrote a life update post so here you go. After returning from &lt;a href=&quot;http://raibledesigns.com/rd/entry/jason_and_holly_s_wedding&quot;&gt;Jason and Holly&apos;s Wedding&lt;/a&gt; in Florida, I took the next week off to &quot;catch up on life&quot;. Having a vacation at home with no packing and lots of time to wipe my &quot;to do&quot; list clean was great. Not only that, but the weather was beautiful all week. If you ever get a chance to take a &quot;catch up on life&quot; vacation, I highly recommend it.
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New Treehouse&lt;/strong&gt;&lt;br/&gt;
I started out the week by doing something I&apos;ve been telling the kids I&apos;d do for the last year: building a treehouse. I used &lt;a href=&quot;http://www.ronhazelton.com/archives/howto/treehouse_construction.shtm&quot;&gt;this tutorial&lt;/a&gt; as a guide for the &quot;foundation&quot; and had a lot of fun doing it. The best part was discovering my Dad had stocked my garage with many tools over the last couple years.  I had to make several runs to Home Depot and Ace Hardware for building supplies, but rarely had to buy any new tools. My Dad has been a carpenter for over 30 years (he used to do it for a living in Montana). I was pleasantly surprised to discover some of his skills have rubbed off on me. We still need to build the structure on top of the platform, but everyone is happy with the results so far.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3549/3471564772_1f9c19a38a.jpg&quot; title=&quot;Day 1 - Sunset&quot; rel=&quot;lightbox[lifeupdatespring2009]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3549/3471564772_1f9c19a38a_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Day 1 - Sunset&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.static.flickr.com/3593/3470750609_84bc33216b.jpg&quot; title=&quot;Day 2 - Bolting frame in place&quot; rel=&quot;lightbox[lifeupdatespring2009]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3593/3470750609_84bc33216b_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Day 2 - Bolting frame in place&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.static.flickr.com/3656/3471565132_7a5e4ebdb2.jpg&quot; title=&quot;Day 3 - They love it!&quot; rel=&quot;lightbox[lifeupdatespring2009]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3656/3471565132_7a5e4ebdb2_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Day 3 - They love it!&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.static.flickr.com/3545/3470751035_d016beb0d9.jpg&quot; title=&quot;Day 4 - Floor completed&quot; rel=&quot;lightbox[lifeupdatespring2009]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3545/3470751035_d016beb0d9_t.jpg&quot; width=&quot;100&quot; height=&quot;75&quot; alt=&quot;Day 4 - Floor completed&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AppFuse&lt;/strong&gt;&lt;br/&gt;
After finishing Phase 1 of the treehouse, I started working on the next version of AppFuse. I&apos;ve made good progress so far:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Archetypes now include all the source from web modules.&lt;/li&gt;
&lt;li&gt;Archetypes are now created using archetype:create-from-project, making things easier to maintain.&lt;/li&gt;
&lt;li&gt;Switched Cargo from downloaded Tomcat to embedded Jetty, allowing for faster builds.&lt;/li&gt;
&lt;li&gt;Upgraded to Struts 2.1.6 and Tapestry 5.0.18.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&apos;s still &lt;a href=&quot;http://issues.appfuse.org/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=10160&quot;&gt;lots of open issues&lt;/a&gt;, but I believe there&apos;s a lot of value in &lt;em&gt;starting&lt;/em&gt; the &quot;working on the next version&quot; process. With the way things are shaping up, I&apos;m considering bumping the version to 2.5 or 3.0 instead of 2.1. 3.0 might be a little ambitious, but there are going to be a lot of improvements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New Kittens&lt;/strong&gt;&lt;br/&gt;
Last weekend, I decided it was time to create some happy kids and get some pets in my house. On Saturday, we set out on a quest to find some kittens. We visited a couple shelters and a couple pet stores, but came home empty handed. We didn&apos;t look Sunday because we had &lt;a href=&quot;http://twitter.com/mraible/status/1687500847&quot;&gt;more important things to do&lt;/a&gt;. On Monday, we hit up &lt;a href=&quot;http://denver.craigslist.org/search/pet?query=kittens&quot;&gt;craigslist&lt;/a&gt; and found our kittens with a family in Thornton. Upon arrival, I figured they&apos;d be good since the family had a 6-year old, a 4-year old and a 1-year old that was carrying a kitten around by the tail. At least their new home is slightly less chaotic than their last one. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3360/3505899171_3cb4e849b1.jpg&quot; title=&quot;Jack and Olivia&quot; rel=&quot;lightbox[lifeupdatespring2009]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3360/3505899171_3cb4e849b1_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Jack and Olivia&quot; style=&quot;border: 1px solid black&quot;/&gt;&lt;/a&gt;

&lt;a href=&quot;http://farm4.static.flickr.com/3562/3506709142_21fa103252.jpg&quot; title=&quot;Abbie and Mittens&quot; rel=&quot;lightbox[lifeupdatespring2009]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3562/3506709142_21fa103252_m.jpg&quot; width=&quot;240&quot; height=&quot;180&quot; alt=&quot;Abbie and Mittens&quot; style=&quot;border: 1px solid black; margin-left: 10px&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Eye Surgery&lt;/strong&gt;&lt;br/&gt;
Today is my last day wearing glasses. Tomorrow morning, I&apos;m scheduled to receive &lt;a href=&quot;http://www.jeffsandquist.com/recovering-from-prk-laser-eye-surgery/&quot;&gt;PRK eye surgery&lt;/a&gt; at &lt;a href=&quot;http://lasik.com/&quot;&gt;TLC Laser Eye Center&lt;/a&gt;. I&apos;m nervous about the procedure and dreading the recovery. My mom is flying in tonight to assist me while I&apos;m blind and in pain, so hopefully it won&apos;t be too bad. A co-worker has lots of books on tape that I&apos;m borrowing to pass the time.
&lt;/p&gt;
&lt;p&gt;My life is showing no signs of slowing down anytime soon, but I will have lots of opportunities to relax. In two weeks, I&apos;m heading to Cancun for a friend&apos;s wedding. Having a week on the sunny beaches of Mexico is always fun. My current contract expires a couple days after my return. I&apos;m currently negotiating with a few potential clients and hope to have my summer work plans solidified before leaving for Mexico. More than anything, I&apos;m looking forward to taking the entire month of July off and spending it at our cabin in Montana. My Dad is moving up there to work on The New Cabin and there&apos;s nothing I&apos;d rather do than help him out. </description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/gwt_and_appfuse</guid>
    <title>GWT and AppFuse</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/gwt_and_appfuse</link>
        <pubDate>Wed, 4 Mar 2009 22:50:26 -0700</pubDate>
    <category>Java</category>
    <category>rest</category>
    <category>appfuse</category>
    <category>gwt</category>
    <category>java</category>
            <description>Someone recently sent me the following e-mail asking about GWT integration in &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;.&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I see from your blog that you&apos;re spending some time with GWT at the moment. What&apos;s your plan, are you going to integrate GWT as another UI Option for AppFuse?
&lt;br/&gt;&lt;br/&gt;
The reason I&apos;m asking is that I actually checked out all of the AppFuse code from the svn repository yesterday, with the intention of starting off adding some GWT stuff in there. My intention was to start by getting a basic Maven archetype together for GWT as an AppFuse UI.
&lt;br/&gt;&lt;br/&gt;
However, if you&apos;re planning on doing this yourself in the near future, then there&apos;s no point in me starting doing it, I&apos;d have to learn how to write archetype&apos;s for a start (not that it looks too difficult) but you&apos;d obviously do it much quicker.
&lt;/p&gt;
&lt;p&gt;Being a good open-source developer, I moved the discussion to the developer mailing list and &lt;a href=&quot;http://www.nabble.com/Re%3A-GWT---Appfuse-to22184159s2369.html&quot;&gt;replied there&lt;/a&gt;:&lt;/p&gt;
&lt;div class=&quot;quote&quot; style=&quot;margin-left: 0; margin-bottom: 10px&quot;&gt;
&lt;p&gt;It&apos;s likely I&apos;ll create a version of AppFuse Light with GWT, but I 
doubt I&apos;ll do it in the near future. I hope to release AppFuse 2.1 
first (which will include &quot;light&quot; archetypes). I wouldn&apos;t get your 
hopes up in waiting for me to do the work. However, I&apos;d be happy to 
assist you in doing it. AppFuse Light is now modular and uses the 
AppFuse backend. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_converted_to_maven&quot;&gt;http://raibledesigns.com/rd/entry/appfuse_light_converted_to_maven&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Here&apos;s how I believe GWT should be integrated: 
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Create an appfuse-ws archetype that serves up RESTful services 
(&lt;a href=&quot;http://issues.appfuse.org/browse/APF-897&quot;&gt;http://issues.appfuse.org/browse/APF-897&lt;/a&gt;). &lt;/li&gt;
&lt;li&gt; Create an appfuse-gwt archetype that consumes those services. This 
archetype would contain a proxy servlet that allows #1 to be on a 
separate host/port. &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
In addition to #1, I hope to convert the Struts 2 and Spring MVC 
archetypes to use those frameworks&apos; REST support. 
&lt;/p&gt;
&lt;p style=&quot;margin-bottom: 0&quot;&gt;
For #2, we could use SmartGWT or GXT. SmartGWT might be better since 
Sanjiv is a committer on this project. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;I know I&apos;ve been slacking on AppFuse development, but it &lt;em&gt;is&lt;/em&gt; ski season and running to work seems to drain my late-night coding ambitions. With that being said, I&apos;m committed to getting AppFuse 2.1 released by JavaOne (hopefully sooner). I figure it&apos;s a good week&apos;s worth of work and I&apos;ll probably have to do it late at night to find the time. That&apos;s OK though, I usually really start to enjoy it once I get into it.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_light_converted_to_maven</guid>
    <title>AppFuse Light converted to Maven modules, upgraded to Tapestry 5 and Stripes 1.5</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_light_converted_to_maven</link>
        <pubDate>Sat, 20 Dec 2008 18:42:03 -0700</pubDate>
    <category>Java</category>
    <category>stripes</category>
    <category>jsf</category>
    <category>maven</category>
    <category>appfuselight</category>
    <category>struts2</category>
    <category>tapestry</category>
    <category>tapestry5</category>
    <category>appfuse</category>
            <description>This past week, I stayed up a couple of late nights to do some of the AppFuse Light work I &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_appfuse_maven_archetypes&quot;&gt;wrote about in October&lt;/a&gt;. I converted all web frameworks to Maven modules, as well as made them inherit from the &lt;a href=&quot;http://static.appfuse.org/appfuse-web/index.html&quot;&gt;appfuse-web&lt;/a&gt; project. Below is what the new module structure looks like:&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3079/3124113000_904d35252b_o.png&quot; width=&quot;234&quot; height=&quot;181&quot; alt=&quot;New AppFuse Light Modules&quot; /&gt;&lt;/p&gt;
&lt;/p&gt;
&lt;p&gt;At this point, the project is ready to import into AppFuse&apos;s SVN project. Here&apos;s a list of other changes I made:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Modules now depend on AppFuse&apos;s backend and allow you to use Hibernate, JPA or iBATIS as the persistence framework. Implementations for Spring JDBC, OJB and JDO have been removed.&lt;/li&gt;
&lt;li&gt;Upgraded to &lt;a href=&quot;http://jwebunit.sourceforge.net/&quot;&gt;JWebUnit 2.1&lt;/a&gt;, which now uses &lt;a href=&quot;http://jwebunit.sourceforge.net/jwebunit-htmlunit-plugin/index.html&quot;&gt;HtmlUnit&lt;/a&gt; under the hood and has much better JavaScript support. It also has &lt;a href=&quot;http://jwebunit.sourceforge.net/jwebunit-selenium-plugin/index.html&quot;&gt;Selenium support&lt;/a&gt;, but I&apos;ve yet to try it.
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/ajaxified_body&quot;&gt;Ajaxified Body&lt;/a&gt; integrated into all frameworks. You can easily turn it off by modifying the global.js file.&lt;/li&gt;
&lt;li&gt;Prototype and Scriptaculous loaded from &lt;a href=&quot;http://code.google.com/apis/ajaxlibs/&quot;&gt;Google&apos;s Ajax Libraries CDN&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Upgraded to &lt;a href=&quot;http://java.dzone.com/announcements/apache-tapestry-50-final-relea&quot;&gt;Tapestry 5&lt;/a&gt;. Mad props to Serge Eby and his &lt;a href=&quot;http://code.google.com/p/tapestry5-appfuse/&quot;&gt;tapestry5-appfuse&lt;/a&gt; project for showing me how to do this. Serge &lt;a href=&quot;http://www.nabble.com/Welcome-to-the-AppFuse-Project!-td20966043s2369.html&quot;&gt;became a committer on AppFuse&lt;/a&gt; recently, so hopefully we&apos;ll continue to see great things from the Tapestry 5 support. I really like the clean URLs and minimum configuration required in Tapestry 5. It&apos;s testing framework is nice too, but &lt;a href=&quot;http://www.nabble.com/-T5--Testing-Pages-with-injected-Spring-beans-tt21057429.html&quot;&gt;I believe it could be improved&lt;/a&gt;.
&lt;li&gt;Upgraded to &lt;a href=&quot;http://greggbolinger.blogspot.com/2008/01/stripes-15-feature-general-improvements.html&quot;&gt;Stripes 1.5&lt;/a&gt;. This was easy and painless. I&apos;m definitely a fan of Stripes and look forward to reading the &lt;a href=&quot;http://www.pragprog.com/titles/fdstr/stripes&quot;&gt;Stripes book&lt;/a&gt; on my bookshelf.&lt;/li&gt;
&lt;li&gt;Dropped support for: Struts 1.x, WebWork, Spring MVC + Velocity.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;If you want to try any of these applications, you can create archetypes using the following commands:&lt;/p&gt;
&lt;pre&gt;
svn co https://appfuse-light.dev.java.net/svn/appfuse-light/trunk appfuse-light
cd appfuse-light/&lt;i&gt;preferred-web-framework&lt;/i&gt;
mvn archetype:create-from-project
cd target/generated-sources/archetype
mvn install
cd ~/dev
mvn archetype:generate # The new archetype should show up as an option
&lt;/pre&gt;
&lt;p&gt;Next steps include figuring out a way to flatten the inherited dependencies and plugins so &lt;em&gt;archetype:create-from-project&lt;/em&gt; can create truly standalone projects. Please let me know if you have any questions.

&lt;/pre&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/moving_from_spring_s_xml</guid>
    <title>Moving from Spring&apos;s XML to Annotations in AppFuse</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/moving_from_spring_s_xml</link>
        <pubDate>Tue, 4 Nov 2008 11:39:54 -0700</pubDate>
    <category>Java</category>
    <category>appfuse</category>
    <category>junit4</category>
    <category>spring</category>
    <category>abstracttransactionaldatasourcespringcontexttests</category>
    <category>annotations</category>
    <category>xml</category>
            <description>Last night, I did a spike on AppFuse to &lt;a href=&quot;http://issues.appfuse.org/browse/APF-1105&quot;&gt;change XML to Spring annotations (@Repository, @Service and @Autowired)&lt;/a&gt; in its service and data modules. While I was able to accomplish everything in a few hours (including converting tests), I did run into a couple issues.
&lt;/p&gt;
&lt;p style=&quot;text-align: left&quot;&gt;
&lt;strong&gt;AbstractTransactionalJUnit4..Tests vs. AbstractTransactionalDataSource..Tests&lt;/strong&gt;&lt;br/&gt;
I&apos;ve switched from &lt;a href=&quot;http://www.jroller.com/raible/entry/ditch_dbunit_use_abstracttransactionaldatasourcespringcontexttests&quot;&gt;my favorite Spring class&lt;/a&gt; to the annotation-happy &lt;a href=&quot;http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/test/context/junit4/AbstractTransactionalJUnit4SpringContextTests.html&quot;&gt;AbstractTransactionalJUnit4SpringContextTests&lt;/a&gt;. However, this has presented an issue: when using ATDSSCT, I was able to call &lt;code&gt;endTransaction()&lt;/code&gt; and &lt;code&gt;startNewTransaction()&lt;/code&gt;. With ATJ4SCT, this doesn&apos;t seem possible. Below is a screenshot of the diff on a test method in the JPA implementation of UserDaoTest:
&lt;/p&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3166/3003374654_31fff24bd1_o.png&quot; title=&quot;AbstractTransactionalJUnit4SpringContextTests vs. AbstractTransactionalDataSourceSpringContextTests&quot; rel=&quot;lightbox[appfuse-annotations]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3166/3003374654_a3f2ca2ebd.jpg&quot; width=&quot;500&quot; height=&quot;188&quot; alt=&quot;AbstractTransactionalJUnit4SpringContextTests vs. AbstractTransactionalDataSourceSpringContextTests&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: left&quot;&gt;On the right, you&apos;ll notice that I had to comment out &lt;code&gt;@ExpectedException&lt;/code&gt; to get the test to pass. This concerns me since this exception should be thrown. Is there a way to call &lt;code&gt;endTransaction()&lt;/code&gt; and &lt;code&gt;startNewTransaction()&lt;/code&gt; when subclassing AbstractTransactionalJUnit4SpringContextTests?
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Instantiating GenericDao Implementations Programmatically&lt;/strong&gt;&lt;br/&gt;
The second feature I tried to add is the ability to instantiate a GenericDao programatically rather than requiring a XML bean definition. In current versions of AppFuse, you can use the following bean definition to create a GenericDao for a model object.&lt;/p&gt;
&lt;pre&gt;
&amp;lt;bean id=&quot;personDao&quot; class=&quot;org.appfuse.dao.hibernate.GenericDaoHibernate&quot;&amp;gt;
    &amp;lt;constructor-arg value=&quot;org.appfuse.tutorial.model.Person&quot;/&amp;gt; 
    &amp;lt;property name=&quot;sessionFactory&quot; ref=&quot;sessionFactory&quot;/&amp;gt;
&amp;lt;/bean&amp;gt; 
&lt;/pre&gt;
&lt;p&gt;When moving to a &lt;em&gt;no-XML required&lt;/em&gt; architecture, it&apos;d be nice to allow users to create GenericDao&apos;s programmatically. Below is the easiest way I&apos;ve found to do this in a test:
&lt;/p&gt;
&lt;pre&gt;
GenericDao&amp;lt;User, Long&gt; genericDao;
@Autowired
SessionFactory sessionFactory;

@Before
public void setUp() {
    genericDao = new GenericDaoHibernate&amp;lt;User, Long&gt;(User.class);
    genericDao.setSessionFactory(sessionFactory);
}
&lt;/pre&gt;
&lt;p&gt;However, there&apos;s a couple problems with this. First of all, mixing constructor injection and setter injection probably isn&apos;t a good idea. Changing the constructor to take a SessionFactory solves this problem, but now all subclasses need to have a more verbose constructor:
&lt;/p&gt;
&lt;pre&gt;
@Autowired
public UserDaoHibernate(SessionFactory sessionFactory) {
    super(User.class, sessionFactory);
}
&lt;/pre&gt;
&lt;p&gt;Whereas before they had:&lt;/p&gt;
&lt;pre&gt;
public UserDaoHibernate() {
    super(User.class);
}
&lt;/pre&gt;
&lt;p style=&quot;text-align: left&quot;&gt;In an ideal world, I could call &lt;code&gt;new GenericDaoHibernate&amp;lt;User, Long&gt;(User.class)&lt;/code&gt; and the SessionFactory would be wired in auto-magically. Is this possible with Spring 2.5?
&lt;p&gt;The 2nd problem this presents is your client code will now be dependent on an implementation rather than the interface. I don&apos;t know how to solve that one, but I&apos;d love to figure out a way to create GenericDaos with no XML and no implementation details in the client. Any ideas are most welcome.&lt;/p&gt;
&lt;p&gt;If you&apos;d like to see all the changes I made in converting from XML to Annotations, please &lt;a href=&quot;http://issues.appfuse.org/secure/attachment/10512/XMLToAnnotations.patch&quot;&gt;see this patch&lt;/a&gt;.
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_light_appfuse_maven_archetypes</guid>
    <title>AppFuse Light &#187; AppFuse, Maven Archetypes and Shared Web Assets</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_light_appfuse_maven_archetypes</link>
        <pubDate>Wed, 29 Oct 2008 02:18:59 -0600</pubDate>
    <category>Java</category>
    <category>archetypes</category>
    <category>appfuse</category>
    <category>appfuselight</category>
    <category>svn</category>
    <category>maven</category>
    <category>architecture</category>
            <description>Last night, I stayed up into the wee hours of the morning working on something I&apos;ve been wanting to do for a long time. It wasn&apos;t until I was &lt;a href=&quot;http://raibledesigns.com/rd/entry/great_weekend_in_montana&quot;&gt;trouncing around the woods&lt;/a&gt; in Montana that I realized how easy it would be. The &lt;em&gt;something I&apos;ve wanted to do&lt;/em&gt; was to modify AppFuse Light to use AppFuse&apos;s core modules (service and dao). It only took me a few hours to make it happen and it inspired additional ideas. 
&lt;/p&gt;
&lt;p&gt;
I believe the major mistake we made in AppFuse 2.x was making it easy for user&apos;s to upgrade their applications. We currently use the &lt;a href=&quot;http://maven.apache.org/plugins/maven-war-plugin/&quot;&gt;maven-war-plugin&lt;/a&gt; and our own &lt;a href=&quot;http://static.appfuse.org/maven-warpath-plugin&quot;&gt;maven-warpath-plugin&lt;/a&gt; to make it possible to include AppFuse classes and assets in your project. You can easily &lt;a href=&quot;http://static.appfuse.org/movies/2.0/helloworld.mov&quot;&gt;start a new project&lt;/a&gt; w/o having a whole bunch of files in your project. The problem is, you can&apos;t easily use &quot;mvn jetty:run&quot; to work on your project. Of course, you can use &quot;mvn appfuse:full-source&quot; to solve this, but I&apos;m starting to think more and more that &quot;full-source&quot; should be the default. This is what we did in 1.x and it seems to be the more natural pattern for folks using AppFuse.
&lt;/p&gt;
&lt;p&gt;That hard part about moving to &quot;full-source&quot; by default is coming up with a way to share common assets and classes among wars and war projects. Sure, I can copy all the shared images, css and js
into each project - but that could become a maintenance nightmare. Subversion 1.5 with relative svn:externals might solve this, but it still seems kinda hacky. I don&apos;t want to use the maven-war-plugin because the overlay is kinda hokey and I think it&apos;s easier for users to understand when everything
is in their project.
 AppFuse&apos;s current directory structure in SVN looks as follows. I&apos;ve added indicators of what is in each directory.&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;img src=&quot;//farm4.static.flickr.com/3231/2982950627_d846cda59b_o.png&quot; width=&quot;480&quot; height=&quot;148&quot; alt=&quot;AppFuse Web SVN&quot;/&gt;
&lt;/p&gt;
&lt;p&gt;Rather than using AppFuse&apos;s current (manual) archetype-creation process, I&apos;d like to move to a more automated creation process using the maven-archetype-plugin&apos;s &lt;a href=&quot;http://maven.apache.org/plugins/maven-archetype-plugin/create-from-project-mojo.html&quot;&gt;create-from-project&lt;/a&gt; feature. I&apos;d like to figure out a way where I can have the source code and assets from web/common included in each of the other web/* projects (both when using &quot;jetty:run&quot; and &quot;archetype:create-from-project&quot;). One idea I thought of is to make
Jetty/Maven aware of multiple src/war directories for &quot;jetty:run&quot; and &quot;package&quot; and then
somehow hook into the archetype plugin at creation time to pull in the
shared resources. I don&apos;t know if something like this is possible. If you know of a good solution to this &lt;em&gt;shared web assets&lt;/em&gt; issue, I&apos;d love to hear about it.
&lt;/p&gt;
&lt;p&gt;Back to AppFuse Light. If I can figure out how to solve shared resources in web modules, I can use this in AppFuse Light to move to a modular SVN structure vs. its current &quot;use Ant to create different combinations&quot; setup. If a modular structure (like appfuse/web/*) is possible for AppFuse Light, I believe it makes sense to move its source into AppFuse&apos;s SVN repository. Below is how the directory structure might look after this move.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3165/2982969199_28fd1eefe4_o.png&quot; width=&quot;202&quot; height=&quot;181&quot; alt=&quot;AppFuse Light &#187; AppFuse&quot;/&gt;&lt;/p&gt;
&lt;p&gt;With this addition and &quot;archetype:create-from-project&quot;, we should be able to create all the &lt;em&gt;basic&lt;/em&gt; and &lt;em&gt;light&lt;/em&gt; archetypes automatically. We&apos;ll probably still need a manual archetype-creation process for modular archetypes, but I&apos;m OK with that.
&lt;/p&gt;
&lt;p&gt;The last thing I&apos;m struggling with is figuring out the best way to create archetypes for something like AppFuse. In the past, we&apos;ve used dependencies to allow users to inherit dependencies and their versions. This works, but it results in a lot of duplicate XML (in projects and archetypes) for developers. Last night, I tried using a parent project instead of dependencies and it seems to work much better. Not only do you inherit dependencies, but you also inherit plugins, profiles and properties. If you inherit, you can override, which is slick.
&lt;/p&gt;
&lt;p&gt;If you&apos;re an AppFuse user, how would you feel about having an AppFuse module as your project&apos;s parent? Would you prefer that, dependencies on AppFuse or full-source with no dependencies on AppFuse? Regardless of parent vs. dependencies, I think running &quot;appfuse:full-source&quot; should allow you to de-couple your project from AppFuse.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/ajaxified_body</guid>
    <title>Ajaxified Body</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/ajaxified_body</link>
        <pubDate>Fri, 3 Oct 2008 14:33:09 -0600</pubDate>
    <category>Java</category>
    <category>appfuselight</category>
    <category>sitemesh</category>
    <category>ajax</category>
    <category>appfuse</category>
            <description>I&apos;ve often wondered if it was possible to use Ajax to reload the main content of a web application without reloading the header, menu and footer. &lt;a href=&quot;http://www.opensymphony.com/sitemesh&quot;&gt;SiteMesh&lt;/a&gt; allows you to move these common elements to a &lt;em&gt;decorator&lt;/em&gt; that gets wrapped around each page. Below is a diagram of how SiteMesh works.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3276/2908373749_1ce4581bba_o.png&quot; title=&quot;SiteMesh&quot; rel=&quot;lightbox[ajaxifiedbody]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3276/2908373749_fff90b124b.jpg&quot; width=&quot;500&quot; height=&quot;344&quot; alt=&quot;SiteMesh&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
You can read the &lt;a href=&quot;http://today.java.net/pub/a/today/2004/03/11/sitemesh.html&quot;&gt;Introduction to SiteMesh&lt;/a&gt; article if you&apos;re interested in learning more about SiteMesh&apos;s basic features. By default, SiteMesh decorates &lt;code&gt;text/html&lt;/code&gt; responses and ignores any other content type (e.g. &lt;code&gt;image/gif&lt;/code&gt;). It also contains an &amp;lt;excludes&gt; configuration element that allows you to turn off decoration when a URL matches a certain pattern. For example, the following allows you to disable decoration when &quot;ajax=true&quot; is passed in the URL.
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;excludes&amp;gt;
    &amp;lt;pattern&amp;gt;**ajax=true&amp;lt;/pattern&amp;gt;
&amp;lt;/excludes&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
To optimize the loading of an application so the common elements aren&apos;t loaded for each page, it should be possible to create an &lt;strong&gt;Ajaxified Body&lt;/strong&gt; where the primary content area (PCA) of the site is loaded via Ajax rather than refreshing the whole page. The header, footer and navigation bar often stays the same from page-to-page, so it doesn&apos;t seem to make a whole lot of sense to load them each time the page loads. The image below shows the PCA (of an AppFuse Light application) as a grey square with a red border.
&lt;/p&gt;
&lt;p style=&quot;text-align: center; margin-bottom: 0&quot;&gt;
&lt;a href=&quot;http://farm4.static.flickr.com/3107/2909207040_f661f9e60e_o.png&quot; title=&quot;Ajaxified Body - AppFuse Light&quot; rel=&quot;lightbox[ajaxifiedbody]&quot;&gt;&lt;img src=&quot;//farm4.static.flickr.com/3107/2909207040_46c379c0ae.jpg&quot; width=&quot;500&quot; height=&quot;432&quot; alt=&quot;Ajaxified Body - AppFuse Light&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Implementing an &lt;strong&gt;Ajaxified Body&lt;/strong&gt; consists of the following steps:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Adding SiteMesh and moving common elements to a decorator.&lt;/li&gt;
&lt;li&gt;Remove common elements from each individual page (if you&apos;re using includes).&lt;/li&gt;
&lt;li&gt;Configure SiteMesh so decoration is disabled when the requested URL contains &quot;ajax=true&quot;.&lt;/li&gt;
&lt;li&gt;Write JavaScript that modifies all &amp;lt;a href=&quot;&quot;&gt; links (and buttons with onclick=&apos;location.href&apos;) in the PCA to have an onclick handler.&lt;/li&gt;
&lt;li&gt;The onclick handler should call a JavaScript function that loads the link&apos;s URL + ajax=true using XMLHttpRequest (XHR).&lt;/li&gt;
&lt;li&gt;Add XHR success handling to replace the PCA with the loaded content.&lt;/li&gt;
&lt;li&gt;Add XHR error handling to go to the URL normally when response.status != 200.&lt;/li&gt;
&lt;li&gt;Inspect the response HTML for &amp;lt;title&gt; element and replace document.title if exists.&lt;/li&gt;
&lt;li&gt;Inspect the response HTML for &amp;lt;head&gt; element and append to current &lt;head&gt; if exists.&lt;/li&gt;
&lt;li&gt;Inspect the response HTML for &amp;lt;script&gt; and &amp;lt;link&gt; elements (JavaScript and CSS) and evaluate them if they exist.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
As a proof of concept, I created a prototype using &lt;a href=&quot;https://appfuse-light.dev.java.net&quot;&gt;AppFuse Light&lt;/a&gt; (Prototype/Scriptaculous for Ajax). You can see a demo at the following URL. You can also &lt;a href=&quot;http://demo.raibledesigns.com/ajaxifiedbody/ajaxifiedbody.patch&quot;&gt;download a patch&lt;/a&gt; or &lt;a href=&quot;http://demo.raibledesigns.com/ajaxifiedbody/ajaxifiedbody-1.0.zip&quot;&gt;the source&lt;/a&gt; for this project. &lt;/p&gt;
&lt;p style=&quot;margin-left: 30px&quot;&gt;
&lt;a href=&quot;http://demo.raibledesigns.com/ajaxifiedbody&quot;&gt;http://demo.raibledesigns.com/ajaxifiedbody&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Below are a number of things I discovered while writing this prototype:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;
&lt;li&gt;The hardest part of implementing this seems to be coding the exceptions. It&apos;s possible you&apos;ll have some links with existing onclick handlers and you may have to disable &quot;ajaxifying links&quot; for those links.&lt;/li&gt;
&lt;li&gt;A progress indicator is important or the page might load so fast that the user doesn&apos;t visually detect it changed. This can lead to a worse user experience because they don&apos;t see the flash of the blank page they&apos;re used to when a page load occurs.&lt;/li&gt;
&lt;li&gt;While forms can be submitted via Ajax, there&apos;s no harm in leaving existing form behavior in place where the full site is reloaded after submitting a form.&lt;/li&gt;
&lt;li&gt;If a particular page needs to change the common elements (header, menu, footer), it should be possible to do that with JavaScript after the PCA content loads.&lt;/li&gt;
&lt;li&gt;If the success/error indicator is outside the PCA, it may need to be populated and displayed/hidden with JavaScript after the PCA loads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I&apos;m sure my implementation can be improved, but I&apos;m also curious to see what you think of this idea. I know it&apos;s not revolutionary, but it&apos;s something I&apos;m considering adding by default to AppFuse and AppFuse Light. Do any Ajax frameworks do something like this out-of-the-box?
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; Thanks to everyone for the great feedback - keep it coming. I agree that adding history support is a must. I&apos;ll try to do that in the next day or two. This post has also been featured on &lt;a href=&quot;http://java.dzone.com/news/ajaxified-body&quot;&gt;Javalobby&lt;/a&gt; and &lt;a href=&quot;http://ajaxian.com/archives/ajaxified-body-when-to-refresh-the-page&quot;&gt;Ajaxian&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update 2:&lt;/strong&gt; &lt;a href=&quot;http://raibledesigns.com/rd/entry/ajaxified_body_now_with_back&quot;&gt;Added history support&lt;/a&gt;.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/upgrading_hibernate_to_3_4</guid>
    <title>Upgrading Hibernate to 3.4.0 and AppFuse for Tapestry 5</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/upgrading_hibernate_to_3_4</link>
        <pubDate>Wed, 17 Sep 2008 09:35:45 -0600</pubDate>
    <category>Java</category>
    <category>appfuse</category>
    <category>tapestry5</category>
    <category>tapestry</category>
    <category>hibernate</category>
            <description>Last night I spent an hour upgrading &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; to Hibernate 3.4.0.GA. I tried the same thing &lt;a href=&quot;http://twitter.com/mraible/statuses/917287272&quot;&gt;a week ago&lt;/a&gt;, but failed miserably. When &lt;a href=&quot;http://blog.hibernate.org/9384.lace&quot;&gt;Hibernate Core Modules (3.3)&lt;/a&gt; (a Maven dependency howto) showed up on the Hibernate blog, I was re-inspired. I discovered some interesting things along the way (at least in my setup).
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;You need to use JBoss&apos;s Maven Repository&lt;/strong&gt;&lt;br/&gt;
The latest Hibernate releases aren&apos;t in the central Maven repo yet. If they&apos;re not in there two weeks after the release, I doubt they&apos;ll be there anytime soon. Best to plan on adding &lt;a href=&quot;http://repository.jboss.com/maven2&quot;&gt;http://repository.jboss.com/maven2&lt;/a&gt; as a permanent repository. As a bonus, you can remove &lt;a href=&quot;http://download.java.net/maven/2&quot;&gt;http://download.java.net/maven/2&lt;/a&gt; since JTA is in JBoss&apos;s repo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Javassist is not an optional dependency&lt;/strong&gt;&lt;br/&gt;
If I remove the Javassist dependency, here&apos;s the error I get:&lt;/p&gt;
&lt;pre&gt;
java.lang.NoClassDefFoundError: javassist/util/proxy/MethodFilter
&lt;/pre&gt;
&lt;p&gt;Seems reasonable right? What if I add in the dependency on Hibernate&apos;s cglib instead?&lt;/p&gt;
&lt;pre&gt;
java.lang.NoClassDefFoundError: javassist/util/proxy/MethodFilter
&lt;/pre&gt;
&lt;p&gt;OK, so apparently you &lt;em&gt;can&apos;t&lt;/em&gt; switch between Javassist and &lt;em&gt;hibernate-cglib-repack&lt;/em&gt; as stated in Hibernate&apos;s Maven dependency howto. Of course, I do believe their instructions are correct, they just don&apos;t work in my setup. Versions I&apos;m using: hibernate-core-3.3.1.GA and hibernate-annotations-3.4.0.GA.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Not including SLF4J is a bad idea&lt;/strong&gt;&lt;br/&gt;
If you don&apos;t include a dependency on SLF4J (and you&apos;re using Spring), you get a nice cryptic error message.&lt;/p&gt;
&lt;pre&gt;
Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class 
[org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean]: 
Constructor threw exception; nested exception is java.lang.NoClassDefFoundError
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:115)
        at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:61)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:877)
        ... 48 more
Caused by: java.lang.NoClassDefFoundError
        at java.lang.Class.forName0(Native Method)
        at java.lang.Class.forName(Class.java:164)
        at org.springframework.orm.hibernate3.LocalSessionFactoryBean.class$(LocalSessionFactoryBean.java:174)
        at org.springframework.orm.hibernate3.LocalSessionFactoryBean.&lt;init&gt;(LocalSessionFactoryBean.java:174)
        at org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean.&lt;init&gt;(AnnotationSessionFactoryBean.java:64)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:100)
&lt;/pre&gt;

&lt;p style=&quot;text-align: left&quot;&gt;&lt;strong&gt;Hibernate&apos;s JPA now uses PersistenceException instead of EntityExistsException&lt;/strong&gt;
&lt;br/&gt;
In previous releases, Hibernate&apos;s &lt;code&gt;ConstraintViolationException&lt;/code&gt; was wrapped in a &lt;code&gt;javax.persistence.EntityExistsException&lt;/code&gt;. In Hibernate&apos;s EntityManager 3.4.0.GA, it&apos;s wrapped in a &lt;code&gt;javax.persistence.PersistenceException&lt;/code&gt;.
&lt;/p&gt;
&lt;p&gt;Of course, these errors could be caused by Spring or Maven, but my hunch is they&apos;re more related to Hibernate and it&apos;s new more modular dependencies. You can &lt;a href=&quot;http://source.appfuse.org/changelog/appfuse?cs=3165&quot;&gt;view the full changeset&lt;/a&gt; for upgrading Hibernate 3.2.6.ga to 3.3.1.GA via FishEye.&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Tapestry 5 version of AppFuse&lt;/strong&gt;&lt;br/&gt;
In other AppFuse-related news, Serge Eby has &lt;a href=&quot;http://www.nabble.com/-ANN--tapestry5-%2B-appfuse-to19325193s2369.html&quot;&gt;created a Tapestry 5 version of AppFuse&lt;/a&gt;. You can see his alpha-level work in Google Code&apos;s &lt;a href=&quot;http://code.google.com/p/tapestry5-appfuse/&quot;&gt;tapestry5-appfuse project&lt;/a&gt;. I haven&apos;t had a chance to take a look at Serge&apos;s work yet, but I&apos;m eager to do so. Hopefully we can get it back into the main project sooner than later. As far as Wicket and Stripes support, I haven&apos;t forgot about those - just having trouble finding the time and motivation to do the work.
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/should_we_retool_appfuse_to</guid>
    <title>Should we change AppFuse to be Struts 2-specific?</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/should_we_retool_appfuse_to</link>
        <pubDate>Thu, 29 May 2008 08:29:44 -0600</pubDate>
    <category>Java</category>
    <category>struts2</category>
    <category>appfuse</category>
    <category>rest</category>
            <description>Dusty recently &lt;a href=&quot;http://www.nabble.com/Re%3A-RE%3A-Getting-ready-for-Struts-2.1.1-p17461105s2369.html&quot;&gt;posted&lt;/a&gt; an interesting idea to the AppFuse developers mailing list:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
After thinking/coding/reading for a while I think the more interesting  
task is:  Retool AppFuse to be one or more Struts2 plugins based on  
various higher level app patterns.  (AppFuse Facebook, AppFuse  
Employee DB, AppFuse Blog, AppFuse Basic LDAP, AppFuse Basic Crowd).
&lt;br/&gt;&lt;br/&gt;
This all comes from the fact, that I have been wanting to refactor the  
AppFuse web layer for Struts.  One of the interesting aspects of  
AppFuse is that it works pretty much the same across all its web  
frameworks.  It does so with some lowest common denominator  
abstractions that can be ported and look and work the same across  
frameworks.  I have picked my tool(s): Struts 2 and Ruby On Rails when  
I want to pretend I am young again. I know Spring MVC, JSF, etc. but  
I have no desire to build significant apps on those platforms. It&apos;s  
not because they suck and Struts2 rules, it is because I know Struts 2  
the best, I am most efficient there and it provides everything I need  
to build great webapps (Let&apos;s not devolve to a framework debate). So,  
I would rather have a more Struts 2-specific web stack, that really  
leverages conventions born and raised there.  The nice thing about the  
Struts 2 web stack is that it is complemented nicely by AppFuse&apos;s data/service layer, since unlike Grails or Rails, Struts 2 has no data or service layer.
[&lt;a href=&quot;http://www.nabble.com/Re%3A-RE%3A-Getting-ready-for-Struts-2.1.1-p17461105s2369.html&quot;&gt;Read More &amp;raquo;&lt;/a&gt;]
&lt;/p&gt;
&lt;p&gt;Seems like a good idea to me. What do you think?&lt;/p&gt;
&lt;p&gt;Someday I&apos;d like to come up with a &quot;compatibility test&quot; that allows others to improve upon the ideas in AppFuse and develop their stacks independently. A suite of Selenium tests that require extensionless URLs might be a good start.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/integrating_compass_2_0_into</guid>
    <title>Integrating Compass 2.0 into AppFuse</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/integrating_compass_2_0_into</link>
        <pubDate>Thu, 22 May 2008 21:24:47 -0600</pubDate>
    <category>Java</category>
    <category>displaytag</category>
    <category>compass</category>
    <category>appfuse</category>
            <description>&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
Last week, Chris Barham showed us an example of &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_displaytag_external_sorting_and&quot;&gt;how to implement external sorting and paging with AppFuse + DisplayTag&lt;/a&gt;. This week, he&apos;s at it again with a tutorial titled &lt;a href=&quot;http://code.google.com/p/pagingappfuse/wiki/CompassSearching&quot;&gt;Searching in AppFuse 2.0.2 with Compass 2.0 and Lucene 2.3.2&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
From a &lt;a href=&quot;http://www.nabble.com/Appfuse-searching-with-Compass-2.0-(Lucene)-td17368089s2369.html&quot;&gt;message&lt;/a&gt; he sent to the mailing list:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I&apos;ve extended the previous DisplayTag external sorting and paging project to implement full search capability across the domain objects by using Compass 2.0 - &lt;a href=&quot;http://www.compass-project.org&quot;&gt;http://www.compass-project.org&lt;/a&gt;.
&lt;br/&gt;&lt;br/&gt;
Although there are a number of tutorials around for Compass and AppFuse, I thought I&apos;d update as Compass has just gone to version 2.0 and has new features, (annotations etc).
&lt;br/&gt;&lt;br/&gt;
Search results in the example are displayed in plain HTML with Compass&apos; own paging feature, and also using DisplayTag with its paging external feature, (both on the same search results page in the example).
&lt;br/&gt;&lt;br/&gt;
Code is in a branch off the original project called branches/search - check it out with:
&lt;br/&gt;&lt;br/&gt;
&lt;em&gt;svn checkout http://pagingappfuse.googlecode.com/svn/branches/search/ appfusecompass&lt;/em&gt;
&lt;br/&gt;&lt;br/&gt;
Instructions on how to implement Compass are here:&lt;br/&gt;
&lt;a href=&quot;http://code.google.com/p/pagingappfuse/wiki/CompassSearching&quot;&gt;http://code.google.com/p/pagingappfuse/wiki/CompassSearching&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
Cheers,&lt;br/&gt;
Chris
&lt;/p&gt;
&lt;p&gt;Again, great work Chris! We really appreciate your contributions.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_displaytag_external_sorting_and</guid>
    <title>AppFuse + DisplayTag: External Sorting and Paging Example</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_displaytag_external_sorting_and</link>
        <pubDate>Sat, 17 May 2008 08:19:55 -0600</pubDate>
    <category>Java</category>
    <category>jsp</category>
    <category>appfuse</category>
    <category>displaytag</category>
            <description>&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
Chris Barham has posted an excellent example of how to do &lt;a href=&quot;http://www.nabble.com/DisplayTag-external-paging-and-sorting-example-to17288662s2369.html&quot;&gt;external sorting and paging&lt;/a&gt; to the AppFuse mailing list:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I&apos;ve put together a new AppFuse project which demonstrates how to enhance the List screens.  DisplayTag as provided has issues with large datasets, (it retrieves all the records every time), and sorting via column headings does not work for the entire dataset, only those on screen at the time.
&lt;br/&gt;&lt;br/&gt;
I&apos;ve built a project which addresses these issues, using Hibernate Criteria and extensions to DisplayTags PaginatedList interface which gets DisplayTag to hand off all requests for sorting and paging to the new implementation of PaginatedList.
&lt;br/&gt;&lt;br/&gt;
The Google Code project is checked in to: &lt;a href=&quot;http://code.google.com/p/pagingappfuse/&quot;&gt;http://code.google.com/p/pagingappfuse/&lt;/a&gt;  feel free to check out the code and comment. (instructions here: &lt;a href=&quot;http://code.google.com/p/pagingappfuse/source/checkout&quot;&gt;http://code.google.com/p/pagingappfuse/source/checkout&lt;/a&gt;)
&lt;br/&gt;&lt;br/&gt;
There are instructions regarding the steps taken on the project wiki page here: &lt;a href=&quot;http://code.google.com/p/pagingappfuse/wiki/PagingSorting&quot;&gt;http://code.google.com/p/pagingappfuse/wiki/PagingSorting&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
Cheers,&lt;br/&gt;
Chris
&lt;/p&gt;
&lt;p&gt;Nice work - &lt;em&gt;thanks Chris!&lt;/em&gt;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_2_0_2_released</guid>
    <title>AppFuse 2.0.2 Released</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_2_0_2_released</link>
        <pubDate>Sun, 11 May 2008 23:25:40 -0600</pubDate>
    <category>Java</category>
    <category>myfaces</category>
    <category>jpa</category>
    <category>java</category>
    <category>tapestry</category>
    <category>jsf</category>
    <category>springmvc</category>
    <category>struts2</category>
    <category>java5</category>
    <category>ibatis</category>
    <category>maven2</category>
    <category>spring</category>
    <category>hibernate</category>
    <category>appfuse</category>
            <description>&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 2.0.2. This release includes upgrades to Spring Security 2.0, jMock 2.4, the ability to customize code generation templates and many bug fixes.&lt;/p&gt;

&lt;p&gt;For information on upgrading from 2.0.1, see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0.2&quot; title=&quot;Release Notes 2.0.2&quot;&gt;Release Notes&lt;/a&gt; or &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0.2#ReleaseNotes2.0.2-changelog&quot;&gt;changelog&lt;/a&gt;. AppFuse 2.0.2 is available as a Maven archetype. For information on creating a new project using AppFuse, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; or the &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot; title=&quot;Demos and Videos&quot;&gt;demos and videos&lt;/a&gt;.&lt;/p&gt;

&lt;p class=&quot;smokey&quot;&gt;
To learn more about AppFuse, please read Ryan Withers&apos; &lt;a href=&quot;http://www.ociweb.com/jnb/jnbMay2008.html&quot;&gt;Igniting your applications with AppFuse&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;The 2.0 series of AppFuse has a minimum requirement of the following specification versions:&lt;/p&gt;

&lt;ul class=&quot;glassList&quot;&gt;
	&lt;li&gt;Java Servlet 2.4 and JSP 2.0 (2.1 for JSF)&lt;/li&gt;
	&lt;li&gt;Java 5+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll want to read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;FAQ&lt;/a&gt;.  Join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt; if you have any questions. 

&lt;p&gt;Thanks to everyone for their help contributing code, writing documentation, posting to the mailing lists, and logging issues. &lt;/p&gt;

&lt;p class=&quot;smokey&quot;&gt;
Please post any issues you have with this release to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0.2-Released-td17181660s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_light_1_8_2</guid>
    <title>AppFuse Light 1.8.2 Released</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_light_1_8_2</link>
        <pubDate>Sun, 11 May 2008 22:16:17 -0600</pubDate>
    <category>Java</category>
    <category>appfuse</category>
    <category>wicket</category>
    <category>jdo</category>
    <category>hibernate</category>
    <category>springmvc</category>
    <category>freemarker</category>
    <category>springjdbc</category>
    <category>struts</category>
    <category>velocity</category>
    <category>ibatis</category>
    <category>css</category>
    <category>stripes</category>
    <category>myfaces</category>
    <category>acegi</category>
    <category>jpox</category>
    <category>ojb</category>
    <category>ajax</category>
    <category>jsp</category>
            <description>AppFuse Light 1.8.2 is a bug fixes release that includes upgrades for Spring, Spring Security, Hibernate, Wicket, Tapestry and many others. In addition, Spring bean definitions were replaced with annotations (@Repository, @Service and @Controller). See the &lt;a href=&quot;http://tinyurl.com/6m5kjx&quot;&gt;Release Notes&lt;/a&gt; for more information on what&apos;s changed since the &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_1_8_1&quot;&gt;last release&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
AppFuse Light now offers 60 possible combinations for &lt;a href=&quot;https://appfuse-light.dev.java.net/servlets/ProjectDocumentList?folderID=9159&quot;&gt;
download&lt;/a&gt;:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;&lt;li&gt;&lt;strong&gt;Web Frameworks:&lt;/strong&gt; JSF (MyFaces), Spring MVC (with
Ajax, Acegi Security, JSP, FreeMarker or Velocity), Stripes, Struts
1.x, Struts 2.x, Tapestry, WebWork, Wicket&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Persistence Frameworks:&lt;/strong&gt; Hibernate, iBATIS, JDO (JPOX), OJB, Spring JDBC&lt;/li&gt;&lt;/ul&gt;
&lt;p style=&quot;text-align: center; color: #666&quot;&gt;
&lt;a href=&quot;http://static.raibledesigns.com/repository/images/appfuse-light-1.8-beta.gif&quot; rel=&quot;lightbox&quot; title=&quot;Screenshot of 1.8 with CSS Framework&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/appfuse-light-1.8-beta_sm.gif&quot; width=&quot;300&quot; height=&quot;225&quot; alt=&quot;AppFuse Light Screenshot - click on the box at the bottom right of AL to activate StyleSheet Switcher&quot; style=&quot;border: 1px solid silver&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
If you have any questions about this release, please subscribe to the AppFuse user mailing list by sending a blank e-mail to 
&lt;a href=&quot;mailto:users-subscribe@appfuse.dev.java.net&quot;&gt;users-subscribe@appfuse.dev.java.net&lt;/a&gt;. You can also post questions in a forum-like fashion using Nabble: &lt;a href=&quot;http://appfuse.org/forums&quot;&gt;http://appfuse.org/forum/user&lt;/a&gt;.
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/the_appfuse_primer_is_now</guid>
    <title>The AppFuse Primer is now available!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/the_appfuse_primer_is_now</link>
        <pubDate>Tue, 18 Mar 2008 12:47:15 -0600</pubDate>
    <category>Java</category>
    <category>appfuse</category>
    <category>sourcebeat</category>
    <category>book</category>
            <description>From &lt;a href=&quot;http://www.jroller.com/dlwhitehurst/entry/the_appfuse_primer_is_published&quot;&gt;David Whitehurst&apos;s blog&lt;/a&gt;:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
&lt;a href=&quot;http://www.sourcebeat.com/books/appfuse.html&quot;&gt;
&lt;img src=&quot;//www.sourcebeat.com/images/books/appfuse/coverImage.jpg&quot; alt=&quot;The AppFuse Primer Cover&quot; class=&quot;picture&quot; height=&quot;150&quot; width=&quot;120&quot; /&gt;&lt;/a&gt;
The AppFuse Primer is published! And, you can order your copy today.  It&apos;s been a long road getting this done, but I&apos;m excited about it and I hope you will be too.  Please visit the site and consider the purchase of a copy today at &lt;a href=&quot;http://www.sourcebeat.com/books/appfuse.html&quot;&gt;http://www.sourcebeat.com/books/appfuse.html&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For more information, see &lt;a href=&quot;http://www.prweb.com/releases/2008/03/prweb777294.htm&quot;&gt;SourceBeat&apos;s Press Release&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This book is as up-to-date as you can get. While I hope to do another AppFuse release in the coming months, this book should be up-to-date for quite some time. 
&lt;/p&gt;
&lt;p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/don_brown_makes_maven_2</guid>
    <title>Don Brown Makes Maven 2 Not Suck</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/don_brown_makes_maven_2</link>
        <pubDate>Mon, 28 Jan 2008 09:28:09 -0700</pubDate>
    <category>Java</category>
    <category>maven2</category>
    <category>donbrown</category>
    <category>appfuse</category>
            <description>Don Brown spent some time over the weekend &lt;a href=&quot;http://www.jroller.com/mrdon/entry/making_maven_2_not_suck&quot;&gt;Making Maven 2 not suck&lt;/a&gt;:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
While there are a few (very important, I might add) things &lt;a href=&quot;http://maven.apache.org&quot;&gt;Maven 2&lt;/a&gt; gets right, there are a bunch that just suck, yet I use it at my day job (&lt;a href=&quot;http://atlassian.com&quot;&gt;Atlassian&lt;/a&gt;) and in Open Source work, so in true Open Source tradition, rather than continue bitching, I&apos;m doing something about it. I&apos;m embarking on a quest to fix all the bits of Maven 2 that really annoy me and waste my time. I hope to get most, if not all, of the changes back into the codebase, but my personal deliverable is a build of Maven 2 that doesn&apos;t suck.
&lt;/p&gt;
&lt;p&gt;On his blog, Don lists a number of improvements he hopes to make. This weekend, he implemented the first three, which concentrates on speeding up remote repository access and downloading of artifacts.
&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
First up, tasks #1-3. I implemented these changes in a bored Sunday afternoon and saw a example build (Struts 2 core) go from 3 minutes, 26 seconds to 2 minutes even, so a little over 40% performance improvement.
&lt;/p&gt;
&lt;p&gt;Interested, I decided to try Don&apos;s improvements on &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;. Since it fetches seemingly hundreds of artifacts from Maven&apos;s central repository, it seemed like a good testing ground. With a clean repository (&lt;code&gt;rm -r ~/.m2/repository&lt;/code&gt;), a 8 MB/sec internet connection and &quot;mvn -Dmaven.test.skip&quot;, I achieved the following results with the stock version of Maven 2.0.8:&lt;/p&gt;
&lt;pre style=&quot;margin-left: 20px; margin-right: 30px; padding: 5px; background: #ffd; border: 1px solid silver; font-family: Courier, &quot;Courier New&quot;, monospace&quot;&gt;[INFO] Total time: 7 minutes 40 seconds
[INFO] Finished at: Mon Jan 28 09:02:11 MST 2008
[INFO] Final Memory: 55M/508M
&lt;/pre&gt;
&lt;p&gt;With Don&apos;s improved uber-jar, I received the following results:&lt;/p&gt;
&lt;pre style=&quot;margin-left: 20px; margin-right: 30px; padding: 5px; background: #ffd; border: 1px solid silver; font-family: Courier, &quot;Courier New&quot;, monospace&quot;&gt;[INFO] Total time: 5 minutes 17 seconds
[INFO] Finished at: Mon Jan 28 09:10:56 MST 2008
[INFO] Final Memory: 56M/508M
&lt;/pre&gt;
&lt;p&gt;460 vs. 317 seconds = a &lt;strong&gt;31.1%&lt;/strong&gt; improvement -- &lt;em&gt;Nice work Don!&lt;/em&gt; 
&lt;/p&gt;
&lt;p&gt;
When he implements #4 (Should support artifacts checked into the SCM in the lib/ directory so no external repository needed), I&apos;ll be a much happier Maven consumer. I&apos;ve always wanted the ability to bundle all of AppFuse&apos;s dependencies for offline use like we did in 1.9.x. 
&lt;/p&gt;
&lt;p&gt;
Don - I&apos;ll buy you numerous beverages in &lt;a href=&quot;http://raibledesigns.com/rd/entry/java_web_framework_smackdown_at&quot;&gt;Vegas&lt;/a&gt; if you add the ability to run a Maven command to put all a project&apos;s dependencies in its lib directory too. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/new_tools_for_appfuse_project</guid>
    <title>New Tools for AppFuse Project: MarkMail and FishEye/Crucible</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/new_tools_for_appfuse_project</link>
        <pubDate>Thu, 6 Dec 2007 10:25:37 -0700</pubDate>
    <category>Java</category>
    <category>crucible</category>
    <category>appfuse</category>
    <category>markmail</category>
    <category>fisheye</category>
            <description>We&apos;ve recently added some some new features to the &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; project. The first feature is the good folks at &lt;a href=&quot;http://www.marklogic.com&quot;&gt;Mark Logic&lt;/a&gt; (primarily Jason Hunter) has setup a kick-ass mailing list archive for us at &lt;a href=&quot;http://appfuse.markmail.org&quot;&gt;appfuse.markmail.org&lt;/a&gt;.&lt;/p&gt;

&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://appfuse.markmail.org&quot;&gt;&lt;img src=&quot;//farm3.static.flickr.com/2145/2088743973_fc5c5713dc.jpg&quot; width=&quot;500&quot; height=&quot;154&quot; alt=&quot;appfuse.markmail.org&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;This is an easily searchable set of archives and goes all the way back to when our mailing list started in March 2004. In the future, they hope to provide RSS/Atom feeds and allow posting (like &lt;a href=&quot;http://appfuse.org/forum/user&quot;&gt;Nabble&lt;/a&gt; does). I&apos;ve added a link to these archives to the &lt;a href=&quot;/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;mailing list&lt;/a&gt; page. To learn more about MarkMail, please see &lt;a href=&quot;http://markmail.org/message/q2dtugicwt6kzfdj&quot;&gt;Jason&apos;s announcement of the service @ Apache&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;
The second feature is we&apos;ve installed FishEye and Crucible (a code review tool) on AppFuse&apos;s server at Contegix. We&apos;ve used FishEye &lt;a href=&quot;http://fisheye4.cenqua.com/browse/appfuse&quot;&gt;in the past&lt;/a&gt;, but now we have it on our &lt;a href=&quot;http://source.appfuse.org&quot;&gt;own server&lt;/a&gt;.

&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://source.appfuse.org/browse/appfuse&quot; title=&quot;FishEye for AppFuse&quot;&gt;&lt;img src=&quot;//farm3.static.flickr.com/2282/2091689470_1428f8e06a.jpg&quot; width=&quot;500&quot; height=&quot;225&quot; alt=&quot;FishEye for AppFuse&quot; style=&quot;border: 1px solid #000&quot;/&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;Thanks to &lt;a href=&quot;http://www.marklogic.com&quot;&gt;Mark Logic&lt;/a&gt; and &lt;a href=&quot;http://atlassian.com&quot;&gt;Atlassian&lt;/a&gt; for supporting the AppFuse project.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/integrate_appfuse_with_crowd_in</guid>
    <title>Integrate AppFuse with Crowd in 5 Easy Steps</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/integrate_appfuse_with_crowd_in</link>
        <pubDate>Thu, 29 Nov 2007 10:33:32 -0700</pubDate>
    <category>Java</category>
    <category>atlassian</category>
    <category>appfuse</category>
    <category>acegi</category>
    <category>crowd</category>
            <description>The good folks at Atlassian have written a nice tutorial on &lt;a href=&quot;http://confluence.atlassian.com/display/CROWD/Integrating+Appfuse+-+a+Crowd-Acegi+Integration+Tutorial&quot;&gt;Integrating Crowd with AppFuse and Acegi&lt;/a&gt;. &lt;a href=&quot;http://www.atlassian.com/software/crowd/&quot;&gt;Crowd&lt;/a&gt;&lt;/span&gt; is a web-based single sign-on (SSO) tool that simplifies application provisioning and identity management. We use Crowd for the AppFuse project to maintain a &lt;a href=&quot;http://login.appfuse.org&quot;&gt;single user store&lt;/a&gt; for &lt;a href=&quot;http://issues.appfuse.org&quot;&gt;JIRA&lt;/a&gt;, &lt;a href=&quot;http://appfuse.org&quot;&gt;Confluence&lt;/a&gt;, and &lt;a href=&quot;http://builds.appfuse.org&quot;&gt;Bamboo&lt;/a&gt;. It&apos;s worked &lt;em&gt;awesome&lt;/em&gt; for us.
&lt;/p&gt;
&lt;p style=&quot;text-align: center&quot;&gt;
&lt;a href=&quot;http://www.atlassian.com/software/crowd/&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/crowd.gif&quot; width=&quot;466&quot; height=&quot;148&quot; style=&quot;border: 0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_light_1_8_1</guid>
    <title>AppFuse Light 1.8.1 Released: includes upgrades to Spring 2.5 and Wicket 1.3</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_light_1_8_1</link>
        <pubDate>Thu, 29 Nov 2007 09:28:06 -0700</pubDate>
    <category>Java</category>
    <category>freemarker</category>
    <category>jdo</category>
    <category>struts</category>
    <category>hibernate</category>
    <category>appfuse</category>
    <category>springmvc</category>
    <category>wicket</category>
    <category>springjdbc</category>
    <category>velocity</category>
    <category>ajax</category>
    <category>jsp</category>
    <category>stripes</category>
    <category>css</category>
    <category>jpox</category>
    <category>myfaces</category>
    <category>ojb</category>
    <category>ibatis</category>
    <category>acegi</category>
            <description>&lt;a href=&quot;http://appfuse-light.dev.java.net&quot;&gt;AppFuse Light&lt;/a&gt; 1.8.1 is a bug fixes release that includes an upgrade to Spring 2.5 and Wicket 1.3 RC1. See the &lt;a href=&quot;http://tinyurl.com/2r4fd8&quot;&gt;Release Notes&lt;/a&gt; for more information on what&apos;s changed since the &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_1_8_released&quot;&gt;last release&lt;/a&gt;.
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
What is AppFuse Light? &lt;a href=&quot;?&quot; onclick=&quot;Effect.toggle(&apos;whatisappfuselight&apos;, &apos;blind&apos;); return false&quot;&gt;Click here&lt;/a&gt; to find out.
&lt;/p&gt;
&lt;p style=&quot;display: none; border: 1px solid #F0C000;
 background-color: #FFFFCE;
 text-align:left;
 margin-top: 5px;
 margin-bottom: 5px; padding: 10px&quot; id=&quot;whatisappfuselight&quot;&gt;
&lt;a href=&quot;http://appfuse-light.dev.java.net&quot;&gt;AppFuse Light&lt;/a&gt; is a lightweight version of &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;.
        I was inspired to create it while writing &lt;a href=&quot;http://springlive.com&quot;&gt;Spring Live&lt;/a&gt; and 
        looking at the &lt;em&gt;struts-blank&lt;/em&gt; and &lt;em&gt;webapp-minimal&lt;/em&gt; 
        applications that ship with Struts and Spring, respectively.
        These &quot;starter&quot; apps were not robust enough for me, and I wanted 
        something like AppFuse, only simpler. 
&lt;br/&gt;&lt;br/&gt;
AppFuse Light is designed to show Java Web Developers how to start
        a bare-bones webapp using a &lt;a href=&quot;http://www.springframework.org&quot;&gt;
        Spring&lt;/a&gt;-managed middle-tier backend and &lt;a href=&quot;http://www.hibernate.org&quot;&gt;
        Hibernate&lt;/a&gt; for persistence. By default, AppFuse Light uses Spring for
        its MVC framework, but you can change it to 
        &lt;a href=&quot;http://myfaces.apache.org&quot;&gt;JSF/MyFaces&lt;/a&gt;,
        &lt;a href=&quot;http://mc4j.org/confluence/display/stripes/Home&quot;&gt;Stripes&lt;/a&gt;,
        &lt;a href=&quot;http://struts.apache.org&quot;&gt;Struts 1.x&lt;/a&gt;, 
        &lt;a href=&quot;http://struts.apache.org/2.x/&quot;&gt;Struts 2.x&lt;/a&gt;,
        &lt;a href=&quot;http://opensymphony.com/webwork&quot;&gt;WebWork&lt;/a&gt;, 
        &lt;a href=&quot;http://tapestry.apache.org&quot;&gt;Tapestry&lt;/a&gt; or
        &lt;a href=&quot;http://wicket.apache.org/&quot;&gt;Wicket&lt;/a&gt;. In addition, there&apos;s a
        number of extras for Spring MVC, including &lt;a href=&quot;http://velocity.apache.org&quot;&gt;Velocity&lt;/a&gt; and &lt;a href=&quot;http://freemarker.org&quot;&gt;FreeMarker&lt;/a&gt; versions, Ajax
        support and &lt;a href=&quot;http://acegisecurity.org&quot;&gt;Acegi Security&lt;/a&gt; support.
&lt;br/&gt;&lt;br/&gt;
This project was formerly named &lt;a href=&quot;http://raibledesigns.com/rd/entry/equinox_a_k_a_appfuse1&quot;&gt;Equinox&lt;/a&gt; and has been under development since April 2004.
&lt;/p&gt;
&lt;p&gt;
AppFuse Light now offers 60 possible combinations for &lt;a href=&quot;https://appfuse-light.dev.java.net/servlets/ProjectDocumentList?folderID=8439&quot;&gt;
download&lt;/a&gt;:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;&lt;li&gt;&lt;strong&gt;Web Frameworks:&lt;/strong&gt; JSF (MyFaces), Spring MVC (with
Ajax, Acegi Security, JSP, FreeMarker or Velocity), Stripes, Struts
1.x, Struts 2.x, Tapestry, WebWork, Wicket&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Persistence Frameworks:&lt;/strong&gt; Hibernate, iBATIS, JDO (JPOX), OJB, Spring JDBC&lt;/li&gt;&lt;/ul&gt;
&lt;p style=&quot;text-align: center; color: #666&quot;&gt;
&lt;a href=&quot;http://static.raibledesigns.com/repository/images/appfuse-light-1.8-beta.gif&quot; rel=&quot;lightbox&quot; title=&quot;Screenshot of 1.8 with CSS Framework&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/appfuse-light-1.8-beta_sm.gif&quot; width=&quot;300&quot; height=&quot;225&quot; alt=&quot;AppFuse Light Screenshot - click on the box at the bottom right of AL to activate StyleSheet Switcher&quot; style=&quot;border: 1px solid silver&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
If you have any questions about this release, please subscribe to the AppFuse user mailing list by sending a blank e-mail to 
&lt;a href=&quot;mailto:users-subscribe@appfuse.dev.java.net&quot;&gt;users-subscribe@appfuse.dev.java.net&lt;/a&gt;. You can also post questions in a forum-like fashion using Nabble: &lt;a href=&quot;http://appfuse.org/forums&quot;&gt;http://appfuse.org/forum/user&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
If you&apos;re a developer of one of the frameworks that AppFuse Light uses - I&apos;d love a code review to make sure I&apos;m &quot;up to snuff&quot; on how to use your framework. I&apos;m also more than willing to give commit rights if you&apos;d like to improve the implementation of your framework.
&lt;/p&gt;
&lt;p&gt;Live demos are available at:
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light&quot;&gt;Spring&lt;/a&gt; &amp;middot; &lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-ajax&quot;&gt;Spring + Ajax&lt;/a&gt; 
            &amp;middot; &lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-security&quot;&gt;Spring + Acegi&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-jsf&quot;&gt;MyFaces + Facelets&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-stripes&quot;&gt;Stripes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-struts&quot;&gt;Struts 1&lt;/a&gt; &amp;middot; &lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-struts2&quot;&gt;Struts 2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-tapestry&quot;&gt;Tapestry&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-webwork&quot;&gt;WebWork&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-wicket&quot;&gt;Wicket&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What&apos;s on tap for AppFuse Light 2.0? Here&apos;s what I&apos;m hoping to do:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Drop the seldom-used persistence frameworks: JDBC, JDO and OJB.&lt;/li&gt;
&lt;li&gt;Drop Struts 1.x and WebWork as web frameworks (replaced by Struts 2).&lt;/li&gt;
&lt;li&gt;Support the same persistence frameworks as AppFuse: Hibernate,
iBATIS and JPA.&lt;/li&gt;
&lt;li&gt;Re-use appfuse-service, appfuse-hibernate, appfuse-ibatis and
appfuse-jpa in AppFuse Light. I&apos;ll likely include the core classes
(User, Role) since AppFuse Light is more &quot;raw&quot; than AppFuse.&lt;/li&gt;
&lt;li&gt;Require Java 5.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Let me know if you disagree with any of these items or would like to see other enhancements.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_2_0_1_released</guid>
    <title>AppFuse 2.0.1 Released</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_2_0_1_released</link>
        <pubDate>Mon, 26 Nov 2007 09:29:43 -0700</pubDate>
    <category>Java</category>
    <category>appfuse</category>
    <category>tapestry</category>
    <category>java</category>
    <category>spring</category>
    <category>jsf</category>
    <category>maven2</category>
    <category>springmvc</category>
    <category>jpa</category>
    <category>java5</category>
    <category>struts2</category>
    <category>hibernate</category>
    <category>myfaces</category>
    <category>ibatis</category>
            <description>The AppFuse Team is pleased to announce the release of AppFuse 2.0.1. This release squashes a number of bugs and includes an upgrade to Spring 2.5. To learn more about Spring 2.5&apos;s features, see InfoQ&apos;s &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.infoq.com/articles/spring-2.5-part-1&quot; rel=&quot;nofollow&quot;&gt;What&apos;s New in Spring 2.5: Part 1&lt;/a&gt;&lt;/span&gt; article.&lt;/p&gt;

&lt;p&gt;For information on upgrading from 2.0, see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0.1&quot; title=&quot;Release Notes 2.0.1&quot;&gt;2.0.1 Release Notes&lt;/a&gt; or &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0.1#ReleaseNotes2.0.1-changelog&quot;&gt;changelog&lt;/a&gt;. AppFuse 2.0.1 is available as a Maven archetype. For information on creating a new project using AppFuse, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; or the &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot; title=&quot;Demos and Videos&quot;&gt;demos and videos&lt;/a&gt;. &lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
What is AppFuse? &lt;a href=&quot;?&quot; onclick=&quot;Effect.toggle(&apos;whatisappfuse&apos;, &apos;blind&apos;); return false&quot;&gt;Click here&lt;/a&gt; to find out.
&lt;/p&gt;
&lt;p style=&quot;display: none; border: 1px solid #F0C000;
 background-color: #FFFFCE;
 text-align:left;
 margin-top: 5px;
 margin-bottom: 5px; padding: 10px&quot; id=&quot;whatisappfuse&quot;&gt;
&lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; is an open source project and application that uses open source tools built on the Java platform to help you develop Web applications quickly and efficiently. It was originally developed to eliminate the ramp-up time found when building new web applications for customers. At its core, AppFuse is a project skeleton, similar to the one that&apos;s created by your IDE when you click through a wizard to create a new web project.
&lt;br/&gt;&lt;br/&gt;
AppFuse 1.x uses Ant to create your project, as well as build/test/deploy it. AppFuse 2.0 uses Maven 2 to create your project as well as build/test/deploy it. IDE support is much better in 2.0 because you can generate the IDE project files with Maven plugins. AppFuse 1.x uses XDoclet and JDK 1.4+.&lt;br/&gt;&lt;br/&gt;
This project was started in &lt;a href=&quot;http://raibledesigns.com/rd/entry/announce_struts_resume_and_appfuse&quot;&gt;April 2003&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;The 2.0 series of AppFuse has a minimum requirement of the following specification versions:&lt;/p&gt;

&lt;ul class=&quot;glassList&quot;&gt;
	&lt;li&gt;Java Servlet 2.4 and JSP 2.0 (2.1 for JSF)&lt;/li&gt;
	&lt;li&gt;Java 5+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll want to read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;FAQ&lt;/a&gt;.  Join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt; if you have any questions. 

&lt;p&gt;Thanks to everyone for their help contributing code, writing documentation, posting to the mailing lists, and logging issues. &lt;/p&gt;

&lt;p&gt;We greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot; title=&quot;Sponsors&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot; rel=&quot;nofollow&quot;&gt;Atlassian&lt;/a&gt;&lt;/span&gt;, &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://contegix.com&quot; rel=&quot;nofollow&quot;&gt;Contegix&lt;/a&gt;&lt;/span&gt;, &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.jetbrains.com&quot; rel=&quot;nofollow&quot;&gt;JetBrains&lt;/a&gt;&lt;/span&gt;, and &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://www.java.net&quot; rel=&quot;nofollow&quot;&gt;Java.net&lt;/a&gt;&lt;/span&gt;. Atlassian and Contegix are especially awesome: &lt;span class=&quot;nobr&quot;&gt;&lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot; rel=&quot;nofollow&quot;&gt;Atlassian has donated licenses to all its products and Contegix has donated an entire server&lt;/a&gt;&lt;/span&gt; to the AppFuse project. Thanks guys - &lt;em&gt;you rock!&lt;/em&gt;&lt;/p&gt;

&lt;p class=&quot;smokey&quot;&gt;
Please post any issues you have with this release to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0.1-Released-tf4876194s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/upgrading_appfuse_to_spring_2</guid>
    <title>Upgrading AppFuse to Spring 2.5</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/upgrading_appfuse_to_spring_2</link>
        <pubDate>Wed, 7 Nov 2007 08:27:20 -0700</pubDate>
    <category>Java</category>
    <category>maven</category>
    <category>appfuse</category>
    <category>spring</category>
            <description>Last night, I spent a few minutes upgrading AppFuse to &lt;a href=&quot;http://www.springframework.org/node/548&quot;&gt;Spring 2.5 RC1&lt;/a&gt;. According to InfoQ, &lt;a href=&quot;http://www.infoq.com/news/2007/11/spring25rc&quot;&gt;Spring 2.5 is a drop-in upgrade for Spring 2.0&lt;/a&gt;. However, if you&apos;re using Maven, it&apos;s not quite that easy. The good news is it is easy, you just need to change your pom.xml a bit. The steps I used to upgrade AppFuse are listed below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Add a repository for Spring&apos;s milestone releases:
&lt;pre style=&quot;margin-top: 5px&quot;&gt;
&amp;lt;repository&amp;gt;
    &amp;lt;id&amp;gt;spring-milestone&amp;lt;/id&amp;gt;
    &amp;lt;url&amp;gt;http://s3.amazonaws.com/maven.springframework.org/milestone&amp;lt;/url&amp;gt;
&amp;lt;/repository&amp;gt;
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Change artifactId of &quot;spring-mock&quot; to be &quot;spring-test&quot;.&lt;/li&gt;
&lt;li&gt;Change version to be 2.5-rc1.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point, if you&apos;re using &quot;spring&quot; as your artifactId (instead of the smaller fine-grained dependencies), you&apos;ll likely get the following error in a Spring MVC application:&lt;/p&gt;
&lt;pre&gt;
java.lang.NoClassDefFoundError: 
org/springframework/web/servlet/handler/AbstractUrlHandlerMapping
&lt;/pre&gt;
&lt;p&gt;This happens because Spring MVC is no longer included in the uber spring.jar. You&apos;ll need to add a dependency on &quot;spring-webmvc&quot; to solve this problem. Unfortunately, this JAR is dependent on the fine-grained modules, so you may have to modify your pom.xml to depend on the fine-grained modules - or exclude them all from spring-webmvc.
&lt;/p&gt;
&lt;p&gt;The good news is Spring has excluded all the &lt;a href=&quot;http://raibledesigns.com/rd/entry/maven_2_hates_commons_logging&quot;&gt;invalid commons-logging dependencies&lt;/a&gt; for you so you don&apos;t have to anymore.
&lt;/p&gt;
&lt;p&gt;After getting all the dependencies straightened out - I ran the integration tests:
&lt;/p&gt;
&lt;pre&gt;
org.springframework.beans.NotReadablePropertyException: Invalid property 
&apos;fileUpload&apos; of bean class [org.appfuse.webapp.controller.FileUpload]: Bean 
property &apos;fileUpload&apos; is not readable or has an invalid getter method: Does the 
return type of the getter match the parameter type of the setter?
&lt;/pre&gt;
&lt;p&gt;
Looking at uploadForm.jsp, I&apos;m guessing the problem happens because of the following code:
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;spring:bind path=&quot;fileUpload.file&quot;&amp;gt;
&amp;lt;input type=&quot;file&quot; name=&quot;file&quot; id=&quot;file&quot; class=&quot;file medium&quot; value=&quot;&amp;lt;c:out value=&quot;${status.value}&quot;/&amp;gt;&quot;/&amp;gt;
&amp;lt;/spring:bind&amp;gt;
&lt;/pre&gt;
&lt;p&gt;&lt;a href=&quot;http://opensource.atlassian.com/projects/spring/browse/SPR-4022&quot;&gt;Confirmed&lt;/a&gt; - changing the &quot;path&quot; attribute to &quot;file&quot; fixes the problem. I also found out that setting the &quot;value&quot; on an &amp;lt;input type=&quot;file&quot;&amp;gt; doesn&apos;t work, so wrapping the field with &amp;lt;spring:bind&amp;gt; doesn&apos;t make a whole lot of sense anyway.&lt;/p&gt;
&lt;p&gt;To conclude, it doesn&apos;t look like the first release candidate of Spring 2.5 is &lt;em&gt;exactly&lt;/em&gt; a drop-in upgrade for Spring 2.0, but it&apos;s pretty darn close. I&apos;m sure by the time it&apos;s released, it will be. I&apos;d encourage you to try 2.5 in your Spring-dependent projects to see if you find any issues.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I was successfully able to migrate AppFuse from using the uber JAR to fine-grained JARs. However, I ran into a couple issues in the process. The first is that even though I&apos;m including spring-aop in the &lt;em&gt;appfuse-service&lt;/em&gt; module, it&apos;s not pulled in for the web frameworks (which depend on appfuse-service). Explicitly declaring spring-aop as a dependency for the appfuse-web module fixes this. Secondly, I had to modify my Acegi Security exclusions  so it wouldn&apos;t include dependencies that no longer exist in 2.5.
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;dependency&amp;gt;
    &amp;lt;groupId&amp;gt;org.acegisecurity&amp;lt;/groupId&amp;gt;
    &amp;lt;artifactId&amp;gt;acegi-security-tiger&amp;lt;/artifactId&amp;gt;
    &amp;lt;version&amp;gt;${acegi.version}&amp;lt;/version&amp;gt;
    &amp;lt;exclusions&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-dao&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-jdbc&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-remoting&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
        &amp;lt;exclusion&amp;gt;
            &amp;lt;groupId&amp;gt;org.springframework&amp;lt;/groupId&amp;gt;
            &amp;lt;artifactId&amp;gt;spring-support&amp;lt;/artifactId&amp;gt;
        &amp;lt;/exclusion&amp;gt;
    &amp;lt;/exclusions&amp;gt;
&amp;lt;/dependency&amp;gt;
&lt;/pre&gt;
&lt;p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_2_0_released</guid>
    <title>AppFuse 2.0 Released!</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_2_0_released</link>
        <pubDate>Tue, 18 Sep 2007 15:22:20 -0600</pubDate>
    <category>Java</category>
    <category>java</category>
    <category>struts2</category>
    <category>java5</category>
    <category>myfaces</category>
    <category>ibatis</category>
    <category>jpa</category>
    <category>hibernate</category>
    <category>tapestry</category>
    <category>appfuse</category>
    <category>springmvc</category>
    <category>jsf</category>
    <category>maven2</category>
    <category>spring</category>
            <description>&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
I&apos;m extremely happy to announce we&apos;ve finally finished developing AppFuse 2.0. The road to AppFuse 2.0 has been a long journey through Mavenland, annotations and generics. Thanks to all the developers, contributors and users for helping test, polish and prove that AppFuse 2 is an excellent solution for developing Java-based applications. Your time, patience and usage of AppFuse has made it the strong foundation it is today. Last but certainly not least, thanks to all the great Java developers who wrote the frameworks that AppFuse uses - we&apos;re truly standing on the shoulders of giants.
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
What is AppFuse? &lt;a href=&quot;?&quot; onclick=&quot;Effect.toggle(&apos;whatisappfuse&apos;, &apos;blind&apos;); return false&quot;&gt;Click here&lt;/a&gt; to find out.
&lt;/p&gt;
&lt;p style=&quot;display: none; border: 1px solid #F0C000;
 background-color: #FFFFCE;
 text-align:left;
 margin-top: 5px;
 margin-bottom: 5px; padding: 10px&quot; id=&quot;whatisappfuse&quot;&gt;
&lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; is an open source project and application that uses open source tools built on the Java platform to help you develop Web applications quickly and efficiently. It was originally developed to eliminate the ramp-up time found when building new web applications for customers. At its core, AppFuse is a project skeleton, similar to the one that&apos;s created by your IDE when you click through a wizard to create a new web project.
&lt;br/&gt;&lt;br/&gt;
AppFuse 1.x uses Ant to create your project, as well as build/test/deploy it. AppFuse 2.0 uses Maven 2 to create your project as well as build/test/deploy it. IDE support is much better in 2.0 because you can generate the IDE project files with Maven plugins. AppFuse 1.x uses XDoclet and JDK 1.4+.&lt;br/&gt;&lt;br/&gt;
This project was started in &lt;a href=&quot;http://raibledesigns.com/rd/entry/announce_struts_resume_and_appfuse&quot;&gt;April 2003&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;AppFuse 2.0 is available as a Maven archetype. For information on creating a new project using this release, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; or the &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot;&gt;demos and videos&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll might want to read our &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;Frequently Asked Questions&lt;/a&gt;.  If you have any questions or issues, please post them to the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt;. The &lt;a href=&quot;http://appfuse.org/display/APF/Maven+2&quot; title=&quot;Maven 2&quot;&gt;Maven Reference Guide&lt;/a&gt; has a map of Ant &amp;raquo; Maven commands. &lt;a href=&quot;http://appfuse.org/display/APF/Maven+for+Newbies&quot; title=&quot;Maven for Newbies&quot;&gt;Maven for Newbies&lt;/a&gt; might also be useful if you&apos;ve never used Maven before. There is &lt;a href=&quot;http://appfuse.org/display/APF/FAQ#FAQ-usingant&quot;&gt;some support for Ant&lt;/a&gt; in this release.&lt;/p&gt;

&lt;p&gt;AppFuse 2.0 contains over 200 pages of &lt;a href=&quot;http://appfuse.org&quot;&gt;documentation&lt;/a&gt;, downloadable as a &lt;a href=&quot;https://appfuse.dev.java.net/files/documents/1397/68818/appfuse-documentation-2.0.pdf&quot;&gt;PDF&lt;/a&gt; (3 MB). You can also download all its &lt;a href=&quot;https://appfuse.dev.java.net/files/documents/1397/68819/appfuse-dependencies-2.0.zip&quot;&gt;dependencies&lt;/a&gt; and install them in your local repository if you want to work offline.&lt;/p&gt;

&lt;p&gt;For more information, please see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0&quot; title=&quot;Release Notes 2.0&quot;&gt;2.0 Release Notes&lt;/a&gt;. The 2.0 series of AppFuse has a minimum requirement of the following specification versions:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Java Servlet 2.4 and JSP 2.0 (2.1 for JSF)&lt;/li&gt;
	&lt;li&gt;Java 5+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;New features in AppFuse 2.0 include:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Maven 2 Integration&lt;/li&gt;
	&lt;li&gt;Upgraded WebWork to Struts 2&lt;/li&gt;
	&lt;li&gt;JDK 5, Annotations, JSP 2.0, Servlet 2.4&lt;/li&gt;
	&lt;li&gt;JPA Support&lt;/li&gt;
	&lt;li&gt;Generic CRUD backend&lt;/li&gt;

	&lt;li&gt;Full Eclipse, IDEA and NetBeans support&lt;/li&gt;
	&lt;li&gt;Fast startup and no deploy with Maven Jetty Plugin&lt;/li&gt;
	&lt;li&gt;Testable on multiple appservers and databases with Cargo and profiles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We appreciate the time and effort everyone has put toward contributing code and documentation, posting to the mailing lists, and logging issues. &lt;/p&gt;

&lt;p&gt;We&apos;re also grateful for the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot; title=&quot;Sponsors&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://contegix.com&quot;&gt;Contegix&lt;/a&gt;, &lt;a href=&quot;http://www.jetbrains.com&quot;&gt;JetBrains&lt;/a&gt;, and &lt;a href=&quot;http://www.java.net&quot;&gt;Java.net&lt;/a&gt;. Atlassian and Contegix are especially awesome: &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot;&gt;Atlassian has donated licenses to all its products and Contegix has donated an entire server&lt;/a&gt; to the AppFuse project. Thanks guys - &lt;em&gt;you rock!&lt;/em&gt;&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
Comments and issues should be posted to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0-Released%21-tf4477191s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_light_1_8_released</guid>
    <title>AppFuse Light 1.8 Released</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_light_1_8_released</link>
        <pubDate>Fri, 14 Sep 2007 11:01:46 -0600</pubDate>
    <category>Java</category>
    <category>struts</category>
    <category>stripes</category>
    <category>acegi</category>
    <category>ibatis</category>
    <category>jpox</category>
    <category>ajax</category>
    <category>springjdbc</category>
    <category>myfaces</category>
    <category>jsp</category>
    <category>ojb</category>
    <category>wicket</category>
    <category>hibernate</category>
    <category>jdo</category>
    <category>freemarker</category>
    <category>springmvc</category>
    <category>appfuse</category>
    <category>css</category>
    <category>velocity</category>
            <description>&lt;a href=&quot;http://appfuse-light.dev.java.net&quot;&gt;AppFuse Light&lt;/a&gt; 1.8 adds CSS Framework integration, as well as support
for Stripes (1.4.2) and Wicket (1.2.6). It also has significant upgrades for JSF and Tapestry; to versions 1.2 and 4.1.3 respectively. See the &lt;a href=&quot;http://tinyurl.com/3xuygc&quot;&gt;Release Notes&lt;/a&gt; for more information on what&apos;s changed since the &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_light_1_8_beta&quot;&gt;the beta release of 1.8&lt;/a&gt;.
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
What is AppFuse Light? &lt;a href=&quot;?&quot; onclick=&quot;Effect.toggle(&apos;whatisappfuselight&apos;, &apos;blind&apos;); return false&quot;&gt;Click here&lt;/a&gt; to find out.
&lt;/p&gt;
&lt;p style=&quot;display: none; border: 1px solid #F0C000;
 background-color: #FFFFCE;
 text-align:left;
 margin-top: 5px;
 margin-bottom: 5px; padding: 10px&quot; id=&quot;whatisappfuselight&quot;&gt;
&lt;a href=&quot;http://appfuse-light.dev.java.net&quot;&gt;AppFuse Light&lt;/a&gt; is a lightweight version of &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt;.
        I was inspired to create it while writing &lt;a href=&quot;http://springlive.com&quot;&gt;Spring Live&lt;/a&gt; and 
        looking at the &lt;em&gt;struts-blank&lt;/em&gt; and &lt;em&gt;webapp-minimal&lt;/em&gt; 
        applications that ship with Struts and Spring, respectively.
        These &quot;starter&quot; apps were not robust enough for me, and I wanted 
        something like AppFuse, only simpler. 
&lt;br/&gt;&lt;br/&gt;
AppFuse Light is designed to show Java Web Developers how to start
        a bare-bones webapp using a &lt;a href=&quot;http://www.springframework.org&quot;&gt;
        Spring&lt;/a&gt;-managed middle-tier backend and &lt;a href=&quot;http://www.hibernate.org&quot;&gt;
        Hibernate&lt;/a&gt; for persistence. By default, AppFuse Light uses Spring for
        its MVC framework, but you can change it to 
        &lt;a href=&quot;http://myfaces.apache.org&quot;&gt;JSF/MyFaces&lt;/a&gt;,
        &lt;a href=&quot;http://mc4j.org/confluence/display/stripes/Home&quot;&gt;Stripes&lt;/a&gt;,
        &lt;a href=&quot;http://struts.apache.org&quot;&gt;Struts 1.x&lt;/a&gt;, 
        &lt;a href=&quot;http://struts.apache.org/2.x/&quot;&gt;Struts 2.x&lt;/a&gt;,
        &lt;a href=&quot;http://opensymphony.com/webwork&quot;&gt;WebWork&lt;/a&gt;, 
        &lt;a href=&quot;http://tapestry.apache.org&quot;&gt;Tapestry&lt;/a&gt; or
        &lt;a href=&quot;http://wicket.apache.org/&quot;&gt;Wicket&lt;/a&gt;. In addition, there&apos;s a
        number of extras for Spring MVC, including &lt;a href=&quot;http://velocity.apache.org&quot;&gt;Velocity&lt;/a&gt; and &lt;a href=&quot;http://freemarker.org&quot;&gt;FreeMarker&lt;/a&gt; versions, Ajax
        support and &lt;a href=&quot;http://acegisecurity.org&quot;&gt;Acegi Security&lt;/a&gt; support.
&lt;br/&gt;&lt;br/&gt;
This project was formerly named &lt;a href=&quot;http://raibledesigns.com/rd/entry/equinox_a_k_a_appfuse1&quot;&gt;Equinox&lt;/a&gt; and has been under development since April 2004.
&lt;/p&gt;
&lt;p&gt;
AppFuse Light now offers 60 possible combinations for &lt;a href=&quot;https://appfuse-light.dev.java.net/servlets/ProjectDocumentList?folderID=8006&quot;&gt;
download&lt;/a&gt;:
&lt;/p&gt;
&lt;ul class=&quot;glassList&quot;&gt;&lt;li&gt;&lt;strong&gt;Web Frameworks:&lt;/strong&gt; JSF (MyFaces), Spring MVC (with
Ajax, Acegi Security, JSP, FreeMarker or Velocity), Stripes, Struts
1.x, Struts 2.x, Tapestry, WebWork, Wicket&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Persistence Frameworks:&lt;/strong&gt; Hibernate, iBATIS, JDO (JPOX), OJB, Spring JDBC&lt;/li&gt;&lt;/ul&gt;
&lt;p style=&quot;text-align: center; color: #666&quot;&gt;
&lt;a href=&quot;http://static.raibledesigns.com/repository/images/appfuse-light-1.8-beta.gif&quot; rel=&quot;lightbox&quot; title=&quot;Screenshot of 1.8 with CSS Framework&quot;&gt;&lt;img src=&quot;//static.raibledesigns.com/repository/images/appfuse-light-1.8-beta_sm.gif&quot; width=&quot;300&quot; height=&quot;225&quot; alt=&quot;AppFuse Light Screenshot - click on the box at the bottom right of AL to activate StyleSheet Switcher&quot; style=&quot;border: 1px solid silver&quot; /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
If you have any questions about this release, please subscribe to the AppFuse user mailing list by sending a blank e-mail to 
&lt;a href=&quot;mailto:users-subscribe@appfuse.dev.java.net&quot;&gt;users-subscribe@appfuse.dev.java.net&lt;/a&gt;. You can also post questions in a forum-like fashion using Nabble: &lt;a href=&quot;http://appfuse.org/forums&quot;&gt;http://appfuse.org/forum/user&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
If you&apos;re a developer of one of the frameworks that AppFuse Light uses - I&apos;d love a code review to make sure I&apos;m &quot;up to snuff&quot; on how to use your framework. I&apos;m also more than willing to give commit rights if you&apos;d like to improve the implementation of your framework.
&lt;/p&gt;
&lt;p&gt;Live demos are available at:
&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light&quot;&gt;Spring&lt;/a&gt; &amp;middot; &lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-ajax&quot;&gt;Spring + Ajax&lt;/a&gt; 
            &amp;middot; &lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-security&quot;&gt;Spring + Acegi&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-jsf&quot;&gt;MyFaces + Facelets&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-stripes&quot;&gt;Stripes&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-struts&quot;&gt;Struts 1&lt;/a&gt; &amp;middot; &lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-struts2&quot;&gt;Struts 2&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-tapestry&quot;&gt;Tapestry&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-webwork&quot;&gt;WebWork&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://demo2.appfuse.org/appfuse-light-wicket&quot;&gt;Wicket&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p class=&quot;smokey&quot;&gt;
Yes, I realize that 60 combinations is ridiculous. I didn&apos;t create the frameworks, I&apos;m just integrating them so you don&apos;t have to. &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt; 
&lt;br/&gt;&lt;br/&gt;
Unfortunately, it&apos;s a real pain to create Maven archetypes or they&apos;d all be as easy as &lt;strong&gt;mvn archetype:create&lt;/strong&gt;. Rumor is that the archetype plugin will allow you to create-from-project in the future. When that happens, I&apos;ll make sure all the combinations are available as archetypes.
&lt;/p&gt;
&lt;p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_2_0_rc1_released</guid>
    <title>AppFuse 2.0 RC1 Released</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_2_0_rc1_released</link>
        <pubDate>Tue, 4 Sep 2007 01:42:15 -0600</pubDate>
    <category>Java</category>
    <category>struts</category>
    <category>maven2</category>
    <category>hibernate</category>
    <category>spring</category>
    <category>struts2</category>
    <category>jsf</category>
    <category>tapestry</category>
    <category>springmvc</category>
    <category>appfuse</category>
            <description>&lt;a href=&quot;http://appfuse.org&quot;&gt;&lt;img src=&quot;//appfuse.dev.java.net/images/icon.gif&quot; class=&quot;picture&quot; style=&quot;border: 0&quot;&gt;&lt;/a&gt;
The AppFuse Team is pleased to announce the release of AppFuse 2.0 RC1! This release marks a huge step in the march to releasing AppFuse 2.0. This release puts the finishing touches on the &lt;a href=&quot;http://static.appfuse.org/plugins/appfuse-maven-plugin&quot;&gt;AppFuse Maven Plugin&lt;/a&gt; (AMP), which offers CRUD generation, as well as the ability to change AppFuse from &quot;embedded mode&quot; to &quot;full source&quot; (like 1.x). In addition, we&apos;ve addressed over 100 issues in preparation for the final 2.0 release. We hope to fix any bugs related to this release and release 2.0 Final in the next week or two.&lt;/p&gt;

&lt;p&gt;The &lt;a href=&quot;http://appfuse.org/display/APF/Demos+and+Videos&quot; title=&quot;Demos and Videos&quot;&gt;videos&lt;/a&gt; still represent how M5 works, but things have been simplified (now you don&apos;t need to run &lt;em&gt;appfuse:install&lt;/em&gt; after &lt;em&gt;appfuse:gen&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;AppFuse 2.0 is available as a Maven archetype. For information on creating a new project using this release, please see the &lt;a href=&quot;http://appfuse.org/display/APF/AppFuse+QuickStart&quot; title=&quot;AppFuse QuickStart&quot;&gt;QuickStart Guide&lt;/a&gt; or the &lt;a href=&quot;http://static.appfuse.org/movies/2.0/helloworld.mov&quot;&gt;Hello World video&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you&apos;ve used AppFuse 1.x, but not 2.x, you&apos;ll want to read the &lt;a href=&quot;http://appfuse.org/display/APF/FAQ&quot; title=&quot;FAQ&quot;&gt;FAQ&lt;/a&gt;.  Join the &lt;a href=&quot;http://appfuse.org/display/APF/Mailing+Lists&quot; title=&quot;Mailing Lists&quot;&gt;user mailing list&lt;/a&gt; if you have any questions. The &lt;a href=&quot;http://appfuse.org/display/APF/Maven+2&quot; title=&quot;Maven 2&quot;&gt;Maven Reference Guide&lt;/a&gt; has a map of Ant &amp;raquo; Maven commands. &lt;a href=&quot;http://appfuse.org/display/APF/Maven+for+Newbies&quot; title=&quot;Maven for Newbies&quot;&gt;Maven for Newbies&lt;/a&gt; might also be useful if you&apos;ve never used Maven before. There is &lt;a href=&quot;http://appfuse.org/display/APF/FAQ#FAQ-usingant&quot;&gt;some support for Ant&lt;/a&gt; in this release.&lt;/p&gt;

&lt;p&gt;For more information, please see the &lt;a href=&quot;http://appfuse.org/display/APF/Release+Notes+2.0+RC1&quot; title=&quot;Release Notes 2.0 RC1&quot;&gt;2.0 RC1 Release Notes&lt;/a&gt;. The 2.0 series of AppFuse has a minimum requirement of the following specification versions:&lt;/p&gt;

&lt;ul&gt;
	&lt;li&gt;Java Servlet 2.4 and JSP 2.0 (2.1 for JSF)&lt;/li&gt;
	&lt;li&gt;Java 5+&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;We appreciate the time and effort everyone has put toward contributing code and documentation, posting to the mailing lists, and logging issues. &lt;/p&gt;

&lt;p&gt;We also greatly appreciate the help from &lt;a href=&quot;http://appfuse.org/display/APF/Sponsors&quot; title=&quot;Sponsors&quot;&gt;our sponsors&lt;/a&gt;, particularly &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt;, &lt;a href=&quot;http://contegix.com&quot;&gt;Contegix&lt;/a&gt;, &lt;a href=&quot;http://www.jetbrains.com&quot;&gt;JetBrains&lt;/a&gt;, and &lt;a href=&quot;http://www.java.net&quot;&gt;Java.net&lt;/a&gt;. Atlassian and Contegix are especially awesome: &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix&quot;&gt;Atlassian has donated licenses to all its products and Contegix has donated an entire server&lt;/a&gt; to the AppFuse project. Thanks guys - &lt;em&gt;you rock!&lt;/em&gt;
&lt;/p&gt;
&lt;p class=&quot;smokey&quot;&gt;
Comments and issues should be posted to the &lt;a href=&quot;http://www.nabble.com/-ANN--AppFuse-2.0-RC1-Released%21-tf4376078s2369.html&quot;&gt;mailing list&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I&apos;ve uploaded a &lt;a href=&quot;http://tinyurl.com/2qlst4&quot;&gt;247-page PDF version of the RC1 documentation&lt;/a&gt; to java.net. This PDF contains the relevant pages from the wiki that help you develop with AppFuse 2.0. Who knew I&apos;d end up writing another book? &lt;img src=&quot;https://raibledesigns.com/images/smileys/wink.gif&quot; class=&quot;smiley&quot; alt=&quot;;-)&quot; title=&quot;;-)&quot; /&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/checkmate_technologies_donates_code_to</guid>
    <title>Checkmate Technologies donates code to AppFuse</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/checkmate_technologies_donates_code_to</link>
        <pubDate>Thu, 30 Aug 2007 10:09:41 -0600</pubDate>
    <category>Java</category>
    <category>appfuse</category>
            <description>Earlier this year, I had a gig at &lt;a href=&quot;http://checkmate-tech.blogspot.com/&quot;&gt;Checkmate Technologies&lt;/a&gt; out in Boston. As part of my work there, they paid me to polish much of AppFuse&apos;s code so it passed their &lt;a href=&quot;http://checkstyle.sourceforge.net/&quot;&gt;Checkstyle&lt;/a&gt; coding standards. I&apos;m please to announce that they&apos;ve donated this work to the &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; project. See &lt;a href=&quot;http://issues.appfuse.org/browse/APF-861&quot;&gt;APF-861&lt;/a&gt; and &lt;a href=&quot;http://fisheye4.cenqua.com/changelog/appfuse?cs=2872&quot;&gt;Changeset 2872&lt;/a&gt; for more details. &lt;em&gt;Thanks guys!&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;As far as AppFuse 2.0 - we&apos;re only &lt;a href=&quot;http://issues.appfuse.org/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=10111&quot;&gt;5 issues&lt;/a&gt; away from 2.0 RC1! I hope to finish these up in the next few days. With any luck, 2.0 Final will follow shortly after.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_vs_grails_vs_rails</guid>
    <title>AppFuse vs. Grails vs. Rails</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_vs_grails_vs_rails</link>
        <pubDate>Wed, 8 Aug 2007 10:22:34 -0600</pubDate>
    <category>Java</category>
    <category>rails</category>
    <category>grails</category>
    <category>appfuse</category>
            <description>In the comments of my &lt;a href=&quot;http://raibledesigns.com/rd/entry/choosing_a_jvm_web_framework&quot;&gt;Choosing a JVM Web Framework&lt;/a&gt;, Graeme Rocher &lt;a href=&quot;http://raibledesigns.com/rd/entry/choosing_a_jvm_web_framework#comment15&quot;&gt;writes&lt;/a&gt;:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
no offense Matt, but I fear you are a grossly inappropriate person to be writing such a study given your past history of claiming frameworks like &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_and_groovy_grails&quot;&gt;Grails are competitors to AppFuse&lt;/a&gt;. Any such study will come laced with doubts over its honesty and I&apos;m sure this doesn&apos;t just apply to Grails.&lt;/p&gt;
&lt;p&gt;In the post Graeme linked to, I said:&lt;/p&gt;
&lt;p class=&quot;quote&quot;&gt;
I think Grails and AppFuse are more likely competitors rather than
compatible.  Grails uses Spring, Spring MVC and Hibernate
under-the-covers, whereas AppFuse uses the raw frameworks.  Of course,
it would be cool to allow different classes w/in AppFuse to be written
in Groovy or JRuby.  At this point, I think it&apos;s probably better for
users to choose one or the other.
&lt;/p&gt;
&lt;p&gt;Since writing that post a year ago, I&apos;ve changed my opinion about AppFuse being competitors with Grails or Rails. Why? Because they&apos;re different languages. I don&apos;t think you should choose a web development stack first. I think you should choose your language first. For those that choose raw Java, I think AppFuse provides a good solution. To be more explicit, here&apos;s a private conversation that &lt;a href=&quot;http://jroller.com/dlwhitehurst&quot;&gt;David Whitehurst&lt;/a&gt; (author of The AppFuse Primer) and I exchanged.&lt;/p&gt;
&lt;p class=&quot;smokey&quot; style=&quot;padding-right: 10px&quot;&gt;
&lt;em&gt;
&lt;strong&gt;David:&lt;/strong&gt; Have you been looking at Ruby on Rails any?  And, if so, I&apos;m sure you&apos;re as impressed by those who command the language as I am.  But, I think the J2EE web application is not dead yet.  Do you think any comparison of the complexity of AppFuse vs. Rails should be mentioned in the book?&lt;/em&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;strong&gt;Matt:&lt;/strong&gt; I&apos;m highly aware of Rails, have attended talks and tutorials on it,
even bought books about it - but I&apos;ve never written an app, done a
tutorial or used it in the real-world. I&apos;m afraid of it. I&apos;m almost
certain I&apos;d like it, and I&apos;d likely like Grails as well. However, the
reason I stick with pure Java is because that&apos;s where my clients&apos; demand is and hence the consulting
dollars for me. 
&lt;br/&gt;&lt;br/&gt;
It&apos;s probably also possible to create AppFuse for both Rails and
Grails. I believe Rails&apos; Streamlined in much like AppFuse. I like to
think of AppFuse as language agnostic - it&apos;s always been designed to
eliminate ramp up time. While Rails and Grails simplify the
programming API and make it possible to develop code with less lines
of code, it&apos;d be nice to have user management, file upload and other
things like AppFuse has. When I start using these frameworks, it&apos;s
likely I&apos;ll develop some sort of features like AppFuse has and use
them on projects. Of course, if they already have all the features of AppFuse via plugins, I wouldn&apos;t reinvent the wheel - I&apos;m simply use what&apos;s already there and be happy about it.
&lt;br/&gt;&lt;br/&gt;
I don&apos;t know if it&apos;s relevant to mention Rails, but it probably
doesn&apos;t hurt. There&apos;s no reason to ignore the competition if they&apos;re
indeed competition. I don&apos;t see them as competition, and I almost
don&apos;t see Grails as competition either. AppFuse (in its current state)
is for developers that&apos;ve chosen to use the language and frameworks
that AppFuse supports. It&apos;s not trying to solve everyone&apos;s problems -
it&apos;s merely trying to simplify things for those using the frameworks
it supports.
&lt;br/&gt;&lt;br/&gt;
There&apos;s nothing saying that AppFuse can&apos;t have a Rails or Grails
version in the future. For me, it&apos;ll happen if I start developing
applications using these frameworks and see the integration needs like
I saw with the Java frameworks. The good news is most of these
frameworks have done the integration work, so it&apos;s really just a
matter of creating features or using plugins.&lt;br/&gt;&lt;br/&gt;
&lt;em&gt;&lt;strong&gt;David:&lt;/strong&gt; I keep getting these &quot;dream-squasher&quot; friends of mine showing me Rails, Grails, and how wonderful Ruby is.  It&apos;s impressive, but I&apos;m not convinced that big business is ready to adopt it any time soon.&lt;/em&gt;
&lt;br/&gt;&lt;br/&gt;
&lt;strong&gt;Matt:&lt;/strong&gt;
As a Java programmer, I think you&apos;d be a fool to ignore Rails or
Grails and not at least be familiar with them. There&apos;s no reason to
discount technology until you&apos;ve used it on a real-world project - at
least 6 months or longer - IMO.
&lt;br/&gt;&lt;br/&gt;
Just because you&apos;re productive in Ruby and like it - that doesn&apos;t make
you a bad Java programmer.
&lt;/p&gt;
&lt;p&gt;I hope this clears up any confusion on how I feel towards Rails or Grails. I would welcome the opportunity to use them on a project. If I was starting a products-based company, I certainly would give them a shot in the prototyping phase. However, I&apos;m a consultant that makes money from clients hiring me to explain/do what I know best. At the current time, that happens to be open source Java frameworks. 
&lt;/p&gt;
&lt;p&gt;
I do plan on learning a plethora of other frameworks, in other languages, I just haven&apos;t had the time yet. When I do, I hope that I can somehow become proficient enough to help companies adopt them as well. However, to build up that experience and expertise will likely take years. I think this is how lots of companies feel. Can you blame them for not &quot;jumping ship&quot; on their current skills and knowledge?
&lt;/p&gt;
&lt;p&gt;Of course, then you have the &lt;a href=&quot;http://relevancellc.com/&quot;&gt;Relevance&lt;/a&gt; guys who seem to be doing exactly what I hope to be doing in several years from now. Not only do they specialize in Java and its frameworks, but they also do consulting and training around &lt;a href=&quot;http://relevancellc.com/training&quot;&gt;Rails, Grails and Ajax&lt;/a&gt;. I can&apos;t help but admire them tremendously.</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix</guid>
    <title>AppFuse now powered by Contegix and Atlassian</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_now_powered_by_contegix</link>
        <pubDate>Fri, 27 Jul 2007 08:21:38 -0600</pubDate>
    <category>Java</category>
    <category>appfuse</category>
    <category>contegix</category>
            <description>The &lt;a href=&quot;http://appfuse.org&quot;&gt;AppFuse&lt;/a&gt; project is now &lt;a href=&quot;http://appfuse.org/display/APF/2007/07/27/New+Server+at+Contegix&quot;&gt;hosted on a Contegix server&lt;/a&gt; for its &lt;a href=&quot;http://appfuse.org&quot;&gt;documentation&lt;/a&gt;, &lt;a href=&quot;http://demo.appfuse.org&quot;&gt;demos&lt;/a&gt;, &lt;a href=&quot;http://issues.appfuse.org&quot;&gt;issues&lt;/a&gt; and &lt;a href=&quot;http://builds.appfuse.org&quot;&gt;continuous integration&lt;/a&gt;. Single sign-on to all of these servers is handled by &lt;a href=&quot;http://login.appfuse.org&quot;&gt;Crowd&lt;/a&gt;. Many thanks to &lt;a href=&quot;http://www.atlassian.com/c/NPOS/10160&quot;&gt;Atlassian&lt;/a&gt; for their generous donations of licenses. The free server and service from Contegix is one of the nicest things that anyone has ever done for me - &lt;em&gt;thanks guys!&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;If you see any issues that might be related to this move, please let us know.&lt;/p&gt;

&lt;p&gt;In addition to running the Atlassian Suite, we&apos;re also hosting our own &lt;a href=&quot;http://static.appfuse.org/repository&quot;&gt;Maven repository&lt;/a&gt;. We&apos;ve been hosting our own for almost a year now. Now that AppFuse is residing on the same infrastructure as &lt;a href=&quot;http://repo1.maven.org/maven2&quot;&gt;Maven&apos;s central repo&lt;/a&gt;, I wonder if it makes sense to publish to the central repo? I don&apos;t see any advantages. If we continue to retain our own, we can have more control, publish to it easily, and &lt;a href=&quot;http://raibledesigns.com/rd/entry/maven_2_hates_commons_logging&quot;&gt;fix annoying bugs&lt;/a&gt;. What do you think - continue with our own or publish to the central repo?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update Feb 20, 2015:&lt;/strong&gt; All AppFuse artifacts are &lt;a href=&quot;http://search.maven.org/#search%7Cga%7C1%7Cappfuse&quot;&gt;published to Maven Central&lt;/a&gt; and have been for several years.&lt;/p&gt;</description>          </item>
    <item>
    <guid isPermaLink="true">https://raibledesigns.com/rd/entry/appfuse_2_0_status_update</guid>
    <title>AppFuse 2.0 Status Update</title>
    <dc:creator>Matt Raible</dc:creator>
    <link>https://raibledesigns.com/rd/entry/appfuse_2_0_status_update</link>
        <pubDate>Wed, 11 Jul 2007 10:17:26 -0600</pubDate>
    <category>Java</category>
    <category>appfuse</category>
    <category>java</category>
            <description>It&apos;s been far too long since the release of &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_0_m5_released&quot;&gt;AppFuse 2.0 M5&lt;/a&gt;. When we released that version, I fully expected to finish up RC1 a week or two later, and follow that with 2.0 Final a week later. Fast forward a month and a half, and there&apos;s still &lt;a href=&quot;http://issues.appfuse.org/secure/IssueNavigator.jspa?mode=hide&amp;amp;requestId=10111&quot;&gt;38 issues left&lt;/a&gt; for 2.0 RC1. What happened?&lt;br/&gt;&lt;br/&gt;
Life got in the way.
&lt;br/&gt;&lt;br/&gt;There&apos;s probably less than 40 hours left to complete 2.0. I could say that I haven&apos;t had the time, but you all know that&apos;s a lie. &lt;em&gt;Everyone&lt;/em&gt; has time. When someone says &quot;I don&apos;t have time to do X right now&quot;, this really means &quot;that&apos;s not on my priority list and I&apos;m not going to make time to do it&quot;. So unfortunately AppFuse hasn&apos;t been on my priority list. &lt;a href=&quot;http://raibledesigns.com/rd/entry/the_good_ol_job_hunt&quot;&gt;Finding a new gig&lt;/a&gt;, &lt;a href=&quot;http://raibledesigns.com/rd/entry/dsl_at_the_cabin&quot;&gt;vacationing with my family&lt;/a&gt; and &lt;a href=&quot;http://raibledesigns.com/rd/entry/new_bike_gary_fisher_hifi&quot;&gt;buying a new mountain bike&lt;/a&gt; were on my priority list. &lt;br/&gt;&lt;br/&gt;
So if there&apos;s only 40 hours worth of work left, why didn&apos;t I just work a couple hours a day on it? Primarily because when I work on AppFuse it possesses me. I tend to get caught up in it and it&apos;s tough for me to concentrate on other things, especially work that I&apos;m supposed to be doing during the day. Since I&apos;ve had two new clients in the past few weeks, I&apos;ve been aware of this and purposely stayed away from working on it.
&lt;br/&gt;&lt;br/&gt;
The good news is things should settle down soon. I have a couple weekends on the horizon that look to be free, so hopefully I can crank it out and finish it up in the next month or so. As far as the project itself, there&apos;s plenty of users happily using the 2.0 milestone releases and there&apos;s still &lt;a href=&quot;https://appfuse.dev.java.net/servlets/SummarizeList?listName=users&quot;&gt;lots of traffic on the mailing list&lt;/a&gt;. It&apos;s crazy to think that the planning for AppFuse 2.0 started &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_0_jdk_5&quot;&gt;over a year ago&lt;/a&gt; and development started &lt;a href=&quot;http://raibledesigns.com/rd/entry/appfuse_2_0_status&quot;&gt;one year ago next month&lt;/a&gt;. If I knew it&apos;d take this long, would I still have done it? Absolutely. I&apos;ve never heard so many positive comments from users.
&lt;br/&gt;&lt;br/&gt;
In other AppFuse News, &lt;a href=&quot;http://contegix.com&quot;&gt;Contegix&lt;/a&gt; has graciously donated an entire managed server to the project. We have licenses for the &lt;a href=&quot;http://atlassian.com&quot;&gt;Atlassian&lt;/a&gt; Suite (JIRA, Confluence, Bamboo and Crowd) and will be moving/installing everything over the next week or so. 
&lt;/p&gt;
&lt;p style=&quot;font-style: italic&quot;&gt;
Thanks Contegix! 
&lt;/p&gt;
&lt;p&gt;As anyone that uses them knows, they&apos;re simply the best hosting company in existence today. Their customer support and response time is incredible.</description>          </item>
  </channel>
</rss>