<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>byte bohemian &#187; Tapestry</title>
	<atom:link href="http://nicl.net/category/technology/java/tapestry/feed/" rel="self" type="application/rss+xml" />
	<link>http://nicl.net</link>
	<description></description>
	<lastBuildDate>Sat, 15 May 2010 20:51:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Virtual Pages with Tapestry 5</title>
		<link>http://nicl.net/2010/03/virtual-pages-with-tapestry-5/</link>
		<comments>http://nicl.net/2010/03/virtual-pages-with-tapestry-5/#comments</comments>
		<pubDate>Mon, 29 Mar 2010 15:13:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Tapestry]]></category>

		<guid isPermaLink="false">http://nicl.net/?p=62</guid>
		<description><![CDATA[Some of you may know Apache Tapestry 5 already. It's a very great framework for building web applications. In my opinion you'll won't find a framework this mature and production ready very easy. Tapestry 5 covers a wide variety of topics related to the creation of state-of-the-art web applications. So it's no surprise that Howard [...]]]></description>
			<content:encoded><![CDATA[<p>Some of you may know <a href="http://tapestry.apache.org/tapestry5/">Apache Tapestry 5</a> already. It's a very great framework for building web applications. In my opinion you'll won't find a framework this mature and production ready very easy. Tapestry 5 covers a wide variety of topics related to the creation of state-of-the-art web applications. So it's no surprise that <a href="http://tapestryjava.blogspot.com/">Howard Lewis Ship</a> the creator/founder of the Tapestry Project joined the ranks of the <a href="http://tapestryjava.blogspot.com/2010/03/java-champion.html>"Java Champions</a>. So congratulations from here <img src='http://nicl.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>But back on topic: One fundamental rule of the Tapestry 5 framework is, that each page has a corresponding class which contains all (java-) logic for this page. This mechanism works sole with convention over configuration and there is no exception to this rule. At least in standard Tapestry 5 ...<span id="more-62"></span>In the company I used to work we depended on Tapestry pretty heavy. We had created a couple very good solutions using this framework but we also had some challenges to meet. I guess they are pretty common to web based companies.</p>
<ul>
<li>We had to use a CMS system (<a href="http://www.magnolia-cms.com/home.html">Magnolia CMS</a> in this case) to enable the marketing and non-techical guys to maintain all the content they are creating.</li>
<li>We had to maintain a couple of so called landing pages. I guess most of the web guys know and hate them <img src='http://nicl.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  These pages are just an empty shell containing nothing more than some sightly different logos and graphics of partner companies. The also provide a nice URL in most cases like: <code>http://www.mycomany.com/tv</code>, <code>/mobile</code> or <code>/unameit</code>. Unfortunately some of these landing pages hade some minor dynamical stuff on it. </li>
<li>Most of this landing pages require that you are storing some (voucher) code into your application to modifier your check-out process a little bit.</li>
</ul>
<p>So, now you have a couple of pages, of which you don't know when they appear - and you really don't want to know, because coordinating the timing with the marketing guys is always a mess <img src='http://nicl.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  -, with very similar structure and functionality. As a matter of fact this case should be a text book example for component reuse. but this is a case where Tapestry 5 and the convention-over-configuration thing works against us.</p>
<p>So what do you have to do in classic Tapestry 5? Jepp you allready guessed it, you have to create a page class for each of this landing pages. Okay thanks to inheritance this class will be de-facto empty. But it is annoying to create this class. You'll have to create a version of your web application, do a QA cycle (if you want to play it right), make a deployment. So you have a lots of communication with a bunch of other departments. In a world with perfect processes you might to accept this, but I guess most of the guys out there know the situation where a junior business consultant guy stands right at your desk telling you of the nation wide TV campaign that launches tomorrow and that needs this new landing page. Maybe some of you already tried to say the 'n*' word <img src='http://nicl.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>A early solution was to introduce some Meta templates in out CMS. They were some simple HTML comments which where evaluated by a service in our web application and re-assembled via simple Tapestry pages and components. This worked quite well but brought us a bunch of issues - like template caching, dynamic contents in templates, etc. -  which are already solved in Tapestry. The solution was also pretty limited in when dynamical and statical parts should be joined together. So I took some time to evaluate a different approach:</p>
<p><i>My first question was:</i> Is it possible to make tapestry work with pages that do not have a class as backup?</p>
<p>I never tried this, because I figured out, that I actually didn't want to do this, and as a matter of fact, it makes the whole exercise a lot easier. What I did was to make Tapestry use a default class for pages tapestry does not know. I call this pages <i>virtual</i> pages. I'll guess you always have some minor data shared between all virtual pages, so you create on page class that Tapestry may use to serve <i>virtual</i> pages.</p>
<p>So how you serve <i>virtual</i> pages with Tapestry 5.1? I was surprised who simple it was (after some month of the wrong track). So this is, how <i>virtual</i> pages may work:</p>
<ol>
<li><b>Check if the page exists</b><br />A good place to do this is the <code>ComponentClassResolver</code> with its <code>isPageName(..)</code> method. I created a <a href="http://github.com/niclasmeier/tapestry-virtual-pages/blob/master/src/main/java/net/nicl/virtualpages/services/DecoratedComponentClassResolver.java">special implementation</a> of the  <code>ComponentClassResolver</code> which decorates the Tapestry original.</li>
<li><b>Mark the request</b><br />Mark the request as request to a virtual page. I used a <a href="http://github.com/niclasmeier/tapestry-virtual-pages/blob/master/src/main/java/net/nicl/virtualpages/services/VirtualPageData.java">dedicated service</a> with thread scope for this. You also may compute and store some data in this service.</li>
<li><b>Alter page class loading</b><br />Adapt the loading of the component classes to load (and attach) the default class to the page. <a href="http://github.com/niclasmeier/tapestry-virtual-pages/blob/master/src/main/java/net/nicl/virtualpages/services/DecoratedComponentInstantiatorSource.java">Another decorated service</a> does the work here too.</li>
</ol>
<p>And voila you can deliver content for pages with no backing class, astonishing isn't it? You may look at the <a href="http://github.com/niclasmeier/tapestry-virtual-pages">small prototype/example project at github</a> and you'll realize how simple the solution is. The prototype is a slightly modified Tapestry 5 archetype project which will serve the URL <code>http://localhost:8080/About</code> as virtual page.</p>
<p>So far, so good! But now some last words if this is a good solution at all. First I want to mention that we had an integration ready for the architecture we used, but it went - for several reasons, most non-technical - never productive.</p>
<p>Let's talk about some oddities first:</p>
<ul>
<li>The URLs to address the pages do not fully comply the Tapestry behaviour. In Tapstry it does not matter if you request <code>/About</code> or <code>/about</code>, but the prototype only supports a simple template resolution.</li>
<li>Some Tapestry components/mechanisms won't work properly. Tapestry uses classes to compute links to pages. Always when this mechanism is used, you'll may get problems. Components like <code>&lt;t:pagelink ...&gt;</code> may not work properly because you do not have a class. Keep this in mind.</li>
<li>Unexpected Runtime and memory behaviour. Tapestry is a very stable and production ready framework. But we are misusing it a little bit. Keep a close eye on memory consumption because every HTML page will now be a tapestry template and will be cached in the memory of your virtual machine. Some of some infrastructure components are also optimized for a (relatively) small amount of page instances.</li>
</ul>
<p><i>Why do I want to use Tapstry this way?</i> The first advantage is the simple creation of new pages. You'll create the <code>.tml</code> file and you are done. We used it with a CMS in the background and with some specialized CMS templates the marketing guys where able to create a bunch of landing pages without troubling an IT guy. In addition to the standard page we used some components which contained the major functions of the pages. So we were able to create instance of this virtual pages which behaved sightly different because we passed some parameters using the <code>TML</code> of the virtual page.</p>
<p><i>Why does not offer Tapestry this mechanism?</i> First: It's a prototype! If you take a closer look you will se how limited it is. This topic as hole comes across the tapestry mailing list regularly and there are lots of pro's and con's. I don't want to discuss any of them in this blog post. But I agree with the Tapestry guys not to introduce it into the core framework.</p>
<p>At the time I was evaluating this prototype I had some very good reasons to do so and only a few are mentioned here. But if you have a big amount of content it is seldom a good idea to generate templates which are interpreted by a dynamic framework. No matter if you use JSP, Tapestry or even PHP.</p>
<p>I hope you'll enjoyed reading this blog post. I learned much about Tapestry 5 preparing it and evaluating my idea. If you have questions of any kind feel free to contact me <img src='http://nicl.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://nicl.net/2010/03/virtual-pages-with-tapestry-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Creating dynamic PDF, or another reason to like Apache Tapestry</title>
		<link>http://nicl.net/2009/08/creating-dynamic-pdf-or-another-reason-to-like-apache-tapestry/</link>
		<comments>http://nicl.net/2009/08/creating-dynamic-pdf-or-another-reason-to-like-apache-tapestry/#comments</comments>
		<pubDate>Fri, 21 Aug 2009 20:40:29 +0000</pubDate>
		<dc:creator>niclas</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Tapestry]]></category>
		<category><![CDATA[The Flying Saucer Project]]></category>

		<guid isPermaLink="false">http://nicl.net/?p=45</guid>
		<description><![CDATA[I am using Apache Tapestry 5 on my job since February of this year. Today was another of these days when I am pretty sure why it is a good idea to use this framework.
Last week we started the new sprint for the scoyo feature release which will be release on end of September. A [...]]]></description>
			<content:encoded><![CDATA[<p>I am using <a href="http://tapestry.apache.org/">Apache Tapestry 5</a> on my job since February of this year. Today was another of these days when I am pretty sure why it is a good idea to use this framework.<br />
<span id="more-45"></span>Last week we started the new sprint for the <a href="http://www-de.scoyo.com">scoyo</a> feature release which will be release on end of September. A website feature may require the dynamic creation of PDF files so I evaluated the possibilities of the <a href="https://xhtmlrenderer.dev.java.net/">"The Flying Saucer Project"</a>, a XML/XHTML/CSS 2.1 rendering engine.</p>
<p>I already made some experiences with the <a href="https://xhtmlrenderer.dev.java.net/">Flying Saucer</a> on another job and it is still a very nice framework for PDF creation. For me, a major advantage of <a href="https://xhtmlrenderer.dev.java.net/">"The Flying Saucer"</a> over other PDF creation frameworks, like XSLT and <a href="http://xmlgraphics.apache.org/fop/">FOP</a>, in the Web world is the homogenous technology mix.</p>
<p><a href="https://xhtmlrenderer.dev.java.net/">"The Flying Saucer Project"</a> create PDF from XML/XHTML pages using CSS style sheets. All technologies known to the web designer that gives your web site this pretty look. I guess it's okay when you say, that XSLT and <a href="http://xmlgraphics.apache.org/fop/">FOP</a> is the more powerful technology mix, but styling pages on this technology mix is not a simple task to do.</p>
<p>So back to the initial topic: A basic ingredient which is needed to create PDFs with the <a href="https://xhtmlrenderer.dev.java.net/">"The Flying Saucer Project"</a> is some XHTML. In our project at <a href="http://www-de.scoyo.com">scoyo</a> we wanted to use <a href="http://tapestry.apache.org/">Apache Tapestry</a> to create this XHTML.</p>
<p>After taking a closer look to the <a href="http://tapestry.apache.org/">Apache Tapestry</a> rendering pipeline I found out, that the <code>PageResponseRenderer</code> is the perfect place to hook up the PDF creation into the rendering process. On the one hand the <code>PageResponseRenderer</code> uses a <code>MarkupWriter</code> to create the (X)HTML content from the current <code>Page</code> instance. On the other hand the <code>PageResponseRenderer</code> is responsible for writing the generated content into the server response.</p>
<p>Using the <a href="http://tapestry.apache.org/">Apache Tapestry</a> own IoC mechanism it's quite an easy task to decorate the <a href="http://tapestry.apache.org/">Tapestry</a>  <code>PageResponseRenderer</code> implementation. It's a beautiful mechanism when you understood how it works. Okay I guess using the 5.1 version of tapestry it would be better to advice the <code>renderPageResponse(...)</code> method, but I had not enough time to get familiar with it yet.</p>
<p>One real big plus on <a href="http://tapestry.apache.org/">Apache Tapestry</a> is the implementation. Every function is well encapsulated into separate services. And the service implementing classes are very short and almost always on consistent level of abstraction. So you easily understand how a service works and you are able to copy and extend the service functions. So I extended <code>PageResponseRenderer</code> to determine if a page creates XHTML output which should be transformed to PDF. If no PDF should be created my <code>PageResponseRenderer</code> simply delegates to the original Tapestry instance.</p>
<p>When the page wants to create PDF my <code>PageResponseRenderer</code> buffers the created content and redirects it into the <code>ITextRenderer</code> of the a href="https://xhtmlrenderer.dev.java.net/">"The Flying Saucer". Okay this sounds more nice, than it actually is. The content is stored into a <code>ByteArrayOutputStream</code> and re-parsed by the standard JDK XML parser for further processing by the <code>ITextRenderer</code>. But I guess the we will live with the performance impact until it gets a real issue.</p>
<p>So long explanation short story. The whole thing worked out great! It took me like two to three hours to implement a first prototype. In out web application. This also includes the embedding of custom fonts into the PDF and a nice discovery of pages to render into PDF, via custom annotations using the component model meta-data facilities and a <code>ClassTransformationWorker</code>.</p>
<p>Web development can be so easy when you are using <a href="http://tapestry.apache.org/">Apache Tapestry</a>. On an earlier project we used a similar architacture with JSP and the <a href="https://xhtmlrenderer.dev.java.net/">"The Flying Saucer"</a>. I guess it took us ten times the effort to establish an equal infrastructure using JSF and the Java Servlet API ...</p>
]]></content:encoded>
			<wfw:commentRss>http://nicl.net/2009/08/creating-dynamic-pdf-or-another-reason-to-like-apache-tapestry/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>New jaev Release</title>
		<link>http://nicl.net/2009/07/new-jaev-release/</link>
		<comments>http://nicl.net/2009/07/new-jaev-release/#comments</comments>
		<pubDate>Sun, 26 Jul 2009 18:42:16 +0000</pubDate>
		<dc:creator>niclas</dc:creator>
				<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tapestry]]></category>
		<category><![CDATA[google wave]]></category>
		<category><![CDATA[jaev]]></category>

		<guid isPermaLink="false">http://nicl.net/?p=41</guid>
		<description><![CDATA[Today I made a new release of the jaev Framework for "advanced" e-mail validation. After being in productive use for quite some month now it was about time to offer a bugfix release. Some issues with domains containing no MX but an A DNS record where resolved. E-mail belonging to this kind of domains will [...]]]></description>
			<content:encoded><![CDATA[<p>Today I made a new release of the <a href="http://jaev.googlecode.com">jaev Framework</a> for "advanced" e-mail validation. After being in productive use for quite some month now it was about time to offer a bugfix release. Some issues with domains containing no MX but an A DNS record where resolved. E-mail belonging to this kind of domains will now be accepted. An issue with a file handle leak due to unclosed UDP connections during the DNS lookup was also fixed.</p>
<p>Due to the generosity of Google I got a nice <a href="http://wave.google.com/">Google wave</a> test account. Now I am looking desperately to some spare time to evaluate the integration of <a href="http://jaev.googlecode.com">jaev</a> to the <a href="http://wave.google.com/">wave</a>. One idea is to expand the validation to wave addresses via the <a href="http://www.waveprotocol.org/">wave protocol</a>. Maybe an online validation as wave bot is another exciting idea.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicl.net/2009/07/new-jaev-release/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jaev 1.0 released</title>
		<link>http://nicl.net/2009/05/jaev-10-released/</link>
		<comments>http://nicl.net/2009/05/jaev-10-released/#comments</comments>
		<pubDate>Sat, 30 May 2009 10:31:11 +0000</pubDate>
		<dc:creator>niclas</dc:creator>
				<category><![CDATA[Adobe Flex]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tapestry]]></category>
		<category><![CDATA[jaev]]></category>

		<guid isPermaLink="false">http://87.106.3.237/?p=35</guid>
		<description><![CDATA[After some weeks the third release candidate of the jaev was the final one yesterday.
The jaev framework is in productional use at least one installation and no major problems where filed so far. I'm keeping my fingers crossed  
I am working already on some new features:

Caching negative responses of mail serversWhen a mail server [...]]]></description>
			<content:encoded><![CDATA[<p>After some weeks the third release candidate of the <a href="http://code.google.com/p/jaev/">jaev</a> was the final one yesterday.</p>
<p>The <a href="http://code.google.com/p/jaev/">jaev</a> framework is in productional use at least one installation and no major problems where filed so far. I'm keeping my fingers crossed <img src='http://nicl.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>I am working already on some new features:</p>
<ul>
<li>Caching negative responses of mail servers<br />When a mail server refuses communication due to suspected spam, the result will be cached to reduce network traffic.</li>
<li>Suggest e-mail addresses<br />When the validation fails suggest a list e-mail addresses. This algorithm may use the previous request and a default list of domains to compute some suggestions.</li>
</ul>
<p>If you have any good ideas, file them on the <a href="http://code.google.com/p/jaev/issues/list">issue tracking system</a> or the <a href="http://groups.google.com/group/jaev-users/topics">google group</a>.</p>
<p>Maybe I am applying for a <a href="http://wave.google.com">google wave</a> developer sandbox access to provide a <a href="http://wave.google.com">google wave</a> robot for online e-mail suggestion. Bah, that sounds like some work <img src='http://nicl.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://nicl.net/2009/05/jaev-10-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting closer to 1.0</title>
		<link>http://nicl.net/2009/03/getting-closer-to-10/</link>
		<comments>http://nicl.net/2009/03/getting-closer-to-10/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 18:00:33 +0000</pubDate>
		<dc:creator>niclas</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Tapestry]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[jaev]]></category>

		<guid isPermaLink="false">http://nicl.net/2009/03/14/getting-closer-to-10/</guid>
		<description><![CDATA[This afternoon I spend some time to take the jaev Framework closer to the 1.0 final release.

This afternoon I spend some time to take the jaev Framework closer to the 1.0 final release.
The second release candidate was built this afternoon. It contains some fixes and some improvements suggested by PMD and Findbugs. Another major focus [...]]]></description>
			<content:encoded><![CDATA[<p>This afternoon I spend some time to take the <a href="http://jaev.googlecode.com">jaev</a> Framework closer to the 1.0 final release.<br />
<span id="more-21"></span><br />
This afternoon I spend some time to take the <a href="http://jaev.googlecode.com">jaev</a> Framework closer to the 1.0 final release.</p>
<p>The second release candidate was built this afternoon. It contains some fixes and some improvements suggested by <a href="http://pmd.sourceforge.net/">PMD</a> and <a href="http://findbugs.sourceforge.net">Findbugs</a>. Another major focus was to improve the performance of <a href="http://jaev.googlecode.com">jaev</a>. This was achieved in reducing the number DNS lookups by introducing a cache for DNS MX record resolution.</p>
<p>This may lead to another nifty feature in the next release candidate, final or 1.1 release. I am planning to introduce a domain suggest function. This may be achieved by using a fix/initial suggestion list and the queries against the DNS lookup cache. If everything works out well the i.e. the Tapestry 5 example may offer a suggest function for e-mail addresses.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicl.net/2009/03/getting-closer-to-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The name is jaev &#8230;</title>
		<link>http://nicl.net/2009/02/the-name-is-jaev/</link>
		<comments>http://nicl.net/2009/02/the-name-is-jaev/#comments</comments>
		<pubDate>Mon, 09 Feb 2009 21:52:38 +0000</pubDate>
		<dc:creator>niclas</dc:creator>
				<category><![CDATA[Adobe Flex]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Tapestry]]></category>
		<category><![CDATA[jaev]]></category>

		<guid isPermaLink="false">http://nicl.net/2009/02/09/the-name-is-jaev/</guid>
		<description><![CDATA[The name of who/what is jaev? The jaev framework is my first open source project! Jepp, I joined the community and giving something back after years of using the frameworks of other people.
What does jaev do? The name jaev is the abbreviation for java (advanced) email validation. So the framework does validate e-mails. Sounds quite [...]]]></description>
			<content:encoded><![CDATA[<p>The name of who/what is jaev? The jaev framework is my first open source project! Jepp, I joined the community and giving something back after years of using the frameworks of other people.</p>
<p>What does jaev do? The name jaev is the abbreviation for <i>ja</i>va (<i>a</i>dvanced) <i>e</i>mail <i>v</i>alidation. So the framework does validate e-mails. Sounds quite boring, isn't it? Of course not!<br />
<span id="more-19"></span><br />
The name of who/what is <a href="http://code.google.com/p/jaev/">jaev</a>? The <a href="http://code.google.com/p/jaev/">jaev framework</a> is my first open source project! Jepp, I joined the community and giving something back after years of using the frameworks of other people.</p>
<p>What does jaev do? The name <a href="http://code.google.com/p/jaev/">jaev</a> is the abbreviation for <i>ja</i>va (<i>a</i>dvanced) <i>e</i>mail <i>v</i>alidation. So the framework does validate e-mails. Sounds quite boring, isn't it? Of course not! There are some quite good tools for e-mail validation like the one in the <a href="http://commons.apache.org/validator/">Apache commons validator</a> project (I <i>"borrowed"</i> some test cases there). But the e-mail validation in java was quite shallow. If you want to have a more advanced validation, i.e. of the domain, you'll had to do it yourself. The <a href="http://code.google.com/p/jaev/">jaev framework</a> tries to fill this gap.</p>
<p>It provides facilities to validate the syntax of an e-mail address with including addresses with names like <code>Niclas Meier &lt;niclas.meier@example.com&gt;</code>  (I confess the handling of comments in e-mail addresses has still some flaws, but it's not so important I guess). This is obligatory but the <a href="http://code.google.com/p/jaev/">jaev framework</a> offers quite more.</p>
<p>With the <a href="http://code.google.com/p/jaev/">jaev framework</a> you'll may check the domain of the e-mail address. The framework uses a local (or server) copy of the IANA top level domain database (<a href="http://data.iana.org/TLD/tlds-alpha-by-domain.txt">http://data.iana.org/TLD/tlds-alpha-by-domain.txt</a>) to validate the top level domain. If the top level domain is okay  the DNS database will be queries if the domain exists and has <code>MX</code> entries. If a domain has no <code>MX</code> entries you'll have to assume that you will could not relay an e-mail message to the e-mail address. The mail server uses the same mechanism.</p>
<p>A very important feature of the <a href="http://code.google.com/p/jaev/">jaev framework</a> is: You have the choice! You are receiving a <code>Result</code> object as outcome of the validation process. The <code>Result</code> contains a code, which specifies the details, and a validity level which specifies  the level of validity of an e-mail address. I.e. <code>SYNTAX</code> suggests that an e-mail address is syntactically valid but the domain and account may be invalid. The maximum validity is <code>ACCESSIBLE</code>. With <code>ACCESSIBLE</code> validity the <a href="http://code.google.com/p/jaev/">jaev framework</a> was able to verify the existence and accessibility of the e-mail address on the <a href="http://de.wikipedia.org/wiki/Mail_Transfer_Agent">MTA</a> of the e-mail domain.</p>
<p>This is the last big feature of the <a href="http://code.google.com/p/jaev/">jaev framework</a>. The framework can connect to the <a href="http://de.wikipedia.org/wiki/Mail_Transfer_Agent">MTA</a> specified in the MX entry of the domain and tries to send an e-mail to the e-mail address. If the mail transfer can be initiated the framework will abort the process, no mail will be send, but we can assure that the e-mail account exits.</p>
<p>Around the three step validation mechanism the framework offers quite simple and extendible construction and configuration mechanisms, examples for JSF, Tapestry 5 and Flex &amp; BlazeD and different acceptance strategies. Timeouts may be applied on different levels and operations, so you can assure that you'll get a <code>Result</code> in a defined amount of time.</p>
<p>I think this is quite a handy package. And I spent lots of my spare time the last four weeks to bring this to life. Maybe someone out there agrees with me and uses the framework in his application.</p>
<p>If you encounter some problems or you would like to contribute/request some features you may post them to the <a href="http://groups.google.com/group/jaev-users?pli=1">google group</a> or to the <a href="http://code.google.com/p/jaev/issues/list">issue management system</a>. Maybe there is someone out there who is firm in <a href="http://www.antlr.org/">ANTLR</a> which the jeav framework uses for e-mail parsing.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicl.net/2009/02/the-name-is-jaev/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excited about Tapestry 5.1</title>
		<link>http://nicl.net/2009/01/excited-about-tapestry-51/</link>
		<comments>http://nicl.net/2009/01/excited-about-tapestry-51/#comments</comments>
		<pubDate>Sun, 11 Jan 2009 21:40:16 +0000</pubDate>
		<dc:creator>niclas</dc:creator>
				<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Tapestry]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://nicl.net/2009/01/11/excited-about-tapestry-51/</guid>
		<description><![CDATA[One of the blogs I am reading on a regular basis is the Tapestry Central blog from Howard Lewis Ship the founder and lead developer of the Tapestry framework. It alreaded provided some really nice ideas and introduced me into some really interesting topics.
So this weekend I read the article about some new Features of [...]]]></description>
			<content:encoded><![CDATA[<p>One of the blogs I am reading on a regular basis is the <a href="http://tapestryjava.blogspot.com/">Tapestry Central blog</a> from <a href="http://www.blogger.com/profile/04486596490758986709">Howard Lewis Ship</a> the founder and lead developer of the <a href="http://tapestry.apache.org/">Tapestry</a> framework. It alreaded provided some really nice ideas and introduced me into some really interesting topics.</p>
<p>So this weekend I read the article about some new Features of the 5.1 Version of the <a href="http://tapestry.apache.org/">Tapestry</a> framework ...<br />
<span id="more-17"></span><br />
One of the blogs I am reading on a regular basis is the <a href="http://tapestryjava.blogspot.com/">Tapestry Central blog</a> from <a href="http://www.blogger.com/profile/04486596490758986709">Howard Lewis Ship</a> the founder and lead developer of the <a href="http://tapestry.apache.org/">Tapestry</a> framework. It already provided some really nice ideas and introduced me into some really interesting topics.</p>
<p>So this weekend I read the article about some new Features of the 5.1 Version of the <a href="http://tapestry.apache.org/">Tapestry</a> framework. And I was really exited to read about the plans to reduce/minimize the traffic over the wire. I am studying this topic for quite a while, since I stumbled across it during a project. The trigger was the <a href="http://developer.yahoo.com/performance/rules.html">Best practices article</a> from the Yahoo developer team.</p>
<p>Since then I was using different approaches and tools to improve the performance of the websites of my clients. One very useful tool is <a href="https://jawr.dev.java.net/">JAWR</a> a Javascript and CSS bundling and compression tool. <a href="https://jawr.dev.java.net/">JAWR</a> offers facilities to join multiple Javascript or CSS files in bundles. Each bundle will be delivered compressed (if possible), in addition very strong cache HTTP headers will be set to the HTTP response, so that the internet infrastructure may cache these files. So the traffic the originating server will be reduced. To prevent nasty caching problems the <a href="https://jawr.dev.java.net/">JAWR</a> framework provides facilities to generate URLs to these bundles which contain a version information, so when the bundle changes, a new URL will be generated.</p>
<p>The very exciting thing about the planned Features in <a href="http://tapestry.apache.org/">Tapestry</a> 5.1 is, that Tapestry is the first content generating web framework which will provide out the box facilities for this kind of issues.<br />
A great weakness of the JSP and JSF approaches to generate content is, that there is no fast/cheap way to determine a last modified date for a page or a component. So the application can't use the "If-Modified-Since" and "Not Modified" (HTTP status 304) mechanism to provide a lightweight answer for requested resources which have not changed. Maybe <a href="http://www.blogger.com/profile/04486596490758986709">Howard Lewis Ship</a> is able to provide this with his <a href="http://tapestry.apache.org/">Tapestry</a> framework. This would be a great performance boost for any kind of web application.</p>
<p>May very dynamic application don't address the content delivery issues at all. Its quite sad to see, but on the other hand side it's good to see that some frameworks are beginning to address this kind of features.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicl.net/2009/01/excited-about-tapestry-51/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lazy weekend</title>
		<link>http://nicl.net/2008/05/lazy-weekend/</link>
		<comments>http://nicl.net/2008/05/lazy-weekend/#comments</comments>
		<pubDate>Sun, 25 May 2008 20:16:17 +0000</pubDate>
		<dc:creator>niclas</dc:creator>
				<category><![CDATA[Privat]]></category>
		<category><![CDATA[Tapestry]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://nicl.net/2008/05/25/lazy-weekend/</guid>
		<description><![CDATA[This weekend was a lazy one. My girlfriend visited me, so I had not much time playing round with all of this software stuff. Another reason for my laziness was Guitar Hero 3 - Legends of Rock. I was first introduced to this game by a friend last saturday. Instead of playing cards we played [...]]]></description>
			<content:encoded><![CDATA[<p>This weekend was a lazy one. My girlfriend visited me, so I had not much time playing round with all of this software stuff. Another reason for my laziness was <a href="http://www.amazon.de/Guitar-Hero-Legends-Bundle-MAC-DVD/dp/B0012YSYTM/ref=sr_1_15?ie=UTF8&#038;s=videogames&#038;qid=1211745245&#038;sr=8-15" target="_blank">Guitar Hero 3 - Legends of Rock</a>. I was first introduced to this game by a friend last saturday. Instead of playing cards we played a little guitar hero on Xbox 360. Next morning I decided to get my own copy of this came. Fortunately the game is available for Mac too so I hadn't not to by a Xbox 360 or PS3.</p>
<p>But I already spent a little time on playing around with <a href="http://tapestry.apache.org/tapestry5/" target="_blank">Tapestry 5</a> on my little project. Quit a nice piece of software, but quite some hurdles to get into it. The trivial examples work quite well but I still have some troubles getting my ideas working. But I guess my years of experience are standing in my way now, because I am quite aware of what I am wanting to achieve ...</p>
<p>Maybe this week I have some time to investigate <a href="http://tapestry.apache.org/tapestry5/" target="_blank">Tapestry 5</a> more in detail.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicl.net/2008/05/lazy-weekend/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
