<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">
  <channel rdf:about="http://www.thespringexperience.com/s/rss/">
    <title>No Fluff Just Stuff</title>
    <link>http://www.thespringexperience.com</link>
    <dc:source resource="http://www.thespringexperience.com" />
    <description>The best value in the Java/Open Source conferencing space hands down</description>
    <items>
      <rdf:Seq>
        <rdf:li resource="http://jroller.com/page/kimchy?entry=compass_and_support_unmarshall" />
        <rdf:li resource="http://jroller.com/page/kimchy?entry=compass_1_1_m1_released" />
        <rdf:li resource="http://jroller.com/page/kimchy?entry=before_after_testcase_with_junit" />
        <rdf:li resource="http://www.agiledeveloper.com/blog/PermaLink,guid,d2b1f4d7-f914-408c-a2b4-52046a14defd.aspx" />
        <rdf:li resource="http://www.agiledeveloper.com/blog/PermaLink,guid,f1ae299c-c6f7-49b5-a02c-4563a605deec.aspx" />
        <rdf:li resource="http://www.agiledeveloper.com/blog/PermaLink,guid,8d70ceb0-efbf-4aa2-a0e7-44f2ab26d174.aspx" />
        <rdf:li resource="http://blogs.relevancellc.com/articles/2006/07/04/ann-enterprise-ruby-studio" />
        <rdf:li resource="http://raibledesigns.com/page/rd?entry=appfuse_and_groovy_grails" />
        <rdf:li resource="http://raibledesigns.com/page/rd?entry=buildix_cruisecontrol_trac_subversion_for" />
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="http://jroller.com/page/kimchy?entry=compass_and_support_unmarshall">
    <title>Shay Banon - Compass and Support Unmarshall</title>
    <link>http://jroller.com/page/kimchy?entry=compass_and_support_unmarshall</link>
    <dc:description>&lt;p&gt;In the past, what I have been trying to do was release a version, and then blog on its new features. I've found out that it does not really work :), so what I am going to do now is try and blog on the new features as soon the last file has been committed, and the JIRA issue was closed. For the &lt;b&gt;supportUnmarshall&lt;/b&gt; feature it won't get any closer, since I just committed it ;).&lt;/p&gt;

&lt;p&gt;The new feature was asked by several Compass users (hi lexi) and boils down to have Compass only perform OSEM marshalling (the process of persisting a domain model into the search engine). Unmarshalling (the process of reading the actual domain model from the search engine) will be disabled.&lt;/p&gt;

&lt;p&gt;First, people might wonder how can Compass be used for read/search operations if un-marshalling data from the search engine into your domain model is not enabled. The way OSEM work is by marshalling the mapped domain model into a Resource (Compass low level search engine data holder, for Lucene users - a Document) and unmarshalling the domain model from a Resource loaded from the search engine. The benefit of using Resources is by having a single API for displaying search results (think of a result as a Map) regardless of the type of Object saved. By using a consistent semantic model (i.e. always mapping certain properties to the same meta-data value), the application can iterate through the search result and display a "title" meta data for example. This allows an application to only worry about persisting the domain model into the search engine, but use Resources for displaying search results. If the application is only going to use Compass for persisting domain model into the search engine, Compass can perform several major performance improvements.&lt;/p&gt;

&lt;p&gt;The first major performance improvement that Compass performs when working under supportUnamrshall set to false is the amount of extra information stored in the search engine. For duplicate meta data values mapped by different properties Compass must create internal meta-data ids (managed ids) in order to be able to perform the un-marshalling correctly. It must also store Collection/Array size and possible null values holders. All of this extra data is not stored in the search engine if Compass knows that it does not need to support un-marshlling.&lt;/p&gt;

&lt;p&gt;Another performance improvement when using supportUnmarshall set to false is memory consumption. In order for Compass to be able to create the internal meta data ids, and because of performance considerations, it must create static bindings of mappings. This is the reason for example that we have max-depth set on component mappings for cyclic relationships (Compass expands the relationships). When Compass knows that it does not need to support unmarshalling, there is no need to perform this static mapping bindings, resulting in a much lower memory consumption. This also enables another major feature which is support for any level of cyclic relationship without limiting it using the max-depth attribute.&lt;/p&gt;

&lt;p&gt;After we explained a bit about why the feature is beneficial, here is how to apply it. Compass by default will work with support for un-marshlling enabled. The compass.osem.supportUnmarhsall global setting or the osem tag within the xsd configuration allows for changing the default behavior. A class mapping (or @Searchable annotation) allows to set it on a class mapping level as well.&lt;/p&gt;

&lt;p&gt;This feature is available from the latest 1.1 M2 SNAPSHOT. If your application can benefit from it, give it a go and tell me how it works for you.&lt;/p&gt;</dc:description>
    <dc:date>Mon, 04 Sep 2006 08:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://jroller.com/page/kimchy?entry=compass_1_1_m1_released">
    <title>Shay Banon - Compass 1.1 M1 Released</title>
    <link>http://jroller.com/page/kimchy?entry=compass_1_1_m1_released</link>
    <dc:description>&lt;p&gt;&lt;a href="http://www.opensymphony.com"&gt;OpenSymphony&lt;/a&gt; and the &lt;a href="http://www.opensymphony.com/compass"&gt;Compass&lt;/a&gt; team are pleased to announce the release of version 1.1 M1. This is the first milestone release of version 1.1, major features include:
&lt;ul&gt;
	&lt;li&gt;&lt;b&gt;Sub Index Hashing:&lt;/b&gt; Allows to partition mapped searchable content into different sub indexes. Previously, you could only map alias level mapping to a sub index (resource/osem/xsem), and different mappings could be mapped to the same sub index. Now, partitioning on the alias level mapping is possible, i.e. mapping different instances of the same class into different sub indexes (in OSEM). &lt;a href="http://www.opensymphony.com/compass/versions/1.1M1/html/core-searchengine.html#core-searchengine-subindexhash"&gt;Here&lt;/a&gt; is more information about it.&lt;/li&gt;
	&lt;li&gt;&lt;b&gt;Direct Lucene support:&lt;/b&gt; &lt;a href="http://www.opensymphony.com/compass/versions/1.1M1/html/core-searchengine.html#core-searchengine-directlucene"&gt;Direct&lt;/a&gt; access to Lucene IndexReader and Seracher is supported.&lt;/li&gt;
	&lt;li&gt;&lt;b&gt;Lucene Directory Wrapper:&lt;/b&gt; Support for custom &lt;a href="http://www.opensymphony.com/compass/versions/1.1M1/html/core-connection.html#core-connection-directoryWrapper"&gt;Directory wrappers&lt;/a&gt; and wrappers providers (think of them as Directory aspects), including two ram caches for single instance Compass installations.
	&lt;li&gt;&lt;b&gt;Better Documentation:&lt;/b&gt; Work has been started on upgrading the reference documentation. The first chapters have already been revised, with the rest of the chapters coming in the following milestone releases. Any feedback/corrections is more than welcomed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;</dc:description>
    <dc:date>Thu, 31 Aug 2006 11:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://jroller.com/page/kimchy?entry=before_after_testcase_with_junit">
    <title>Shay Banon - before/after TestCase with JUnit 3.x</title>
    <link>http://jroller.com/page/kimchy?entry=before_after_testcase_with_junit</link>
    <dc:description>&lt;p&gt;With &lt;a href="http://www.junit.org"&gt;Junit&lt;/a&gt; 4.x or &lt;a href="http://www.testng.org"&gt;TestNG&lt;/a&gt;, one can define a before/after class callback which will be called before/after the tests within the test class execute. For those of us stuck with JUnit 3.x I have written a simple extension to JUnit TestCase that allows for it.&lt;/p&gt;

&lt;p&gt;It is a very simple implementation, counting the number of tests within the test case, and using the information in order to call the beforeTestCase and afterTestCase callbacks. Note, that if running just a single test within the TestCase (as often done with an IDE), the afterTestCase will not be called (which is often ok, since the JVM will shut down). Here is the code:&lt;/p&gt;

&lt;p&gt;
&lt;pre style="line-height: 100%;font-family:monospace;background-color:#ffffff; border-width:0.01mm; border-color:#000000; border-style:solid; padding:4px;"&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;/**
 * A simple extension to Junit &lt;/span&gt;&lt;span style="color:#808080;background-color:#e2ffe2;font-style:italic;"&gt;&amp;lt;code&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;TestCase&lt;/span&gt;&lt;span style="color:#808080;background-color:#e2ffe2;font-style:italic;"&gt;&amp;lt;/code&amp;gt;&lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt; allowing for
 * {&lt;/span&gt;&lt;span style="text-decoration:underline;color:#808080"&gt;&lt;span style="color:#808080;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;@link&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt; #beforeTestCase()} and {&lt;/span&gt;&lt;span style="text-decoration:underline;color:#808080"&gt;&lt;span style="color:#808080;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;@link&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt; #afterTestCase()} callbacks.
 * &lt;/span&gt;&lt;span style="color:#808080;background-color:#e2ffe2;font-style:italic;"&gt;&amp;lt;p/&amp;gt;
&lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt; * Note, the callbacks will only work if running the whole test case
 * and not just one test.
 *
 * &lt;/span&gt;&lt;span style="text-decoration:underline;color:#808080"&gt;&lt;span style="color:#808080;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;@author&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt; kimchy
 */
&lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;public&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;class&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; ExtendedTestCase &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;extends&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; TestCase {

    &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;private&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;static&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;int&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;testCount &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;= &lt;/span&gt;&lt;span style="color:#0000ff;background-color:#ffffff;"&gt;0&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;;

    &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;private&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;static&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;int&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;totalTestCount &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;= -&lt;/span&gt;&lt;span style="color:#0000ff;background-color:#ffffff;"&gt;1&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;;

    &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;private&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;static&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;boolean&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;disableAfterTestCase &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;= &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;false&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;;

    &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;protected&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; ExtendedTestCase() {
        &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;super&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;();
    }

    &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;protected&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; ExtendedTestCase(String name) {
        &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;super&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;(name);
    }

    &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;public&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;void&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; runBare() &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;throws&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; Throwable {
        Throwable exception = &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;null&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;;
        &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;if&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (&lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;totalTestCount &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;== -&lt;/span&gt;&lt;span style="color:#0000ff;background-color:#ffffff;"&gt;1&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;) {
            &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;totalTestCount &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;= countTotalTests();
        }
        &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;if&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (&lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;testCount &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;== &lt;/span&gt;&lt;span style="color:#0000ff;background-color:#ffffff;"&gt;0&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;) {
            beforeTestCase();
        }
        &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;testCount++&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;;
        &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;try&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; {
            &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;super&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;.runBare();
        } &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;catch&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (Throwable running) {
            exception = running;
        }
        &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;if&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (&lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;testCount &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;== &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;totalTestCount)&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; {
            &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;totalTestCount &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;= -&lt;/span&gt;&lt;span style="color:#0000ff;background-color:#ffffff;"&gt;1&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;;
            &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;testCount &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;= &lt;/span&gt;&lt;span style="color:#0000ff;background-color:#ffffff;"&gt;0&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;;
            &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;if&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (!&lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;disableAfterTestCase)&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; {
                &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;try&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; {
                    afterTestCase();
                } &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;catch&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (Exception afterTestCase) {
                    &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;if&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (exception == &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;null&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;) exception = afterTestCase;
                }
            } &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;else&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; {
                &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;disableAfterTestCase &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;= &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;false&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;;
            }
        }
        &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;if&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (exception != &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;null&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;) &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;throw&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; exception;
    }

    &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;protected&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;static&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;void&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; disableAfterTestCase() {
        &lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;disableAfterTestCase &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;= &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;true&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;;
    }

    &lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;/**
     * Called before any tests within this test case.
     *
     * &lt;/span&gt;&lt;span style="text-decoration:underline;color:#808080"&gt;&lt;span style="color:#808080;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;@throws&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt; Exception
     */
&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;protected&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;void&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; beforeTestCase() &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;throws&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; Exception {

    }

    &lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt;/**
     * Called after all the tests within the test case
     * have executed.
     *
     * &lt;/span&gt;&lt;span style="text-decoration:underline;color:#808080"&gt;&lt;span style="color:#808080;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;@throws&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#808080;background-color:#ffffff;font-style:italic;"&gt; Exception
     */
&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;protected&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;void&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; afterTestCase() &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;throws&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; Exception {

    }

    &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;private&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;int&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; countTotalTests() {
        &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;int&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; count = &lt;/span&gt;&lt;span style="color:#0000ff;background-color:#ffffff;"&gt;0&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;;
        Class superClass = getClass();
        Vector&amp;lt;String&amp;gt; names = &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;new&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; Vector&amp;lt;String&amp;gt;();
        &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;while&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (Test.&lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;class&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;.isAssignableFrom(superClass)) {
            Method[] methods = superClass.getDeclaredMethods();
            &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;for&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (Method method : methods) {
                String name = method.getName();
                &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;if&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (names.contains(name))
                    &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;continue&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;;
                names.addElement(name);
                &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;if&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; (isTestMethod(method)) {
                    count++;
                }
            }
            superClass = superClass.getSuperclass();
        }
        &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;return&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; count;
    }

    &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;private&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;boolean&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; isTestMethod(Method m) {
        String name = m.getName();
        Class[] parameters = m.getParameterTypes();
        Class returnType = m.getReturnType();
        &lt;/span&gt;&lt;span style="color:#000080;background-color:#ffffff;font-weight:bold;"&gt;return&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; parameters.&lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;"&gt;length &lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;== &lt;/span&gt;&lt;span style="color:#0000ff;background-color:#ffffff;"&gt;0&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt; &amp;&amp; name.startsWith(&lt;/span&gt;&lt;span style="color:#008000;background-color:#ffffff;font-weight:bold;"&gt;"test"&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;) &amp;&amp; returnType.equals(Void.&lt;/span&gt;&lt;span style="color:#660e7a;background-color:#ffffff;font-weight:bold;font-style:italic;"&gt;TYPE)&lt;/span&gt;&lt;span style="background-color:#ffffff;"&gt;;
    }

}&lt;/span&gt;&lt;/pre&gt;&lt;/p&gt;</dc:description>
    <dc:date>Thu, 31 Aug 2006 08:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://www.agiledeveloper.com/blog/PermaLink,guid,d2b1f4d7-f914-408c-a2b4-52046a14defd.aspx">
    <title>Venkat Subramaniam - What should a requirements document provide?</title>
    <link>http://www.agiledeveloper.com/blog/PermaLink,guid,d2b1f4d7-f914-408c-a2b4-52046a14defd.aspx</link>
    <dc:description>&lt;p&gt;
   Recently I had the opportunity to meet a group of requirements specialists.&amp;nbsp;
   They were interested in 
   &lt;br&gt;
   learning about Agility from the point of view of requirements gathering. 
&lt;/p&gt;
&lt;p&gt;
   They were keen on getting all the right requirements documented so the developers
   can have all they 
   &lt;br&gt;
   need to get their work done.
&lt;/p&gt;
&lt;p&gt;
   Unfortunately, the more time and effort we spend up-front trying to get the requirement
   fully documented,&lt;br&gt;
   the more we will find ourselves failing at it. A better approach is to get the requirements
   documented at a&lt;br&gt;
   fairly high level, highlighting what you may thing as major and/or important features.
   Then you can delve into&lt;br&gt;
   details right before the implementation.
&lt;/p&gt;
&lt;p&gt;
   A great book to read in this area is &lt;a href="http://www.mountaingoatsoftware.com/about.php" target=_blank&gt;Mike
   Cohn???s&lt;/a&gt; ???&lt;a href="http://www.aw-bc.com/catalog/academic/product/0,1144,0321205685,00.html" target=_blank&gt;User
   Stories Applied&lt;/a&gt;.???
&lt;/p&gt;
&lt;p&gt;
   So, what do I expect from a requirements document. Rather than providing answer to
   all my questions, I 
   &lt;br&gt;
   would like for it to help me ask the right questions when I am ready to delve into
   the implementation.
&lt;/p&gt;
&lt;p&gt;
   A great requirements document helps me not with right answers, but with right questions.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.agiledeveloper.com/blog/aggbug.ashx?id=d2b1f4d7-f914-408c-a2b4-52046a14defd"&gt;</dc:description>
    <dc:date>Sun, 30 Jul 2006 08:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://www.agiledeveloper.com/blog/PermaLink,guid,f1ae299c-c6f7-49b5-a02c-4563a605deec.aspx">
    <title>Venkat Subramaniam - It???s a ???matter??? of productivity???</title>
    <link>http://www.agiledeveloper.com/blog/PermaLink,guid,f1ae299c-c6f7-49b5-a02c-4563a605deec.aspx</link>
    <dc:description>&lt;p&gt;
   I've seen &lt;a href="http://weblogs.java.net/blog/eitan/" target=_blank&gt;Eitan Suez&lt;/a&gt; at
   work on this for a while. He has been passionate about it and I???ve seen earlier 
   &lt;br&gt;
   versions of his ???baby??? product at various stages. On Friday night, Eitan demoed &lt;a href="http://jmatter.org/" target=_blank&gt;JMatter&lt;/a&gt; for
   a bunch of 
   &lt;br&gt;
   us who gathered after the &lt;a href="http://www.nofluffjuststuff.com/show_view.jsp?showId=58" target=_blank&gt;NFJS
   Des Moines&lt;/a&gt; show.
&lt;/p&gt;
&lt;p&gt;
   If you spend quite some time developing UI applications in Java and want to quickly
   put together&amp;nbsp;your 
   &lt;br&gt;
   application, then JMatter can help a great deal. JMatter is metadata driven???you derive
   your domain 
   &lt;br&gt;
   class from a JMatter class, declare some properties, write a little configuration,
   and then sit back and 
   &lt;br&gt;
   see the UI in action for your app. Quite a few basic or commonly expected functionalities
   (like user 
   &lt;br&gt;
   management) is readily available out of the box.
&lt;/p&gt;
&lt;p&gt;
   One of the things that makes JMatter pretty interesting is its origin. I am not a
   big fan of design by 
   &lt;br&gt;
   committee. We???ve seen examples of frameworks that have come out of committee which
   have 
   &lt;br&gt;
   standardized or productized before innovation. JMatter, on the other hand, was inspired
   by the concept 
   &lt;br&gt;
   of &lt;a href="http://nakedobjects.org/" target=_blank&gt;Naked Objects&lt;/a&gt; and emerged
   as a framework from a real application Eitan has been building for real 
   &lt;br&gt;
   work. There are some Real nice concepts in it that we see now in otheR fRamewoRks
   (you get it). 
&lt;/p&gt;
&lt;p&gt;
   Eitan realizes a few areas that can be improved (like all products). The small amount
   of configuration 
   &lt;br&gt;
   that is needed can be further minimized or eliminated with some exploration of metadata.
   During the 
   &lt;br&gt;
   demo we were throwing at him quite a few ???why not???? and he was quick to responds to
   those. For one 
   &lt;br&gt;
   question, his quick answer was ???Yes, that is a good idea, so on the flight up here
   I implemented that??????&lt;br&gt;
   and quickly showed that in action!
&lt;/p&gt;
&lt;p&gt;
   If you are building Java UI applications, check out the &lt;a href="http://jmatter.org/content/screenshots" target=_blank&gt;screen
   snapshot&lt;/a&gt; or &lt;a href="http://jmatter.org/content/nfjsmgr_movie"&gt;demo&lt;/a&gt; for yourself.
&lt;/p&gt;
&lt;p&gt;
   (Disclaimer: I saw his live demo in Des Moines and had not seen the demo he had posted
   on the web. 
   &lt;br&gt;
   After writing this blog, I found out that I???m appearing in his demo. Opinion expressed
   here about JMatter&lt;br&gt;
   has absolutely nothing to do with that. Had I known Eitan will pop my picture, I would
   have sent him&lt;br&gt;
   a better picture with my glasses! :) )
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.agiledeveloper.com/blog/aggbug.ashx?id=f1ae299c-c6f7-49b5-a02c-4563a605deec"&gt;</dc:description>
    <dc:date>Sat, 29 Jul 2006 16:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://www.agiledeveloper.com/blog/PermaLink,guid,8d70ceb0-efbf-4aa2-a0e7-44f2ab26d174.aspx">
    <title>Venkat Subramaniam - Annotation Hammer</title>
    <link>http://www.agiledeveloper.com/blog/PermaLink,guid,8d70ceb0-efbf-4aa2-a0e7-44f2ab26d174.aspx</link>
    <dc:description>&lt;a href="http://www.infoq.com/articles/Annotation-Hammer"&gt;InfoQ "Annotation Hammer"
article:&lt;img src="http://www.infoq.com/resource/articles/Annotation-Hammer/en/smallimage/image_annotation_hammer3.jpg"&gt;&lt;/a&gt;&lt;img width="0" height="0" src="http://www.agiledeveloper.com/blog/aggbug.ashx?id=8d70ceb0-efbf-4aa2-a0e7-44f2ab26d174"&gt;</dc:description>
    <dc:date>Sat, 29 Jul 2006 13:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://blogs.relevancellc.com/articles/2006/07/04/ann-enterprise-ruby-studio">
    <title>Justin Gehtland - Announcing Enterprise Ruby Studio</title>
    <link>http://blogs.relevancellc.com/articles/2006/07/04/ann-enterprise-ruby-studio</link>
    <dc:description>&lt;p&gt;
Justin and I will be delivering the &lt;a href="http://www.pragmaticstudio.com/ruby/index.html"&gt;Enterprise Ruby Studio&lt;/a&gt; for the &lt;a href="http://www.pragmaticstudio.com/"&gt;Pragmatic Studio&lt;/a&gt;. First run is scheduled for Boston, MA, USA, Sept 11-13. You can find the outline, plus all the logistical details, &lt;a href="http://www.pragmaticstudio.com/ruby/index.html"&gt;here&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;We're very excited to share our experiences with &lt;a href="http://www.ruby-lang.org/en/"&gt;Ruby&lt;/a&gt; in the enterprise over the past few years: &lt;a href="http://www.rubyonrails.org/"&gt;Rails&lt;/a&gt;, of course, and now &lt;a href="http://streamlined.relevancellc.com/"&gt;Streamlined&lt;/a&gt;, but a lot of other things as well. &lt;a href="http://stdlib.rubyonrails.org/libdoc/rinda/rdoc/index.html"&gt;Rinda&lt;/a&gt; and &lt;a href="http://www.yaml.org/"&gt;YAML&lt;/a&gt; are among our current favorites. We have found that Ruby has a rich set of libraries for common enterprise tasks. Equally importantly, it's the best mainstream language we know when you have to roll it yourself.&lt;/p&gt;</dc:description>
    <dc:date>Mon, 10 Jul 2006 13:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://raibledesigns.com/page/rd?entry=appfuse_and_groovy_grails">
    <title>Matt Raible - AppFuse and Groovy/Grails?</title>
    <link>http://raibledesigns.com/page/rd?entry=appfuse_and_groovy_grails</link>
    <dc:description>Here's an interesting e-mail I received last night:&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
I see AppFuse's strong points is in integrating a lot of oss in a
synergistic manner, which is really great and helpful. Just wondering
whether there is any chance of integrating AppFuse with groovy and
especially grails.
&lt;br/&gt;&lt;br/&gt;
I also just found out about grails 0.1 and it looks really promising,
for a 0.1 release.
&lt;br/&gt;&lt;br/&gt;
I just feel that it has some synergy there, a java ruby on rails
combines with the best oss integration available.&lt;/p&gt;
&lt;p&gt;My response:&lt;/p&gt;
&lt;p class="quote" style="color: #666"&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's probably better for
users to choose one or the other.
&lt;/p&gt;
&lt;p&gt;Grails definitely looks cool, and a lot like Rails.  However, I think using Groovy is a pretty big step for the majority of Java Developers out there. If you're reading this post, you're probably not in the majority.</dc:description>
    <dc:date>Mon, 10 Jul 2006 11:00:00 CDT</dc:date>
  </item>
  <item rdf:about="http://raibledesigns.com/page/rd?entry=buildix_cruisecontrol_trac_subversion_for">
    <title>Matt Raible - Buildix - CruiseControl, Trac and Subversion for VMWare</title>
    <link>http://raibledesigns.com/page/rd?entry=buildix_cruisecontrol_trac_subversion_for</link>
    <dc:description>From the CruiseControl mailing list a few minutes ago:&lt;/p&gt;
&lt;p class="quote" style="color: #666"&gt;
Just passing on the info... this is one of those projects I also wanted/intended to do. &lt;img src="http://raibledesigns.com/images/smileys/smile.gif" class="smiley" alt=":)" title=":)" /&gt; I'm glad someone beat me to it! 
&lt;br/&gt;&lt;br/&gt;
&lt;a href="http://buildix.thoughtworks.com/"&gt;http://buildix.thoughtworks.com&lt;/a&gt;
&lt;br/&gt;&lt;br/&gt;
It includes CruiseControl, Trac, Subversion all on a single live cd or vm ware image. Very nice!
&lt;/p&gt;
&lt;p&gt;After installing Ubuntu on VMWare server last weekend, I was getting ready to create something similar to this.  I'm glad I saw this as it seems to be a much more complete package than the one I was going to create. I'd prefer Ubuntu over Debian/KNOPPIX, but since Ubuntu is based on Debian, it probably doesn't matter.
&lt;br/&gt;&lt;br/&gt;
A couple additions I'd like to see are Maven 1, 2 and Continuum pre-installed.  I doubt that'll happen though since CruiseControl is a Thoughtworks-sponsored project. Regardless, if I had a Buildix with those options, I'd likely use (and recommend) it for every future project. A lot of clients already have bug tracking and source control installed, so the build server is the main thing that interests me.</dc:description>
    <dc:date>Mon, 10 Jul 2006 08:00:00 CDT</dc:date>
  </item>
</rdf:RDF>

