<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://purl.org/atom/ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="0.3">
  <title>SourceBeat Author Blogs</title>
  <link rel="alternate" href="http://www.sourcebeat.com/blogs" />
  <tagline>Recent Entries from SourceBeat Authors</tagline>
  <dc:creator>SourceBeat, LLC</dc:creator>
  <entry>
    <title>AJP (8009) to HTTPS (8443) is supposed end in HTTPS</title>
    <link rel="alternate" href="http://www.jroller.com/dlwhitehurst/entry/ajp_to_8443_is_supposed" />
    <author>
      <name>David Whitehurst</name>
    </author>
    <id>http://www.jroller.com/dlwhitehurst/</id>
    <modified>2008-08-20T16:52:08Z</modified>
    <issued>2008-08-20T16:52:08Z</issued>
    <summary type="text/plain" mode="escaped">&lt;p&gt;
I'm writing this blog post because I have a problem that is becoming a real pisser.  I've used Apache and the AJP connector with Tomcat many times and now I'm getting HTTP ultimately from the 8443 connector.  My 8009 connector redirects to port 8443 and if I call the URL using the colon 8443 I get the page HTTPS correctly.  When I call the URL without port numbers and the /cas virtual, it uses the AJP/1.3 connector on 8009 because the page comes up beautifully with one problem.  That is the content is HTTP (plain text).
&lt;/p&gt;
&lt;p&gt;
My buddy, the CISCO expert here showed me Wireshark (damn fine Windows application) that allowed us to look at all this Apache reverse proxy, AJP, Tomcat, JBoss traffic and sure enough he showed me my password (HTTP).
&lt;/p&gt;
&lt;p&gt;
I'm really stumped.  This was working prior to multiple domains and virtual IPs.  I usually don't "trust" certificates when I'm doing implementation work but I assumed that I had accepted the certificate some time ago and forgot all about the HTTPS.  Also, with all the proxy business going on, I don't pay much attention to the browser address bar anymore.
&lt;/p&gt;
&lt;p&gt;
So now I'll back up and begin to simplify.  If anyone has seen this before please let me know.  If it didn't work, I could understand this, but when I know that TCP traffic is going thru the 8009 and 8443 ports, I can't understand why I never get asked to accept the certificate? Bear in mind too that there's a lot of overkill here that I can't reduce or simplify for security reasons.
&lt;/p&gt;
&lt;p&gt;
Signed, Stumped in the weeds here in NC</summary>
    <content type="text/plain" mode="escaped">&lt;p&gt;
I'm writing this blog post because I have a problem that is becoming a real pisser.  I've used Apache and the AJP connector with Tomcat many times and now I'm getting HTTP ultimately from the 8443 connector.  My 8009 connector redirects to port 8443 and if I call the URL using the colon 8443 I get the page HTTPS correctly.  When I call the URL without port numbers and the /cas virtual, it uses the AJP/1.3 connector on 8009 because the page comes up beautifully with one problem.  That is the content is HTTP (plain text).
&lt;/p&gt;
&lt;p&gt;
My buddy, the CISCO expert here showed me Wireshark (damn fine Windows application) that allowed us to look at all this Apache reverse proxy, AJP, Tomcat, JBoss traffic and sure enough he showed me my password (HTTP).
&lt;/p&gt;
&lt;p&gt;
I'm really stumped.  This was working prior to multiple domains and virtual IPs.  I usually don't "trust" certificates when I'm doing implementation work but I assumed that I had accepted the certificate some time ago and forgot all about the HTTPS.  Also, with all the proxy business going on, I don't pay much attention to the browser address bar anymore.
&lt;/p&gt;
&lt;p&gt;
So now I'll back up and begin to simplify.  If anyone has seen this before please let me know.  If it didn't work, I could understand this, but when I know that TCP traffic is going thru the 8009 and 8443 ports, I can't understand why I never get asked to accept the certificate? Bear in mind too that there's a lot of overkill here that I can't reduce or simplify for security reasons.
&lt;/p&gt;
&lt;p&gt;
Signed, Stumped in the weeds here in NC</content>
    <dc:creator>David Whitehurst</dc:creator>
    <dc:date>2008-08-20T16:52:08Z</dc:date>
  </entry>
  <entry>
    <title>EhCache Project Busy this Summer</title>
    <link rel="alternate" href="http://raibledesigns.com/rd/entry/ehcache_project_busy_this_summer" />
    <author>
      <name>Matt Raible</name>
    </author>
    <id>http://raibledesigns.com/rd/</id>
    <modified>2008-08-11T03:12:31Z</modified>
    <issued>2008-08-11T03:12:31Z</issued>
    <summary type="text/plain" mode="escaped">The &lt;a href="http://ehcache.sourceforge.net"&gt;EhCache&lt;/a&gt; project appears to be having a very busy summer. EhCache 1.5.0 (a major new version) was released on July 12th. In addition, a new (SOAP-based) &lt;a href="http://gregluck.com/blog/archives/2008/07/conspiracy_theo.html"&gt;EhCache Server was released&lt;/a&gt; at the end of July. You might ask yourself why you'd need such a beast. I think Greg explains it best:&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
Why am I doing this? There are lots of theories that have made their way on to the ehcache mailing list. The prosaic truth is that a large US corporate using ehcache for their Java apps on 200+ servers also wants to use it for their C++ apps. And they are prepared to sponsor development. The Web Services API lets them do it. That's it.
&lt;br/&gt;&lt;br/&gt;
As to the larger question of how interesting this is to the world at large, my view is not very. However having to jump through all the hoops to get a server infrastructure done, I thought that the world at large may be interested in a RESTful, resource oriented ehcache server.&lt;/p&gt;
&lt;p&gt;The next day, Greg announces &lt;a href="http://gregluck.com/blog/archives/2008/07/ehcache_for_jru.html"&gt;EhCache for JRuby on Rails&lt;/a&gt;. A few days later, &lt;a href="http://gregluck.com/blog/archives/2008/08/restful_resourc.html"&gt;RESTful, resource-oriented caching becomes available in ehcache-server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I guess this helps answer the question about &lt;a href="http://raibledesigns.com/rd/entry/oscache_vs_ehcache_for_hibernate"&gt;OSCache vs. EhCache&lt;/a&gt;. OSCache hasn't had a release in over a year and EhCache is pumping out new releases &lt;em&gt;and&lt;/em&gt; new products. Well done, Greg!
&lt;/p&gt;
&lt;p&gt;At &lt;a href="http://www.linkedin.com"&gt;LinkedIn&lt;/a&gt;, we use EhCache for many of our caching needs. However, it's likely we'll be moving to &lt;a href="http://en.wikipedia.org/wiki/Memcached"&gt;Memcached&lt;/a&gt; in the future. Since I'll be part of the team that implements Memcached, it'll be interesting to see which one performs better.</summary>
    <content type="text/plain" mode="escaped">The &lt;a href="http://ehcache.sourceforge.net"&gt;EhCache&lt;/a&gt; project appears to be having a very busy summer. EhCache 1.5.0 (a major new version) was released on July 12th. In addition, a new (SOAP-based) &lt;a href="http://gregluck.com/blog/archives/2008/07/conspiracy_theo.html"&gt;EhCache Server was released&lt;/a&gt; at the end of July. You might ask yourself why you'd need such a beast. I think Greg explains it best:&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
Why am I doing this? There are lots of theories that have made their way on to the ehcache mailing list. The prosaic truth is that a large US corporate using ehcache for their Java apps on 200+ servers also wants to use it for their C++ apps. And they are prepared to sponsor development. The Web Services API lets them do it. That's it.
&lt;br/&gt;&lt;br/&gt;
As to the larger question of how interesting this is to the world at large, my view is not very. However having to jump through all the hoops to get a server infrastructure done, I thought that the world at large may be interested in a RESTful, resource oriented ehcache server.&lt;/p&gt;
&lt;p&gt;The next day, Greg announces &lt;a href="http://gregluck.com/blog/archives/2008/07/ehcache_for_jru.html"&gt;EhCache for JRuby on Rails&lt;/a&gt;. A few days later, &lt;a href="http://gregluck.com/blog/archives/2008/08/restful_resourc.html"&gt;RESTful, resource-oriented caching becomes available in ehcache-server&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I guess this helps answer the question about &lt;a href="http://raibledesigns.com/rd/entry/oscache_vs_ehcache_for_hibernate"&gt;OSCache vs. EhCache&lt;/a&gt;. OSCache hasn't had a release in over a year and EhCache is pumping out new releases &lt;em&gt;and&lt;/em&gt; new products. Well done, Greg!
&lt;/p&gt;
&lt;p&gt;At &lt;a href="http://www.linkedin.com"&gt;LinkedIn&lt;/a&gt;, we use EhCache for many of our caching needs. However, it's likely we'll be moving to &lt;a href="http://en.wikipedia.org/wiki/Memcached"&gt;Memcached&lt;/a&gt; in the future. Since I'll be part of the team that implements Memcached, it'll be interesting to see which one performs better.</content>
    <dc:creator>Matt Raible</dc:creator>
    <dc:date>2008-08-11T03:12:31Z</dc:date>
  </entry>
  <entry>
    <title>Portlet Filters</title>
    <link rel="alternate" href="http://www.jroller.com/SunilPatil/entry/portlet_filters" />
    <author>
      <name>Sunil Patil</name>
    </author>
    <id>http://www.jroller.com/SunilPatil/</id>
    <modified>2008-08-09T03:03:42Z</modified>
    <issued>2008-08-09T03:03:42Z</issued>
    <summary type="text/plain" mode="escaped">The &lt;a href='http://jcp.org/en/jsr/detail?id=286'&gt;Java Portlet Specification&lt;/a&gt; has introduced concept of Portlet Filters based on Servlet Filters. The basic concept remains the same that Portlet Filter allows you to do some pre and/or post processing for every request.

Note one important point that unlike servlets portlet specification defines 4 different phases for handling user request and as result it defines 4 Filter interfaces that you can use.
&lt;ol&gt;
&lt;li&gt;
&lt;b&gt;ACTION_PHASE&lt;/b&gt; : If you want to perform filtering during action phase then you should implement class implementing javax.portlet.filter.ActionFilter interface
&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;RENDER_PHASE&lt;/b&gt; : If you want to perform filtering during render phase then you should implement class implementing javax.portlet.filter.RenderFilter interface
&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;EVENT_PHASE&lt;/b&gt; : If you want to perform filtering during event handling phase then you should implement class implementing javax.portlet.filter.EventFilter interface
&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;RESOURCE_PHASE&lt;/b&gt; : If you want to perform filtering during resource serving phase then you should implement class implementing javax.portlet.filter.ResourceFilter interface
&lt;/li&gt;
&lt;/ol&gt;</summary>
    <content type="text/plain" mode="escaped">The &lt;a href='http://jcp.org/en/jsr/detail?id=286'&gt;Java Portlet Specification&lt;/a&gt; has introduced concept of Portlet Filters based on Servlet Filters. The basic concept remains the same that Portlet Filter allows you to do some pre and/or post processing for every request.

Note one important point that unlike servlets portlet specification defines 4 different phases for handling user request and as result it defines 4 Filter interfaces that you can use.
&lt;ol&gt;
&lt;li&gt;
&lt;b&gt;ACTION_PHASE&lt;/b&gt; : If you want to perform filtering during action phase then you should implement class implementing javax.portlet.filter.ActionFilter interface
&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;RENDER_PHASE&lt;/b&gt; : If you want to perform filtering during render phase then you should implement class implementing javax.portlet.filter.RenderFilter interface
&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;EVENT_PHASE&lt;/b&gt; : If you want to perform filtering during event handling phase then you should implement class implementing javax.portlet.filter.EventFilter interface
&lt;/li&gt;
&lt;li&gt;
&lt;b&gt;RESOURCE_PHASE&lt;/b&gt; : If you want to perform filtering during resource serving phase then you should implement class implementing javax.portlet.filter.ResourceFilter interface
&lt;/li&gt;
&lt;/ol&gt;</content>
    <dc:creator>Sunil Patil</dc:creator>
    <dc:date>2008-08-09T03:03:42Z</dc:date>
  </entry>
  <entry>
    <title>Optimizing Tapestry 4 for development</title>
    <link rel="alternate" href="http://www.jroller.com/WarnerOnstine/entry/optimizing_tapestry_4_for_development" />
    <author>
      <name>Warner Onstine</name>
    </author>
    <id>http://www.jroller.com/WarnerOnstine/</id>
    <modified>2008-05-02T16:07:40Z</modified>
    <issued>2008-05-02T16:07:40Z</issued>
    <summary type="text/plain" mode="escaped">&lt;p&gt;New blog post on &lt;a href="http://www.warneronstine.com/blog/articles/2008/05/02/optimizing-tapestry-4-for-development" title=""&gt;Optimizing Tapestry 4 for development&lt;/a&gt;.&lt;/p&gt;

	&lt;p&gt;&lt;a href="http://www.warneronstine.com/blog/articles/2008/05/02/optimizing-tapestry-4-for-development" title=""&gt;Continue Reading&lt;/a&gt; on &lt;a href="http://www.warneronstine.com/blog" title=""&gt;BlackBox&lt;/a&gt;.&lt;/p&gt;</summary>
    <content type="text/plain" mode="escaped">&lt;p&gt;New blog post on &lt;a href="http://www.warneronstine.com/blog/articles/2008/05/02/optimizing-tapestry-4-for-development" title=""&gt;Optimizing Tapestry 4 for development&lt;/a&gt;.&lt;/p&gt;

	&lt;p&gt;&lt;a href="http://www.warneronstine.com/blog/articles/2008/05/02/optimizing-tapestry-4-for-development" title=""&gt;Continue Reading&lt;/a&gt; on &lt;a href="http://www.warneronstine.com/blog" title=""&gt;BlackBox&lt;/a&gt;.&lt;/p&gt;</content>
    <dc:creator>Warner Onstine</dc:creator>
    <dc:date>2008-05-02T16:07:40Z</dc:date>
  </entry>
  <entry>
    <title>MD5 Comparisons with Jakarta Commons Codec</title>
    <link rel="alternate" href="http://www.jroller.com/JamesGoodwill/entry/md5_comparisons_with_jakarta_commons" />
    <author>
      <name>James Goodwill</name>
    </author>
    <id>http://www.jroller.com/JamesGoodwill/</id>
    <modified>2007-06-06T21:20:00Z</modified>
    <issued>2007-06-06T21:20:00Z</issued>
    <summary type="text/plain" mode="escaped">So I recently found myself needing to take a set of files with a matching MD5 digest and determine if the files and the digest match. If you have not used MD5 digests before, here is the &lt;a href=http://en.wikipedia.org/wiki/MD5&gt;Wikipedia definition&lt;/a&gt; describing what they are and how they are used.
&lt;br&gt;
&lt;br&gt;
Anyway, I had to write an automated process that would look for a set of files and compare those file to the included MD5 digest. I started with the Java MessageDigest, but it just seemed to be more of a pain in the ass than anything. So, I browsed around for an alternative and found the &lt;a href=http://jakarta.apache.org/commons/codec/api-release/index.html&gt;Commons Codec DigestUtils&lt;/a&gt;. It was too easy. The DigestUtils includes the method DigestUtils.md5Hex(byte[] data). It was exactly what I needed. To use it all I needed to do was:

&lt;ol&gt;
&lt;li&gt;
Read the file that was suppose to match the MD5 digest.
&lt;/li&gt;
&lt;li&gt;
Run it through the String DigestUtils.md5Hex(byte[] data) method.
&lt;/li&gt;
&lt;li&gt;
Compare the generated MD5 String to the MD5 String included in the mathcing MD5 digest file.
&lt;/li&gt;
&lt;/ol&gt;
Here is a simple example of how this works.
&lt;br&gt;
&lt;br&gt;
First, to make this example work we need a simple file that will be used to generate a digest and a tool to generate the digest itself. I am on a Mac, which includes the md5 application. On Linux there is an equivelent application, md5sum. I don’t have access to a PC, but there is a utility &lt;a href=http://www.pc-tools.net/win32/md5sums/&gt;md5sums&lt;/a&gt; that looks easy enough to use.
&lt;br&gt;
&lt;br&gt;
So, if  have the following file:

&lt;code&gt;
    &lt;pre&gt;
A simple file to be run through the digester.
    &lt;/pre&gt;
&lt;/code&gt;

and we call this file, test.txt. To generate an MD5 digest from this file, we would do the following:

&lt;code&gt;
    &lt;pre&gt;
md5 test.txt &gt; test.md5
    &lt;/pre&gt;
&lt;/code&gt;

This would generate an MD5 digest file that (depending upon you digest tool) would look something like the following:

&lt;code&gt;
    &lt;pre&gt;
MD5 (test.txt) = 5c87da642b2286cfb6ac8e0ad0d8e036
    &lt;/pre&gt;
&lt;/code&gt;

Note: This file is what would be included with the test.txt file in something like a zip or a tar.gz. When you received the file containing both of these files, you would uncompress them and perform the next comparison. 
&lt;br&gt;
&lt;br&gt;
The String, 5c87da642b2286cfb6ac8e0ad0d8e036, is the actual digest. The next thing we need to do write a class that will read in the same file and generate an MD5 digest to compare. I have a simple FileUtils class that will do this for you.

&lt;code&gt;
    &lt;pre&gt;
package org.gs.util;

import org.apache.commons.codec.digest.DigestUtils;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;

public class FileUtil {

    public static byte[] readFile(File file) throws IOException {

        InputStream is = new FileInputStream(file);

        byte[] bytes = new byte[(int)file.length()];

        int offset = 0;
        int numRead = 0;

        while (offset &lt; bytes.length &amp;&amp;
            (numRead = is.read(bytes, offset, bytes.length - offset)) &gt;= 0) {

            offset += numRead;
        }

        is.close();

        return bytes;
    }

    public static boolean isFileValid(String file, String digest) {

        try {

            byte[] buffer = readFile(new File(file));

            String md5sum = DigestUtils.md5Hex(buffer);

            return md5sum.equalsIgnoreCase(digest);
        }
        catch (IOException e) {

            throw new RuntimeException("Unable to process file for MD5 comparison.", e);
        }
    }
}

    &lt;/pre&gt;
&lt;/code&gt;

As you can see, there are only two methods in this class. The first takes a File and returns its contents as a byte array-pretty simple. The second method, isFileValid(), is where the DigestUtils are actually used. It takes the name of the file to be digested and the digest it is being compared to. In this case the values are testData/test.txt and 5c87da642b2286cfb6ac8e0ad0d8e036.
&lt;br&gt;
&lt;br&gt;
It begins with a call to the previously mentioned readFile() method.

&lt;code&gt;
    &lt;pre&gt;
byte[] buffer = readFile(new File(file));
    &lt;/pre&gt;
&lt;/code&gt;

The version of the DigestUtils.md5Hex() method we are using requires the value to be a byte array. After we have the byte array, we invoke the static md5Hex() method. This method returns a hex String representation of the generated MD5 digest. If you step through this code with a debugger, you would see the value:

&lt;code&gt;
    &lt;pre&gt;
5c87da642b2286cfb6ac8e0ad0d8e036
    &lt;/pre&gt;
&lt;/code&gt;

returned from the md5Hex() method. The final line, exlcuding the catch block, returns a boolean value indicating whetther the passed in digest is equal to the digest generated when md5Hex() creates a digest from the file.
&lt;br&gt;
&lt;br&gt;
To test this code, I put a simple unit test together.

&lt;code&gt;
    &lt;pre&gt;
package org.gs.util;

import junit.framework.TestCase;

public class FileUtilTests extends TestCase {

    public void testIsFileComplete() throws Exception {

        String digest = "5c87da642b2286cfb6ac8e0ad0d8e036";
        String file = "testData/test.txt";

        assertTrue(FileUtil.isFileValid(file, digest));
    }
}
    &lt;/pre&gt;
&lt;/code&gt;

This test takes the digest value generated by the utility, md5 or md5sum, and the path to the file used to generate the digest and passes them to the FileUtils.isFileValid() method. In this instance our test will obviously pass with no troubles.
&lt;br&gt;
&lt;br&gt;
I hope this helps.</summary>
    <content type="text/plain" mode="escaped">So I recently found myself needing to take a set of files with a matching MD5 digest and determine if the files and the digest match. If you have not used MD5 digests before, here is the &lt;a href=http://en.wikipedia.org/wiki/MD5&gt;Wikipedia definition&lt;/a&gt; describing what they are and how they are used.
&lt;br&gt;
&lt;br&gt;
Anyway, I had to write an automated process that would look for a set of files and compare those file to the included MD5 digest. I started with the Java MessageDigest, but it just seemed to be more of a pain in the ass than anything. So, I browsed around for an alternative and found the &lt;a href=http://jakarta.apache.org/commons/codec/api-release/index.html&gt;Commons Codec DigestUtils&lt;/a&gt;. It was too easy. The DigestUtils includes the method DigestUtils.md5Hex(byte[] data). It was exactly what I needed. To use it all I needed to do was:

&lt;ol&gt;
&lt;li&gt;
Read the file that was suppose to match the MD5 digest.
&lt;/li&gt;
&lt;li&gt;
Run it through the String DigestUtils.md5Hex(byte[] data) method.
&lt;/li&gt;
&lt;li&gt;
Compare the generated MD5 String to the MD5 String included in the mathcing MD5 digest file.
&lt;/li&gt;
&lt;/ol&gt;
Here is a simple example of how this works.
&lt;br&gt;
&lt;br&gt;
First, to make this example work we need a simple file that will be used to generate a digest and a tool to generate the digest itself. I am on a Mac, which includes the md5 application. On Linux there is an equivelent application, md5sum. I don’t have access to a PC, but there is a utility &lt;a href=http://www.pc-tools.net/win32/md5sums/&gt;md5sums&lt;/a&gt; that looks easy enough to use.
&lt;br&gt;
&lt;br&gt;
So, if  have the following file:

&lt;code&gt;
    &lt;pre&gt;
A simple file to be run through the digester.
    &lt;/pre&gt;
&lt;/code&gt;

and we call this file, test.txt. To generate an MD5 digest from this file, we would do the following:

&lt;code&gt;
    &lt;pre&gt;
md5 test.txt &gt; test.md5
    &lt;/pre&gt;
&lt;/code&gt;

This would generate an MD5 digest file that (depending upon you digest tool) would look something like the following:

&lt;code&gt;
    &lt;pre&gt;
MD5 (test.txt) = 5c87da642b2286cfb6ac8e0ad0d8e036
    &lt;/pre&gt;
&lt;/code&gt;

Note: This file is what would be included with the test.txt file in something like a zip or a tar.gz. When you received the file containing both of these files, you would uncompress them and perform the next comparison. 
&lt;br&gt;
&lt;br&gt;
The String, 5c87da642b2286cfb6ac8e0ad0d8e036, is the actual digest. The next thing we need to do write a class that will read in the same file and generate an MD5 digest to compare. I have a simple FileUtils class that will do this for you.

&lt;code&gt;
    &lt;pre&gt;
package org.gs.util;

import org.apache.commons.codec.digest.DigestUtils;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;

public class FileUtil {

    public static byte[] readFile(File file) throws IOException {

        InputStream is = new FileInputStream(file);

        byte[] bytes = new byte[(int)file.length()];

        int offset = 0;
        int numRead = 0;

        while (offset &lt; bytes.length &amp;&amp;
            (numRead = is.read(bytes, offset, bytes.length - offset)) &gt;= 0) {

            offset += numRead;
        }

        is.close();

        return bytes;
    }

    public static boolean isFileValid(String file, String digest) {

        try {

            byte[] buffer = readFile(new File(file));

            String md5sum = DigestUtils.md5Hex(buffer);

            return md5sum.equalsIgnoreCase(digest);
        }
        catch (IOException e) {

            throw new RuntimeException("Unable to process file for MD5 comparison.", e);
        }
    }
}

    &lt;/pre&gt;
&lt;/code&gt;

As you can see, there are only two methods in this class. The first takes a File and returns its contents as a byte array-pretty simple. The second method, isFileValid(), is where the DigestUtils are actually used. It takes the name of the file to be digested and the digest it is being compared to. In this case the values are testData/test.txt and 5c87da642b2286cfb6ac8e0ad0d8e036.
&lt;br&gt;
&lt;br&gt;
It begins with a call to the previously mentioned readFile() method.

&lt;code&gt;
    &lt;pre&gt;
byte[] buffer = readFile(new File(file));
    &lt;/pre&gt;
&lt;/code&gt;

The version of the DigestUtils.md5Hex() method we are using requires the value to be a byte array. After we have the byte array, we invoke the static md5Hex() method. This method returns a hex String representation of the generated MD5 digest. If you step through this code with a debugger, you would see the value:

&lt;code&gt;
    &lt;pre&gt;
5c87da642b2286cfb6ac8e0ad0d8e036
    &lt;/pre&gt;
&lt;/code&gt;

returned from the md5Hex() method. The final line, exlcuding the catch block, returns a boolean value indicating whetther the passed in digest is equal to the digest generated when md5Hex() creates a digest from the file.
&lt;br&gt;
&lt;br&gt;
To test this code, I put a simple unit test together.

&lt;code&gt;
    &lt;pre&gt;
package org.gs.util;

import junit.framework.TestCase;

public class FileUtilTests extends TestCase {

    public void testIsFileComplete() throws Exception {

        String digest = "5c87da642b2286cfb6ac8e0ad0d8e036";
        String file = "testData/test.txt";

        assertTrue(FileUtil.isFileValid(file, digest));
    }
}
    &lt;/pre&gt;
&lt;/code&gt;

This test takes the digest value generated by the utility, md5 or md5sum, and the path to the file used to generate the digest and passes them to the FileUtils.isFileValid() method. In this instance our test will obviously pass with no troubles.
&lt;br&gt;
&lt;br&gt;
I hope this helps.</content>
    <dc:creator>James Goodwill</dc:creator>
    <dc:date>2007-06-06T21:20:00Z</dc:date>
  </entry>
  <entry>
    <title>TechStars: Technology Freeform Discussion</title>
    <link rel="alternate" href="http://www.jroller.com/sourcebeat/entry/techstars_technology_freeform_discussion1" />
    <author>
      <name>Matt Filios</name>
    </author>
    <id>http://www.jroller.com/sourcebeat/</id>
    <modified>2007-05-30T14:59:04Z</modified>
    <issued>2007-05-30T14:59:04Z</issued>
    <summary type="text/plain" mode="escaped">I had the pleasure of being invited to participate in last night's "Geek-out" founders-only session last night in Boulder. &lt;a href="http://www.techstars.org/site/page/pg5887-as689.html"&gt;David Cohen&lt;/a&gt; and I had never met prior to last night, but I had read about &lt;a href="http://www.techstars.org/site/page/pg5882.html"&gt;TechStars&lt;/a&gt; months ago through Brad Feld's &lt;a href="http://www.feld.com/blog/index.php"&gt;blog&lt;/a&gt; and pinged him to see if I could help out at all. With my background running various software companies, he thought I might add some value in this session. I hope I did not disappoint.&lt;br /&gt;&lt;br /&gt;

Ten companies were chosen, and twenty-six founders are involved in this summer-long syncubation (yes I just made that word up but could not think of the exact way to put it into one word what TechStars does) effort. Companies from California, Seattle, Colorado and even Sweden are represented, and based on my two-plus hours with these people I am quite impressed with the choices. &lt;br /&gt;&lt;br /&gt;

We began with basic ideologies around platforms and technologies, from PHP to .NET to Java to Ruby. Most of the development right now is being done in Ruby, with some Java and PHP. One company is doing their work in .NET. We went through the ins and outs of each of the technologies. The reason Ruby seems to be the platform of choice seems to be the ease of learning curve as well as the ability to quickly prototype. We of course then got into the discussion of scalability and performance, which is where Ruby has gotten dinged the most in the past. There seems to have been some improvements in that vein recently, but it is still an issue. I did not get a chance to understand what each company is all about, but my guess is that most are in the consumer, social-networking space. This area is white-hot and some really cool ideas are flying around right now. Unfortunately this is not really my forte, with most of my background being in the B2B space. &lt;br /&gt;&lt;br /&gt;
Overall, it was a really cool experience. Being around such passion and energy on top of outstanding technical knowledge is a kick in the pants. A jam session for geeks, if you will. Thanks for having me, David.</summary>
    <content type="text/plain" mode="escaped">I had the pleasure of being invited to participate in last night's "Geek-out" founders-only session last night in Boulder. &lt;a href="http://www.techstars.org/site/page/pg5887-as689.html"&gt;David Cohen&lt;/a&gt; and I had never met prior to last night, but I had read about &lt;a href="http://www.techstars.org/site/page/pg5882.html"&gt;TechStars&lt;/a&gt; months ago through Brad Feld's &lt;a href="http://www.feld.com/blog/index.php"&gt;blog&lt;/a&gt; and pinged him to see if I could help out at all. With my background running various software companies, he thought I might add some value in this session. I hope I did not disappoint.&lt;br /&gt;&lt;br /&gt;

Ten companies were chosen, and twenty-six founders are involved in this summer-long syncubation (yes I just made that word up but could not think of the exact way to put it into one word what TechStars does) effort. Companies from California, Seattle, Colorado and even Sweden are represented, and based on my two-plus hours with these people I am quite impressed with the choices. &lt;br /&gt;&lt;br /&gt;

We began with basic ideologies around platforms and technologies, from PHP to .NET to Java to Ruby. Most of the development right now is being done in Ruby, with some Java and PHP. One company is doing their work in .NET. We went through the ins and outs of each of the technologies. The reason Ruby seems to be the platform of choice seems to be the ease of learning curve as well as the ability to quickly prototype. We of course then got into the discussion of scalability and performance, which is where Ruby has gotten dinged the most in the past. There seems to have been some improvements in that vein recently, but it is still an issue. I did not get a chance to understand what each company is all about, but my guess is that most are in the consumer, social-networking space. This area is white-hot and some really cool ideas are flying around right now. Unfortunately this is not really my forte, with most of my background being in the B2B space. &lt;br /&gt;&lt;br /&gt;
Overall, it was a really cool experience. Being around such passion and energy on top of outstanding technical knowledge is a kick in the pants. A jam session for geeks, if you will. Thanks for having me, David.</content>
    <dc:creator>Matt Filios</dc:creator>
    <dc:date>2007-05-30T14:59:04Z</dc:date>
  </entry>
  <entry>
    <title>JPA 101 on The ServerSide</title>
    <link rel="alternate" href="http://www.jroller.com/cmaki/entry/jpa_101_on_the_serverside" />
    <author>
      <name>Chris Maki</name>
    </author>
    <id>http://www.jroller.com/cmaki/</id>
    <modified>2007-03-06T16:33:44Z</modified>
    <issued>2007-03-06T16:33:44Z</issued>
    <summary type="text/plain" mode="escaped">&lt;p&gt;Welcome to my blog, well my old blog anyway.  If you just landed here from TheServerSide link you can reach me on my new blog page &lt;a href="http://cmaki.blogspot.com"&gt;here&lt;/a&gt;.  As you can see in my last &lt;a href="http://jroller.com/page/cmaki?entry=goodbye_jroller"&gt;post&lt;/a&gt; I got fed up with JRoller not working and moved over to &lt;a href="http://www2.blogger.com/home"&gt;Blogger&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;p&gt;If you are interested in any of my posts about JPA, you can search this blog otherwise I'll see you over at my &lt;a href="http://cmaki.blogspot.com"&gt;new&lt;/a&gt; blog.&lt;/p&gt;


&lt;p&gt;&lt;p&gt;If you are interested in purchasing this book, you can find it &lt;a href="http://www.sourcebeat.com/books/jpa.html"&gt;here&lt;/a&gt; at &lt;a href="http://www.sourcebeat.com"&gt;SourceBeat.com&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;p&gt;Thanks for stopping by. &lt;/p&gt;


&lt;p&gt;&lt;p&gt;&lt;/p&gt;</summary>
    <content type="text/plain" mode="escaped">&lt;p&gt;Welcome to my blog, well my old blog anyway.  If you just landed here from TheServerSide link you can reach me on my new blog page &lt;a href="http://cmaki.blogspot.com"&gt;here&lt;/a&gt;.  As you can see in my last &lt;a href="http://jroller.com/page/cmaki?entry=goodbye_jroller"&gt;post&lt;/a&gt; I got fed up with JRoller not working and moved over to &lt;a href="http://www2.blogger.com/home"&gt;Blogger&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;p&gt;If you are interested in any of my posts about JPA, you can search this blog otherwise I'll see you over at my &lt;a href="http://cmaki.blogspot.com"&gt;new&lt;/a&gt; blog.&lt;/p&gt;


&lt;p&gt;&lt;p&gt;If you are interested in purchasing this book, you can find it &lt;a href="http://www.sourcebeat.com/books/jpa.html"&gt;here&lt;/a&gt; at &lt;a href="http://www.sourcebeat.com"&gt;SourceBeat.com&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;&lt;p&gt;Thanks for stopping by. &lt;/p&gt;


&lt;p&gt;&lt;p&gt;&lt;/p&gt;</content>
    <dc:creator>Chris Maki</dc:creator>
    <dc:date>2007-03-06T16:33:44Z</dc:date>
  </entry>
  <entry>
    <title>Dropping JOSSO</title>
    <link rel="alternate" href="http://www.jroller.com/jonaslive/entry/dropping_josso" />
    <author>
      <name>Jonas Live</name>
    </author>
    <id>http://www.jroller.com/jonaslive/</id>
    <modified>2006-05-29T13:39:02Z</modified>
    <issued>2006-05-29T13:39:02Z</issued>
    <summary type="text/plain" mode="escaped">&lt;br&gt;Few weeks ago, I announced that we were choosing JOSSO for SSO. We changed our mind, the lack of documentation of JOSSO made us evalute another product : &lt;a href="http://www.ja-sig.org/products/cas/"&gt;CAS&lt;/a&gt;. After some weeks of test, we found CAS more clean, easiest to install and with a much better documentation !&lt;br&gt;
&lt;br&gt;
Stéphane TRAUMAT</summary>
    <content type="text/plain" mode="escaped">&lt;br&gt;Few weeks ago, I announced that we were choosing JOSSO for SSO. We changed our mind, the lack of documentation of JOSSO made us evalute another product : &lt;a href="http://www.ja-sig.org/products/cas/"&gt;CAS&lt;/a&gt;. After some weeks of test, we found CAS more clean, easiest to install and with a much better documentation !&lt;br&gt;
&lt;br&gt;
Stéphane TRAUMAT</content>
    <dc:creator>Jonas Live</dc:creator>
    <dc:date>2006-05-29T13:39:02Z</dc:date>
  </entry>
  <entry>
    <title>Second post</title>
    <link rel="alternate" href="http://www.jroller.com/krishnan/entry/second_post" />
    <author>
      <name>Krishnan Anantheswaran</name>
    </author>
    <id>http://www.jroller.com/krishnan/</id>
    <modified>2006-05-01T07:00:00Z</modified>
    <issued>2006-05-01T07:00:00Z</issued>
    <summary type="text/plain" mode="escaped">&lt;/p&gt;

&lt;p&gt;
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce interdum. Vivamus vel nibh vel magna convallis tincidunt. Suspendisse accumsan, tellus a egestas laoreet, arcu ligula blandit neque, ut consectetuer neque risus sed urna. Quisque euismod. Fusce feugiat mollis mauris. Vivamus ligula dui, auctor vel, dictum nec, viverra aliquam, elit. Nulla facilisi. Suspendisse molestie hendrerit felis. Vestibulum sodales gravida ipsum. Sed sit amet nibh. Integer at elit ut augue faucibus vehicula. Sed velit orci, lobortis in, tempus vel, vulputate congue, nisl. Donec mauris.
&lt;/p&gt;

&lt;p&gt;
Nunc facilisis, ligula ullamcorper ullamcorper varius, ligula felis faucibus quam, ut faucibus felis quam dignissim turpis. Vestibulum eget purus nec orci elementum ullamcorper. Nam rhoncus accumsan mi. Cras eleifend. In non odio et sapien imperdiet rutrum. Pellentesque pulvinar, pede id molestie dictum, orci nisl facilisis neque, vitae vestibulum elit magna eget dui. Morbi id justo. In id magna. Nam est. Curabitur at urna. Fusce pulvinar. Quisque ornare magna vitae erat. Fusce vitae quam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur enim libero, aliquet ac, interdum id, tincidunt luctus, risus. Vestibulum eu urna. Aliquam erat volutpat.
&lt;/p&gt;

&lt;p&gt;
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse potenti. Nulla facilisi. Donec nunc tortor, elementum in, aliquet et, lobortis quis, nulla. Sed sollicitudin mauris sit amet mi. Proin dapibus vehicula tellus. Vestibulum eu ipsum ut nunc blandit rutrum. Nulla lacinia enim quis nunc. Praesent ut ipsum sed ligula porta suscipit. Maecenas eget diam lobortis odio eleifend lacinia. In nulla dolor, molestie nec, rhoncus vitae, cursus id, nulla. Nam ut purus vitae ipsum luctus pellentesque. Proin commodo ante ac erat. Fusce sed nibh. Etiam at orci vel nisi rhoncus accumsan. Praesent id sapien vitae libero ultrices pretium. Sed odio. Phasellus est. Sed ac leo.
&lt;/p&gt;

&lt;p&gt;
And that is just some dummy text for checking out the look and feel of the blog. Real entries to follow later. 
&lt;/p&gt;

&lt;p&gt;</summary>
    <content type="text/plain" mode="escaped">&lt;/p&gt;

&lt;p&gt;
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce interdum. Vivamus vel nibh vel magna convallis tincidunt. Suspendisse accumsan, tellus a egestas laoreet, arcu ligula blandit neque, ut consectetuer neque risus sed urna. Quisque euismod. Fusce feugiat mollis mauris. Vivamus ligula dui, auctor vel, dictum nec, viverra aliquam, elit. Nulla facilisi. Suspendisse molestie hendrerit felis. Vestibulum sodales gravida ipsum. Sed sit amet nibh. Integer at elit ut augue faucibus vehicula. Sed velit orci, lobortis in, tempus vel, vulputate congue, nisl. Donec mauris.
&lt;/p&gt;

&lt;p&gt;
Nunc facilisis, ligula ullamcorper ullamcorper varius, ligula felis faucibus quam, ut faucibus felis quam dignissim turpis. Vestibulum eget purus nec orci elementum ullamcorper. Nam rhoncus accumsan mi. Cras eleifend. In non odio et sapien imperdiet rutrum. Pellentesque pulvinar, pede id molestie dictum, orci nisl facilisis neque, vitae vestibulum elit magna eget dui. Morbi id justo. In id magna. Nam est. Curabitur at urna. Fusce pulvinar. Quisque ornare magna vitae erat. Fusce vitae quam. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur enim libero, aliquet ac, interdum id, tincidunt luctus, risus. Vestibulum eu urna. Aliquam erat volutpat.
&lt;/p&gt;

&lt;p&gt;
Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Suspendisse potenti. Nulla facilisi. Donec nunc tortor, elementum in, aliquet et, lobortis quis, nulla. Sed sollicitudin mauris sit amet mi. Proin dapibus vehicula tellus. Vestibulum eu ipsum ut nunc blandit rutrum. Nulla lacinia enim quis nunc. Praesent ut ipsum sed ligula porta suscipit. Maecenas eget diam lobortis odio eleifend lacinia. In nulla dolor, molestie nec, rhoncus vitae, cursus id, nulla. Nam ut purus vitae ipsum luctus pellentesque. Proin commodo ante ac erat. Fusce sed nibh. Etiam at orci vel nisi rhoncus accumsan. Praesent id sapien vitae libero ultrices pretium. Sed odio. Phasellus est. Sed ac leo.
&lt;/p&gt;

&lt;p&gt;
And that is just some dummy text for checking out the look and feel of the blog. Real entries to follow later. 
&lt;/p&gt;

&lt;p&gt;</content>
    <dc:creator>Krishnan Anantheswaran</dc:creator>
    <dc:date>2006-05-01T07:00:00Z</dc:date>
  </entry>
  <entry>
    <title>Another Positive Desktop Java Live Review</title>
    <link rel="alternate" href="http://www.jroller.com/scottdelap/entry/another_positive_desktop_java_live" />
    <author>
      <name>Scott Delap</name>
    </author>
    <id>http://www.jroller.com/scottdelap/</id>
    <modified>2006-04-19T05:00:00Z</modified>
    <issued>2006-04-19T05:00:00Z</issued>
    <summary type="text/plain" mode="escaped">&lt;p&gt;
Joshua M. Marinacci (the author of Swing Hacks) had some nice things to say about &lt;a href="http://www.clientjava.com/resources/redirect.action?id=512"&gt;Desktop Java Live&lt;/a&gt; yesterday:&lt;p&gt;
&lt;i&gt;&lt;ul&gt;
"I've been coding Swing for close to ten years and I've never seen a book on Swing that tackles the topic in such a sensible and easy to understand fashion. Instead of going through the technologies or being an annotated reference guide, Desktop Java Live takes you through how to build a real application. In each chapter he discusses the development issues an application programmer will face in real life. The chapters on validation, binding, and threading were very useful, especially since so few books ever address the topic. For anyone who plans to build a real Swing application, this book is a must have."
&lt;/ul&gt;&lt;/i&gt;
&lt;/p&gt;</summary>
    <content type="text/plain" mode="escaped">&lt;p&gt;
Joshua M. Marinacci (the author of Swing Hacks) had some nice things to say about &lt;a href="http://www.clientjava.com/resources/redirect.action?id=512"&gt;Desktop Java Live&lt;/a&gt; yesterday:&lt;p&gt;
&lt;i&gt;&lt;ul&gt;
"I've been coding Swing for close to ten years and I've never seen a book on Swing that tackles the topic in such a sensible and easy to understand fashion. Instead of going through the technologies or being an annotated reference guide, Desktop Java Live takes you through how to build a real application. In each chapter he discusses the development issues an application programmer will face in real life. The chapters on validation, binding, and threading were very useful, especially since so few books ever address the topic. For anyone who plans to build a real Swing application, this book is a must have."
&lt;/ul&gt;&lt;/i&gt;
&lt;/p&gt;</content>
    <dc:creator>Scott Delap</dc:creator>
    <dc:date>2006-04-19T05:00:00Z</dc:date>
  </entry>
  <entry>
    <title>VisualStudio committers vs. Eclipse committers</title>
    <link rel="alternate" href="http://www.jroller.com/BillDudney/entry/visualstudio_committers_vs_eclipse_committers" />
    <author>
      <name>Bill Dudney</name>
    </author>
    <id>http://www.jroller.com/BillDudney/</id>
    <modified>2005-10-07T19:22:12Z</modified>
    <issued>2005-10-07T19:22:12Z</issued>
    <summary type="text/plain" mode="escaped">&lt;p&gt;While at OJ.X on Thursday I had the great privilege of getting to spend some time with &lt;a href="http://milinkovich.blogspot.com/"&gt;Mike Milinkovich&lt;/a&gt;. Since MS was there too he wondered out loud how many people MS had working on Visual Studio. Well Rick LaPlante (a General Manger for MS) was also at the show. While I was doing some research on him I found his blog and a very interesting post &lt;a href="http://blogs.msdn.com/rickla/archive/2005/04/28/413014.aspx"&gt;here&lt;/a&gt;. From these numbers it looks like MS has about 432 people involved in the &lt;a href="http://lab.msdn.microsoft.com/teamsystem/teamcenters/team/default.aspx"&gt;Team Foundation Server&lt;/a&gt; which I guess is a big part of but not all of the next version of Visual Studio. Anyway that is a huge team compared to the 60+ committers on Eclipse.&lt;/p&gt;
&lt;p&gt;Interesting indeed...&lt;/p&gt;
&lt;p&gt;Yes its been a long time, &lt;a href="http://homepage.mac.com/bdudney/PhotoAlbum28.html"&gt;life&lt;/a&gt;, &lt;a href="http://www.virtuas.com"&gt;new job&lt;/a&gt; have been getting in the way of my time to spend on Eclipse.&lt;/p&gt;</summary>
    <content type="text/plain" mode="escaped">&lt;p&gt;While at OJ.X on Thursday I had the great privilege of getting to spend some time with &lt;a href="http://milinkovich.blogspot.com/"&gt;Mike Milinkovich&lt;/a&gt;. Since MS was there too he wondered out loud how many people MS had working on Visual Studio. Well Rick LaPlante (a General Manger for MS) was also at the show. While I was doing some research on him I found his blog and a very interesting post &lt;a href="http://blogs.msdn.com/rickla/archive/2005/04/28/413014.aspx"&gt;here&lt;/a&gt;. From these numbers it looks like MS has about 432 people involved in the &lt;a href="http://lab.msdn.microsoft.com/teamsystem/teamcenters/team/default.aspx"&gt;Team Foundation Server&lt;/a&gt; which I guess is a big part of but not all of the next version of Visual Studio. Anyway that is a huge team compared to the 60+ committers on Eclipse.&lt;/p&gt;
&lt;p&gt;Interesting indeed...&lt;/p&gt;
&lt;p&gt;Yes its been a long time, &lt;a href="http://homepage.mac.com/bdudney/PhotoAlbum28.html"&gt;life&lt;/a&gt;, &lt;a href="http://www.virtuas.com"&gt;new job&lt;/a&gt; have been getting in the way of my time to spend on Eclipse.&lt;/p&gt;</content>
    <dc:creator>Bill Dudney</dc:creator>
    <dc:date>2005-10-07T19:22:12Z</dc:date>
  </entry>
  <entry>
    <title>Maven Out, Ant+Ivy In</title>
    <link rel="alternate" href="http://www.jroller.com/webwork2live/entry/maven_out_ant_ivy_in" />
    <author>
      <name>Matthew Porter</name>
    </author>
    <id>http://www.jroller.com/webwork2live/</id>
    <modified>2005-05-20T01:17:56Z</modified>
    <issued>2005-05-20T01:17:56Z</issued>
    <summary type="text/plain" mode="escaped">&lt;p&gt;
For the past year or so, we have been using &lt;a href="http://maven.apache.org"&gt;Maven&lt;/a&gt; for our projects.  In fact, the builds for the book were based upon Maven, and I even included a small tutorial in Chapter 2 since the documentation for Maven isn't very good.  While this worked very well and Maven also built our IntelliJ project files, I couldn't handle another three to four hours upgrading the library files and their associated conflicts each time a new release of one of our core libraries (WebWork, Spring, Hibernate, Sitemesh, JRobin) happened.  Plus, I always felt like we could never accomplish anything complex without delving into Jelly.... something I never want to do again.
&lt;/p&gt;

&lt;p&gt;
Luckily, about the time I was planning to do another update, &lt;a "href=http://www.jroller.com/page/jcarreira"&gt;Jason Carreira&lt;/a&gt; mentioned on the &lt;a href="http://opensymphony.com"&gt;OpenSymphony&lt;/a&gt; admin mailing list that he would really like to start using &lt;a href="http://www.jayasoft.fr/org/modules/ivy/"&gt;Ivy&lt;/a&gt; for the builds.  After spending 10 minutes seeing the demonstrations, Ivy passed the test.  Despite needing to do a hundred other things, I spent a few hours over the past week getting rid of Maven from our internal software builds and implementing Ant+Ivy.
&lt;/p&gt;

&lt;p&gt;
Today, I spent about 15 minutes converting the book builds to Ant+Ivy.  Now, I just need to go back and fix Chapter 2 (sorry, Craig, Craig, and Amy)!
&lt;/p&gt;

&lt;p&gt;
Many thanks to Jason for his help and constant pestering of questions.  In addition, the folks on the Ivy forums were absolutely amazing with support, even when I had problems with my basic configuration file that was completely my fault.
&lt;/p&gt;</summary>
    <content type="text/plain" mode="escaped">&lt;p&gt;
For the past year or so, we have been using &lt;a href="http://maven.apache.org"&gt;Maven&lt;/a&gt; for our projects.  In fact, the builds for the book were based upon Maven, and I even included a small tutorial in Chapter 2 since the documentation for Maven isn't very good.  While this worked very well and Maven also built our IntelliJ project files, I couldn't handle another three to four hours upgrading the library files and their associated conflicts each time a new release of one of our core libraries (WebWork, Spring, Hibernate, Sitemesh, JRobin) happened.  Plus, I always felt like we could never accomplish anything complex without delving into Jelly.... something I never want to do again.
&lt;/p&gt;

&lt;p&gt;
Luckily, about the time I was planning to do another update, &lt;a "href=http://www.jroller.com/page/jcarreira"&gt;Jason Carreira&lt;/a&gt; mentioned on the &lt;a href="http://opensymphony.com"&gt;OpenSymphony&lt;/a&gt; admin mailing list that he would really like to start using &lt;a href="http://www.jayasoft.fr/org/modules/ivy/"&gt;Ivy&lt;/a&gt; for the builds.  After spending 10 minutes seeing the demonstrations, Ivy passed the test.  Despite needing to do a hundred other things, I spent a few hours over the past week getting rid of Maven from our internal software builds and implementing Ant+Ivy.
&lt;/p&gt;

&lt;p&gt;
Today, I spent about 15 minutes converting the book builds to Ant+Ivy.  Now, I just need to go back and fix Chapter 2 (sorry, Craig, Craig, and Amy)!
&lt;/p&gt;

&lt;p&gt;
Many thanks to Jason for his help and constant pestering of questions.  In addition, the folks on the Ivy forums were absolutely amazing with support, even when I had problems with my basic configuration file that was completely my fault.
&lt;/p&gt;</content>
    <dc:creator>Matthew Porter</dc:creator>
    <dc:date>2005-05-20T01:17:56Z</dc:date>
  </entry>
</feed>

