<?xml version="1.0"?>
<rss version="2.0">
<channel>
  <title>Stephan Schwab - frameworks tag</title>
  <link>http://www.stephan-schwab.com/tags/frameworks/</link>
  <description>Software Technology Consultant</description>
  <language>en</language>
  <copyright>Stephan Schwab</copyright>
  <lastBuildDate>Tue, 28 Oct 2008 21:32:43 GMT</lastBuildDate>
  <generator>Pebble (http://pebble.sourceforge.net)</generator>
  <docs>http://backend.userland.com/rss</docs>
  
  
  <item>
    <title>Adobe Demos &#034;Thermo&#034; RIA Design Tool to Delighted Crowd</title>
    <link>http://www.stephan-schwab.com/2007/10/03/1191444390398.html</link>
    
      
        <description>
          &lt;p&gt;This sounds quite interesting:&lt;/p&gt;

&lt;blockquote&gt;&lt;a href=&#034;http://www.readwriteweb.com/about_josh.php&#034;&gt;Josh Catone&lt;/a&gt; in &lt;a href=&#034;http://feeds.feedburner.com/~r/readwriteweb/~3/164349251/adobe_thermo_ria_design_tool.php&#034;&gt;Adobe Demos &#034;Thermo&#034; RIA Design Tool to Delighted Crowd&lt;/a&gt;:&lt;br&gt;
&lt;p&gt;The presenters really got the MAX crowd rocking by showing off Thermo&#039;s &#034;Convert artwork to...&#034; feature. In a matter of a couple of clicks, a text input box on the UI went from static image to actual form field with the MXML code rendered automatically. Thermo even preserved styling of the form element from the PSD mockup.&lt;/p&gt;

&lt;img src=&#034;http://www.readwriteweb.com/images/thermo-interface.jpg&#034;/&gt;

&lt;p&gt;The code view for Thermo is actually the full Flex Builder application, which means that it is a powerful development tool for programmers, as well. The idea is that developers can write underlying business logic for a Flex application while designers work on look and feel all from inside the same environment, and the process is as painless as possible for both sides.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But I have my doubts. That awfully sounds like code generation and as to the best of my knowledge that&#039;s usually a one-way street. You use a tool to generate the code and once you start making changes to the generated code you can&#039;t use the tool anymore or have to reapply the changes again.&lt;/p&gt;

&lt;p&gt;On the other hand if that &#034;Convert Artwork To ...&#034; function creates a component, that would be a good solution. I might have to look into Adobe Flex a bit more to understand what&#039;s going on here. But at the very least this is an interesting idea and I&#039;m going to see whether we can adopt it a bit and make use of it in our collaboration with a designer we&#039;ve just added to our &lt;a href=&#034;http://www.caimito.net/caimitoEnglish/categories/Savila/&#034;&gt;Savila&lt;/a&gt; development team.&lt;/p&gt;
&lt;!--
&lt;rdf:RDF xmlns:rdf=&#034;http://www.w3.org/1999/02/22-rdf-syntax-ns#&#034;
         xmlns:dc=&#034;http://purl.org/dc/elements/1.1/&#034;
         xmlns:trackback=&#034;http://madskills.com/public/xml/rss/module/trackback/&#034;&gt;
&lt;rdf:Description
    rdf:about=&#034;http://www.stephan-schwab.com/2007/10/03/1191444390398.html&#034;
    dc:identifier=&#034;http://www.stephan-schwab.com/2007/10/03/1191444390398.html&#034;
    dc:title=&#034;Adobe Demos &#034;Thermo&#034; RIA Design Tool to Delighted Crowd&#034;
    trackback:ping=&#034;http://www.stephan-schwab.com/addTrackBack.action?entry=1191444390398&amp;token=8973229481312793017&#034; /&gt;
&lt;/rdf:RDF&gt;
--&gt;
        </description>
      
      
    
    
    
    <category>Frameworks</category>
    
    <comments>http://www.stephan-schwab.com/2007/10/03/1191444390398.html#comments</comments>
    <guid isPermaLink="true">http://www.stephan-schwab.com/2007/10/03/1191444390398.html</guid>
    <pubDate>Wed, 03 Oct 2007 20:46:30 GMT</pubDate>
  </item>
  
  <item>
    <title>Starting to love EJB3 Hibernate Annotations</title>
    <link>http://www.stephan-schwab.com/2007/03/08/1173410671927.html</link>
    
      
        <description>
          &lt;p&gt;As our current project allows for some experimentation and adoption of recent technologies, we spent today with EJB3 Hibernate Annotations to get away from the XML configuration one used to create with Hibernate before.&lt;/p&gt;

&lt;p&gt;The annotations need to be placed in the same compilation unit as the entity class lives in. The result is that these POJOs now are no longer POJOs in a very tight sense. That has been &lt;a href=&#034;http://www.theserverside.com/discussions/thread.tss?thread_id=42447&#034;&gt;criticized&lt;/a&gt; as polluting the codebase with ORM specific annotations. That&#039;s certainly right, but one does not replace one ORM tool for another very often and going with the EJB3 Java Persistence annotation one can replace ORM tools, as Hibernate is just one implementation of that API. So I wouldn&#039;t fear too much. After all those classes that become entity classes are meant to be stored into a database and somewhere I have to put the mapping. Doing so in Java code instead of an external XML file appears to be clearer and more appealing to a developer.&lt;/p&gt;

&lt;p&gt;Here is something we learned today.&lt;/p&gt;

&lt;p&gt;Let&#039;s define a persistent entity class called &lt;code&gt;Issue&lt;/code&gt;.&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;@Entity
@Table(name=&#034;issue&#034;)
@NamedQueries( { @NamedQuery(name = &#034;findIssueById&#034;, query = &#034;from Issue i where i.id = ?&#034;) })
public class Issue implements IdentifiableObject {

  @Id @GeneratedValue
  private long id ;

[...]
}&lt;/pre&gt;

&lt;p&gt;This entity will be persisted into the table &lt;code&gt;issue&lt;/code&gt; and you see that it has an id field. Other fields are omitted for clarity. Further we define a named query &lt;code&gt;findIssueById&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In a generic DAO class using Spring&#039;s Hibernate template we create a method &lt;code&gt;findById&lt;/code&gt; as follows.&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;public Object findById(String query, long id) {
  List list = getHibernateTemplate().findByNamedQuery(query, id);
  if (list.isEmpty())
    return null ;
  else
    return list.get(0) ;
}&lt;/pre&gt;

&lt;p&gt;Elsewhere in the application we can the find any entity by calling findById passing in the name of the named query and of course the query criteria id.&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;Issue issueRead = (Issue) repository.findById(&#034;findIssueById&#034;, someId) ;&lt;/pre&gt;

&lt;p&gt;In your Spring application context configure your session factory using the &lt;code&gt;AnnotationSessionFactoryBean&lt;/code&gt;.&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;&amp;lt;bean id=&#034;mySessionFactory&#034; class=&#034;org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean&#034;&amp;gt;
  &amp;lt;property name=&#034;dataSource&#034; ref=&#034;myDataSource&#034;/&amp;gt;
  &amp;lt;property name=&#034;hibernateProperties&#034;&amp;gt;
    &amp;lt;props&amp;gt;
      &amp;lt;prop key=&#034;hibernate.dialect&#034;&amp;gt;org.hibernate.dialect.HSQLDialect&amp;lt;/prop&amp;gt;
      [...]
    &amp;lt;/props&amp;gt;
  &amp;lt;/property&amp;gt;
  &amp;lt;property name=&#034;annotatedClasses&#034;&amp;gt;
    &amp;lt;list&amp;gt;
      &amp;lt;value&amp;gt;net.caimito.savila.Issue&amp;lt;/value&amp;gt;
    &amp;lt;/list&amp;gt;
  &amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;&lt;/pre&gt;


&lt;!--
&lt;rdf:RDF xmlns:rdf=&#034;http://www.w3.org/1999/02/22-rdf-syntax-ns#&#034;
         xmlns:dc=&#034;http://purl.org/dc/elements/1.1/&#034;
         xmlns:trackback=&#034;http://madskills.com/public/xml/rss/module/trackback/&#034;&gt;
&lt;rdf:Description
    rdf:about=&#034;http://www.stephan-schwab.com/2007/03/08/1173410671927.html&#034;
    dc:identifier=&#034;http://www.stephan-schwab.com/2007/03/08/1173410671927.html&#034;
    dc:title=&#034;Starting to love EJB3 Hibernate Annotations&#034;
    trackback:ping=&#034;http://www.stephan-schwab.com/addTrackBack.action?entry=1173410671927&amp;token=-2932145683637199189&#034; /&gt;
&lt;/rdf:RDF&gt;
--&gt;
        </description>
      
      
    
    
    
    <category>Java</category>
    
    <category>SpringFramework</category>
    
    <category>Experience</category>
    
    <category>Caimito</category>
    
    <category>Hibernate</category>
    
    <comments>http://www.stephan-schwab.com/2007/03/08/1173410671927.html#comments</comments>
    <guid isPermaLink="true">http://www.stephan-schwab.com/2007/03/08/1173410671927.html</guid>
    <pubDate>Fri, 09 Mar 2007 03:24:31 GMT</pubDate>
  </item>
  
  <item>
    <title>Tapestry: first experiences</title>
    <link>http://www.stephan-schwab.com/2007/03/04/1173040249999.html</link>
    
      
        <description>
          &lt;p&gt;Together with Fidel, Caimito&#039;s new hire in Panama, I started to experiment with the component-based web framework &lt;a href=&#034;http://tapestry.apache.org&#034;&gt;Tapestry&lt;/a&gt;. We were inspired by Brian Sam-Bodden&#039;s book &lt;a href=&#034;http://www.amazon.com/Beginning-POJOs-Lightweight-Development-Hibernate/dp/1590595963/ref=pd_bbs_sr_1/105-4060228-7518846?ie=UTF8&amp;amp;s=books&amp;amp;qid=1173036748&amp;amp;sr=8-1&#034;&gt;Beginning POJOs&lt;/a&gt; and Brian&#039;s personal recommendation of &lt;a href=&#034;http://tapestry.apache.org&#034;&gt;Tapestry&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are two types of web frameworks: request-based and component-based. &lt;/p&gt;

&lt;p&gt;Request-based frameworks like, Struts, WebWorks (now Struts 2), SpringMVC and others expose the HTTP request/response cycle directly and only map that to actions or controllers where you code something to do the work. These frameworks expect you to code the action and provide the view with some other technology. Common view technologies are JSP, Velocity, FreeMarker and others. These view technologies combine HTML tags from a template with values that are injected by the framework and carry your output information.&lt;/p&gt;

&lt;p&gt;Component-based frameworks don&#039;t expose the HTTP request/response cycle and they don&#039;t use a separate view technology. Instead they let you create your application in Java without thinking too much about the web. Sun&#039;s JSF (Java Server Faces), Apache MyFaces (an implementation of JSF) and Tapestry are component-based frameworks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Everything is a component&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With Tapestry everything is a component starting with the web page itself. Instead of a lot of XML files Tapestry 4.1 comes with annotation support. Add an extension to support Acegi Security and you can use the following code to create a secured page accessible by authenticated users with the role ROLE_USER only. The HTML comes from a file SomePage.html.&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;@org.acegisecurity.annotation.Secured(&#034;ROLE_USER&#034;)
public abstract class SomePage extends BasePage {
}&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Links&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you want to link to &lt;code&gt;SomePage&lt;/code&gt;, you write:&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;&amp;lt;a href=&#034;#&#034; jwcid=&#034;@PageLink&#034; page=&#034;SomePage&#034;&gt;Some page&amp;lt;/a&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Form handling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Let&#039;s say you want to code a page with a search form. You create an HTML template called Find.html (formatting details omitted for clarity):&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;&amp;lt;form jwcid=&#034;form@Form&#034; listener=&#034;listener:doSumit&#034;&gt;
&amp;lt;input jwcid=&#034;search@TextField&#034;	value=&#034;ognl:idNumber&#034;/&gt;
&amp;lt;input type=&#034;submit&#034; jwcid=&#034;@Submit&#034; value=&#034;ognl:messages.getMessage(&#039;submit&#039;)&#034;/&gt;
&amp;lt;/form&gt;&lt;/pre&gt;

&lt;p&gt;Tapestry makes use of the fact that web browsers ignore tags and attributes they don&#039;t know. &lt;code&gt;jwcid&lt;/code&gt; is used to refer to a component and the other non-HTML attributes are passed on to the component referred to by &lt;code&gt;jwcid&lt;/code&gt;. This template creates a form with an text input field and a submit button. Further you can see Tapestry&#039;s support for internationalization. &lt;code&gt;ognl:messages.getMessage(&#039;submit&#039;)&lt;/code&gt; reads the value for the submit key from a Java resource bundle. So you can create properties files Find.properties (default), Find_es.properties and Find_de.properties to support English (en) and Spanish (es) specifically and leave everything to the values in the default file Find.properties. Quite easy - isn&#039;t it?&lt;/p&gt;

&lt;p&gt;Next is the code for the Find page:&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;@org.acegisecurity.annotation.Secured(&#034;ROLE_USER&#034;)
public abstract class Find extends BasePage implements PageBeginRenderListener {

	public abstract void setIdNumber(String idNumber);
	public abstract String getIdNumber();

	@InjectPage(&#034;EditUserStory&#034;)
	public abstract EditUserStory getEditUserStory();

	@InjectPage(&#034;UserStoryDoNotExist&#034;)
	public abstract UserStoryDoNotExist getUserStoryDoNotExist();

	@InjectObject(&#034;spring:repository&#034;)
	public abstract FileBasedIssueRepository getFileBasedIssueRepository();

[...]
	public IPage doSubmit() {
		if (getIdNumber() != null) {
			Long id = Long.parseLong(getIdNumber());
			UserStory userStory = getFileBasedIssueRepository().find(id);

			if (userStory != null) {
				EditUserStory editUserStory = getEditUserStory();
				editUserStory.setUserStory(userStory);
				return editUserStory;
			}
		}
		return getUserStoryDoNotExist();
	}
}&lt;/pre&gt;

&lt;p&gt;The @InjectPage annotation lets the Find class know about other pages. With @InjectObject you can inject into your class references to HiveMind services. Tapestry 4.x uses HiveMind and IoC container. With @InjectObject(&#034;spring:repository&#034;) we inject a Spring bean called repository. So you can see there is an easy way to combine Tapestry and Spring although Tapestry doesn&#039;t use Spring.&lt;/p&gt;

&lt;p&gt;Further down in the doSubmit method the return value represents the page Tapestry should show to the user. To us as Java developers this is just a page object and has nothing to do with any kind of HTTP redirect. That&#039;s nice, because we can stay within the world we know.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning curve&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One might expect that Tapestry&#039;s learning curve is high. But to my surprise it isn&#039;t. Fidel had never worked on a web application, but has worked on Swing applications before. It took him 3 days to set up his work environment (Eclipse, Maven), read about Tapestry, check out the samples from Tapestry&#039;s tutorial. After that warmup he got productive and created a useable application with business logic and even some nice design in CSS within a week.&lt;/p&gt;

&lt;p&gt;So in my conclusion Tapestry is a very productive framework. Of course there is more to explore. On the 3rd day we started to explore how to create custom components and in that area is most of the stuff to learn more about.&lt;/p&gt;

&lt;!--
&lt;rdf:RDF xmlns:rdf=&#034;http://www.w3.org/1999/02/22-rdf-syntax-ns#&#034;
         xmlns:dc=&#034;http://purl.org/dc/elements/1.1/&#034;
         xmlns:trackback=&#034;http://madskills.com/public/xml/rss/module/trackback/&#034;&gt;
&lt;rdf:Description
    rdf:about=&#034;http://www.stephan-schwab.com/2007/03/04/1173040249999.html&#034;
    dc:identifier=&#034;http://www.stephan-schwab.com/2007/03/04/1173040249999.html&#034;
    dc:title=&#034;Tapestry: first experiences&#034;
    trackback:ping=&#034;http://www.stephan-schwab.com/addTrackBack.action?entry=1173040249999&amp;token=2118368607815380117&#034; /&gt;
&lt;/rdf:RDF&gt;
--&gt;
        </description>
      
      
    
    
    
    <category>Tapestry</category>
    
    <category>Experience</category>
    
    <category>Caimito</category>
    
    <comments>http://www.stephan-schwab.com/2007/03/04/1173040249999.html#comments</comments>
    <guid isPermaLink="true">http://www.stephan-schwab.com/2007/03/04/1173040249999.html</guid>
    <pubDate>Sun, 04 Mar 2007 20:30:49 GMT</pubDate>
  </item>
  
  <item>
    <title>Checking a bean&#039;s health</title>
    <link>http://www.stephan-schwab.com/2007/01/30/1170134573874.html</link>
    
      
        <description>
          &lt;p&gt;Sometimes the little details get overlooked. While I&#039;m working on my book about &lt;a href=&#034;http://www.acegisecurity.org&#034;&gt;Acegi Security&lt;/a&gt; I read a lot of its source code and that&#039;s always a refreshing learning experience. In fact I&#039;d like to recommend anyone to take advantage of open source and take it literally: read the source. It educates and stimulates.&lt;/p&gt;

&lt;p&gt;What did I find? Nothing big, but still something I had overlooked in a past project when I wanted to make sure that beans that were vital to the system have been properly initialized. In Spring there is the &lt;code&gt;InitializingBean&lt;/code&gt; interface, which defines the &lt;code&gt;afterPropertiesSet()&lt;/code&gt; method. Spring will call this method on all beans implementing this interface after it has set the bean&#039;s properties.&lt;/p&gt;

&lt;p&gt;Now you can use Spring&#039;s &lt;code&gt;Assert&lt;/code&gt; class to perform checks and have an exception thrown, if something is wrong. It&#039;s all built-in and free.&lt;/p&gt;

&lt;!--
&lt;rdf:RDF xmlns:rdf=&#034;http://www.w3.org/1999/02/22-rdf-syntax-ns#&#034;
         xmlns:dc=&#034;http://purl.org/dc/elements/1.1/&#034;
         xmlns:trackback=&#034;http://madskills.com/public/xml/rss/module/trackback/&#034;&gt;
&lt;rdf:Description
    rdf:about=&#034;http://www.stephan-schwab.com/2007/01/30/1170134573874.html&#034;
    dc:identifier=&#034;http://www.stephan-schwab.com/2007/01/30/1170134573874.html&#034;
    dc:title=&#034;Checking a bean&#039;s health&#034;
    trackback:ping=&#034;http://www.stephan-schwab.com/addTrackBack.action?entry=1170134573874&amp;token=6871089833408213083&#034; /&gt;
&lt;/rdf:RDF&gt;
--&gt;
        </description>
      
      
    
    
    
    <category>SpringFramework</category>
    
    <comments>http://www.stephan-schwab.com/2007/01/30/1170134573874.html#comments</comments>
    <guid isPermaLink="true">http://www.stephan-schwab.com/2007/01/30/1170134573874.html</guid>
    <pubDate>Tue, 30 Jan 2007 05:22:53 GMT</pubDate>
  </item>
  
  <item>
    <title>Most common mistake: start Swing applications off the right thread</title>
    <link>http://www.stephan-schwab.com/2007/01/24/1169661885477.html</link>
    
      
        <description>
          &lt;p&gt;While reading &lt;a href=&#034;http://java.sun.com/developer/technicalArticles/javase/swingworker/&#034;&gt;Improve Application Performance With SwingWorker in Java SE 6&lt;/a&gt; from the Sun Developer Network I found that I made the most common mistake in Swing programming myself as well.&lt;/p&gt;

&lt;p&gt;All Java programs start with an initial thread out of the main() method. A lot of people - including myself - will create the application main window as a JFrame there in main() and show the UI. That&#039;s wrong!&lt;/p&gt;

&lt;p&gt;The correct way is to use the Event Dispatch Thread (EDT) for all user interface related stuff. So creating the application main window outside of the EDT is wrong, because it might lead to thread synchronization problems later. The right way to do it is to use the invokeLater() method from SwingUtilities:&lt;/p&gt;

&lt;pre class=&#034;codeSample&#034;&gt;public class MainFrame extends javax.swing.JFrame {
 
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new MainFrame().setVisible(true);
      }
    });
  }
}
&lt;/pre&gt;

&lt;p&gt;Doing so has another advantage. The call to invokeLater() returns immediately allowing your application to perform other initialization tasks without delay. If a wait is required, one can use invokeAndWait() instead.&lt;/p&gt;
&lt;!--
&lt;rdf:RDF xmlns:rdf=&#034;http://www.w3.org/1999/02/22-rdf-syntax-ns#&#034;
         xmlns:dc=&#034;http://purl.org/dc/elements/1.1/&#034;
         xmlns:trackback=&#034;http://madskills.com/public/xml/rss/module/trackback/&#034;&gt;
&lt;rdf:Description
    rdf:about=&#034;http://www.stephan-schwab.com/2007/01/24/1169661885477.html&#034;
    dc:identifier=&#034;http://www.stephan-schwab.com/2007/01/24/1169661885477.html&#034;
    dc:title=&#034;Most common mistake: start Swing applications off the right thread&#034;
    trackback:ping=&#034;http://www.stephan-schwab.com/addTrackBack.action?entry=1169661885477&amp;token=6131514493804669415&#034; /&gt;
&lt;/rdf:RDF&gt;
--&gt;
        </description>
      
      
    
    
    
    <category>Experience</category>
    
    <category>Swing</category>
    
    <comments>http://www.stephan-schwab.com/2007/01/24/1169661885477.html#comments</comments>
    <guid isPermaLink="true">http://www.stephan-schwab.com/2007/01/24/1169661885477.html</guid>
    <pubDate>Wed, 24 Jan 2007 18:04:45 GMT</pubDate>
  </item>
  
  <item>
    <title>[TSE] Meeting Requirements through Acceptance and Stress Testing</title>
    <link>http://www.stephan-schwab.com/2006/12/10/1165759065686.html</link>
    
      
        <description>
          &lt;p&gt;My fellow German developer Eberhard Wolff is speaking this morning about acceptance and stress testing to meet requirements.&lt;/p&gt;

&lt;p&gt;As an introduction he&#039;s wrapping up what Spring provides in the org.springframework.test package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Acceptance Tests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we are getting into Acceptance Tests. You use them to find errors in the implementation of business requirements or use cases. One can see them as formalized requirements. Unfortunately many times they are done manually and after the whole system has been developed. &lt;a href=&#034;http://fitnesse.org/&#034;&gt;Fit/FitNesse&lt;/a&gt; is a tool for acceptance tests. The customer and the developer should write the acceptance tests together - so does XP say. Fit/FitNesse uses HTML as input format. Test data and expected results are provided as HTML tables. You need to write a simple class as a wrapper for business logic, which can be injected using @Configurable. This class is then used to pass data into the test and check the results.&lt;/p&gt;

&lt;p&gt;Eberhard is working on a general &lt;a href=&#034;https://spring-fitnesse.dev.java.net/&#034;&gt;Fit Exporter for Spring&lt;/a&gt;. It&#039;s currently Alpha code.&lt;/p&gt;

&lt;p&gt;The SpringActionFixture can be used to test actions that are usually performed in a GUI. You specify input data and actions - e.g. press add button - and then look for results. In the HTML input file you use the expression &#034;press&#034; to call a method. So the UI stuff is left out, but the method that normally be called by the UI is now being called by FitNesse.&lt;/p&gt;

&lt;p&gt;One question from the audience is whether you can run Fit/Fitnesse as part of a Maven build. As it&#039;s a command line tool that should be no problem.&lt;/p&gt;

&lt;p&gt;Fit uses HTML &lt;strong&gt;files&lt;/strong&gt; as input. Fitnesse uses Wiki pages. Triggered by a question from the audience Eberhard opinions that probably Word documents that get exported to HTML are the best solution to get business people to provide test data and rules.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Performance Tests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&#034;http://jakarta.apache.org/jmeter/&#034;&gt;JMeter&lt;/a&gt; is a good tool to performance test web based applications. JMeter creates a large number of requests, but how do you measure the performance in the whole system. You want to measure each part of the system. Using a regular profiler for Java would not be sufficient for the purpose of performance tests, because it only focuses on the Java code itself. &lt;a href=&#034;http://jamonapi.sourceforge.net/&#034;&gt;JAMon&lt;/a&gt; is a monitoring framework, which offers a Spring interceptor. For web application you configure a filter in web.xml. The JAMon filter measures HTTP request/response. JAMon profiles method calls using AOP. JAMon can be used as well to profile other parts of the system by simply declaring other AOP aspects, e.g. you could use it to profile SQL queries.&lt;/p&gt;

&lt;p&gt;One could use JAMon &lt;em&gt;even in production&lt;/em&gt; as the overhead is very little. It can use exiting Pointcuts and Spring AOP proxies. &lt;/p&gt;


&lt;!--
&lt;rdf:RDF xmlns:rdf=&#034;http://www.w3.org/1999/02/22-rdf-syntax-ns#&#034;
         xmlns:dc=&#034;http://purl.org/dc/elements/1.1/&#034;
         xmlns:trackback=&#034;http://madskills.com/public/xml/rss/module/trackback/&#034;&gt;
&lt;rdf:Description
    rdf:about=&#034;http://www.stephan-schwab.com/2006/12/10/1165759065686.html&#034;
    dc:identifier=&#034;http://www.stephan-schwab.com/2006/12/10/1165759065686.html&#034;
    dc:title=&#034;[TSE] Meeting Requirements through Acceptance and Stress Testing&#034;
    trackback:ping=&#034;http://www.stephan-schwab.com/addTrackBack.action?entry=1165759065686&amp;token=-7047655501769211191&#034; /&gt;
&lt;/rdf:RDF&gt;
--&gt;
        </description>
      
      
    
    
    
    <category>SpringFramework</category>
    
    <category>TDD</category>
    
    <comments>http://www.stephan-schwab.com/2006/12/10/1165759065686.html#comments</comments>
    <guid isPermaLink="true">http://www.stephan-schwab.com/2006/12/10/1165759065686.html</guid>
    <pubDate>Sun, 10 Dec 2006 13:57:45 GMT</pubDate>
  </item>
  
  </channel>
</rss>
