<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Snippetory</title>
	<atom:link href="https://snippetory.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://snippetory.wordpress.com</link>
	<description>...this time simple</description>
	<lastBuildDate>Thu, 20 Sep 2012 18:58:30 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='snippetory.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>https://secure.gravatar.com/blavatar/2956f9fbce8df515813eca1fddefffd7?s=96&#038;d=https%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Snippetory</title>
		<link>https://snippetory.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="https://snippetory.wordpress.com/osd.xml" title="Snippetory" />
	<atom:link rel='hub' href='https://snippetory.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Beanery &#8211; how to harden Snippetory&#8217;s type scheme</title>
		<link>https://snippetory.wordpress.com/2012/09/20/beanery/</link>
		<comments>https://snippetory.wordpress.com/2012/09/20/beanery/#comments</comments>
		<pubDate>Thu, 20 Sep 2012 18:52:51 +0000</pubDate>
		<dc:creator>sirrotn</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[Code generation]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Snippetory]]></category>
		<category><![CDATA[Template]]></category>

		<guid isPermaLink="false">http://snippetory.wordpress.com/?p=164</guid>
		<description><![CDATA[One of the things Snippetory doesn&#8217;t do better than most other engines is the string based coupling between the template and the Java code. Compared to untyped scripts it at least doesn&#8217;t break&#8230; <a class="read-more" href="https://snippetory.wordpress.com/2012/09/20/beanery/">Read More <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=snippetory.wordpress.com&#038;blog=28224326&#038;post=164&#038;subd=snippetory&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>One of the things Snippetory doesn&#8217;t do better than most other engines is the string based<br />
coupling between the template and the Java code. Compared to untyped scripts<br />
it at least doesn&#8217;t break only because the data model changes. It&#8217;s an explicit interface<br />
between the template and the binding code and will only break once this interface<br />
is changed. The small namespaces allow short and expressive names, minimizing the<br />
risk of mistakes as well as the effort to maintain a template. Nevertheless,<br />
tooling could definitely ease writing and maintaining the binding as well as the template<br />
code. Now, for sake of simplicity I&#8217;ll concentrate on writing and maintaining the binding<br />
code. The idea is to generate more bean-like interface classes. This could help in several<br />
areas:</p>
<ol>
<li>First and most important to write <code>setTitle(title)</code> is better<br />
supported by IDEs than <code>set("title", title)</code>. Same for <code>getRegion()</code><br />
instead of <code>get("region")</code>.</li>
<li>Further more such an interface could help to clarify the model-like nature of Snippetory<br />
template to people who are new to this concept. Most people seem to expect a template to<br />
be a script.</li>
<li>And, last but not least, the code gets more concise and a little bit more friendly to the eye.</li>
</ol>
<p>On the other hand using a tool for code generation has several challenges and draw<br />
backs. Changes in template code need to be reflected in the generated classes instantly.<br />
The generated code has to be available while packaging or debugging on systems<br />
where no templates are edited. And to support use of different template fragments<br />
by the same binding logic some kind of compatibility would be nice. (Of course, the<br />
mentioned fragments might be entire files, too.) Even tough each problem has its<br />
solution, setting up a project with Snipperory would get more complicated.<br />
However, the first step is to write a generator to get an idea how this could feel.<br />
I already did that and even though it&#8217;s not a really useful tool for now, I&#8217;d like to share it<br />
here.<br />
As always with Snippetory it consists of a template and some java code. And as the template<br />
might give you the better idea how it should work I&#8217;ll start with that.</p>
<p><pre class="brush: plain; wrap-lines: false;">
//Syntax:C_COMMENTS
package /*${package*/org.jproggy.snippetory.toolyng.beanery/*}*/;

import org.jproggy.snippetory.Template;
import org.jproggy.snippetory.spi.TemplateWrapper;
// ${ class

/*${i}*/public class /*${name case=&quot;camelizeUpper&quot;*/Bean/*}*/ extends TemplateWrapper {
/*${i}*/	public /*${name case=&quot;camelizeUpper&quot;*/Bean/*}*/ (Template template) {
/*${i}*/			super(template);
/*${i}*/	}
//${ region prefix=&quot;\n&quot;
/*${i}*/	public /*${name case=&quot;camelizeUpper&quot;*/Bean/*}*/ get/*${name case=&quot;camelizeUpper&quot;}*/() {
/*${i}*/		return new /*${name case=&quot;camelizeUpper&quot;*/Bean/*}*/(get(&quot;/*${name}*/&quot;));
/*${i}*/	}
// region }
//${ location prefix=&quot;\n&quot;
/*${i}*/	public /*${parent case=&quot;camelizeUpper&quot;*/Bean/*}*/ set/*${name case=&quot;camelizeUpper&quot;}*/(Object value) {
/*${i}*/		set(&quot;/*${name}*/&quot;, value);
/*${i}*/		return this;
/*${i}*/	}
// location }
/// use region with full line mark up to avoid additional line breaks
//${ classes
//   classes }
/*${i*/	/*i}*/}
// class }
</pre></p>
<p>The first thing you might have mentioned is the strange location simply call &#8216;i&#8217; at the beginning<br />
of each line. To understand this you have to be aware, the nested regions of the template are<br />
modelled by nested inner classes of the generated interface class. And &#8216;i` is the indentation<br />
of the inner classes. The case format normalizes the names to java naming convention. Of<br />
course, this simple approach will cause errors if names like &#8216;class&#8217; are used in the template.<br />
However, this shows the Snippetory Abstraction Layer in action. The different presentations<br />
of the same data are handled by the template, using formats. Thus presentation logic is separated<br />
from binding logic. (No, it can&#8217;t be repeated often enough <img src='https://s1.wp.com/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /><br />
Now, let&#8217;s look at the java side.</p>
<p><pre class="brush: java; wrap-lines: false;">
	public Template boil(Template subject, String packageName, String className) {
		target.set(&quot;package&quot;, packageName);
		Template classTpl = target.get(&quot;class&quot;);
		generate(classTpl, subject, className, &quot;&quot;);
		classTpl.render();
		return target;
	}
	protected void generate(Template classTpl, Template subject, String regionName, String i) {
		classTpl.set(&quot;name&quot;, regionName).set(&quot;i&quot;, i);
		for (String location : subject.names()) {
			classTpl.get(&quot;location&quot;).set(&quot;name&quot;, location).set(&quot;parent&quot;, regionName).set(&quot;i&quot;, i).render();
		}

		for (String region : subject.regionNames()) {
			classTpl.get(&quot;region&quot;).set(&quot;name&quot;, region).set(&quot;i&quot;, i).render();
			Template regionTpl = target.get(&quot;class&quot;);
			generate(regionTpl, subject.get(region), region, i + indent);
			regionTpl.render(classTpl, &quot;classes&quot;);
		}
	}
</pre></p>
<p>The binding code doesn&#8217;t provide too much special. The template tree is traversed recursively<br />
and there isn`t much data to bind.<br />
Each region responds with a get-method and a type, each location creates a set-method.<br />
Here you can have a look at the complete code for now. The main method allows building a start<br />
configuration in your IDE, So one can play arround with minor convenience.</p>
<p><pre class="brush: java; collapse: true; light: false; toolbar: true; wrap-lines: false;">
package org.jproggy.snippetory.toolyng.beanery;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

import org.jproggy.snippetory.Repo;
import org.jproggy.snippetory.Template;

public class Beanery {
	private Template target = Repo.readStream(getClass().getResourceAsStream(&quot;Bean.java&quot;)).parse();
	private String indent;

	public static void main(String[] args) throws IOException {
		if (args.length != 3) {
			System.out.println(&quot;Usage: templatePath targetDir qualifiedClassName&quot;);
			return;
		}
		new Beanery().generate(args[0], args[1], args[2]);
	}

	public Beanery() {
		indent = target.get(&quot;class&quot;,&quot;i&quot;).toString();
	}

	public void generate(String templatePath, String targetDir, String qualifiedClassName)
			throws IOException {
		Template template = Repo.readFile(templatePath).parse();
		String[] parts = qualifiedClassName.split(&quot;\\.&quot;);
		StringBuilder packageHelper = new StringBuilder();
		for (int i = 0; i &lt; parts.length - 1; i++) { 			if (i &gt; 0) packageHelper.append('.');
			packageHelper.append(parts[i]);
		}
		Template result = boil(template, packageHelper.toString(), parts[parts.length - 1]);
		File targetPath = new File(targetDir, qualifiedClassName.replace(&quot;.&quot;, &quot;/&quot;) + &quot;.java&quot;);
		targetPath.getParentFile().mkdirs();
		OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(targetPath), &quot;utf-8&quot;);
		result.render(out);
	}

	/**
	 * Build an Object-oriented Interface Layer. This layer consists of a get-method for each
	 * region, a class for each region used as return type of the getter, and a set method
	 * for each location. This construct allows convenient navigation of templates by
	 * the syntax completion feature available in most IDEs.
	 * @param subject The template that shall get the interface layer
	 * @param packageName
	 * @param className
	 * @return
	 */
	public Template boil(Template subject, String packageName, String className) {
		target.set(&quot;package&quot;, packageName);
		Template classTpl = target.get(&quot;class&quot;);
		generate(classTpl, subject, className, &quot;&quot;);
		classTpl.render();
		return target;
	}
	protected void generate(Template classTpl, Template subject, String regionName, String i) {
		classTpl.set(&quot;name&quot;, regionName).set(&quot;i&quot;, i);
		for (String location : subject.names()) {
			classTpl.get(&quot;location&quot;).set(&quot;name&quot;, location).set(&quot;parent&quot;, regionName).set(&quot;i&quot;, i).render();
		}

		for (String region : subject.regionNames()) {
			classTpl.get(&quot;region&quot;).set(&quot;name&quot;, region).set(&quot;i&quot;, i).render();
			Template regionTpl = target.get(&quot;class&quot;);
			generate(regionTpl, subject.get(region), region, i + indent);
			regionTpl.render(classTpl, &quot;classes&quot;);
		}
	}
}
</pre></p>
<p>Any comments and ideas are highly appreciated.</p>
<p>Bernd Ebertz</p>
<p><img style="border:0 none;" src="http://www.jproggy.de/piwik/piwik.php?idsite=4&amp;rec=1" alt="" />Head, found and chief technology evanelist of <a href="http://www.jproggy.org/snippetory/Syntax.html"><img style="position:relative;top:17px;" src="http://www.jproggy.org/img/jproggy_s.png" alt="jproggy.org" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/snippetory.wordpress.com/164/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/snippetory.wordpress.com/164/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=snippetory.wordpress.com&#038;blog=28224326&#038;post=164&#038;subd=snippetory&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://snippetory.wordpress.com/2012/09/20/beanery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/c569040c8dd6a7d3c8c9d4130c46b938?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sirrotn</media:title>
		</media:content>

		<media:content url="http://www.jproggy.de/piwik/piwik.php?idsite=4&#38;rec=1" medium="image" />

		<media:content url="http://www.jproggy.org/img/jproggy_s.png" medium="image">
			<media:title type="html">jproggy.org</media:title>
		</media:content>
	</item>
		<item>
		<title>Feature announcement for Snippetory 0.9.5</title>
		<link>https://snippetory.wordpress.com/2012/08/18/feature-announcement-for-snippetory-0-9-5/</link>
		<comments>https://snippetory.wordpress.com/2012/08/18/feature-announcement-for-snippetory-0-9-5/#comments</comments>
		<pubDate>Sat, 18 Aug 2012 12:25:14 +0000</pubDate>
		<dc:creator>sirrotn</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Abstraction layer]]></category>
		<category><![CDATA[Announcement]]></category>
		<category><![CDATA[Conditional Regions]]></category>
		<category><![CDATA[Fluyt]]></category>
		<category><![CDATA[Format]]></category>
		<category><![CDATA[Functionality]]></category>
		<category><![CDATA[Snippetory]]></category>
		<category><![CDATA[syntax]]></category>

		<guid isPermaLink="false">http://snippetory.wordpress.com/?p=137</guid>
		<description><![CDATA[Conditional Regions For a long time I have been thinking about conditional sections. I always thought to need a special syntax for this. This would have added complexity to the system and the&#8230; <a class="read-more" href="https://snippetory.wordpress.com/2012/08/18/feature-announcement-for-snippetory-0-9-5/">Read More <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=snippetory.wordpress.com&#038;blog=28224326&#038;post=137&#038;subd=snippetory&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<h1>Conditional Regions</h1>
<p>For a long time I have been thinking about conditional sections. I always thought to need a special syntax for this. This would have added complexity to the system and the directions I thought about it&#8217;d be hard to integrate into the XML_ALIKE syntax. But now that I made the name for locations optional I analyzed this for regions, too. And I figured out that t: is a valid tag name in XML. Thus I&#8217;ll simply make them nameless sections. I think this is pretty intuitive and doesn&#8217;t require a new syntactical construct. Like nameless locations need at least one attribute to make sense, nameless regions need at least one named(!) location (or region) to make sense. It will only be rendered if a none-null value is written to at least one of the enclosed named locations. It doesn&#8217;t matter if the set, append, or render method is used. Conditional regions are fully transparent on java site. Names defined in conditional regions appear exactly as they were defined outside.</p>
<p>Unfortunately, C comments syntax is not able to support conditional regions this way as it uses the name (that&#8217;s repeated at the end) to distinguish regions from ordinary locations. However, I consider removing C comments syntax anyway as it follows an approach contrary to the one of Fluyt.</p>
<p><pre class="brush: xml; highlight: [1,10,16]; wrap-lines: false;">&lt;/pre&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th&gt;{v: msg='product.name'}&lt;/th&gt;
&lt;th&gt;{v: msg='cart.count'}&lt;/th&gt;
&lt;th&gt;{v: msg='cart.price'}&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;{v:name}

&lt;hr /&gt;

{v:hint}&lt;/td&gt;
&lt;td&gt;{v:count}&lt;/td&gt;
&lt;td&gt;{v:price} {v:currency)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre&gt;

</pre></p>
<p>Of course conditional regions can be nested. In fact I expect this to be a typical use case. However, conditional regions serve another purpose: They can provide meta data that spans over several other locations, but not a complete named region. Adding another named region would affect binding logic, even though the issue is bound to technical or presentational purposes.</p>
<p><pre class="brush: xml; wrap-lines: false;">

{v: msg='product.name' strech='30'} {v: msg='cart.count' strech='9r'} {v: msg='cart.price' strech='16r`}
===========================================================

{v:name strech='30'               } {v:count strech='9r`            } {v:price} {v:currency)

{v:hint}

{v: default='' strech=`40r`                                         } ----------------
{v: msg='cart.sum' strech=`40r`                                     } {v:price} {v:currency)

</pre></p>
<h1>Formatting interface</h1>
<p>Another big topic is the re-design of the formatting. There is quite a number of features I want to add:</p>
<ul>
<li>Multiple attributes per Formatter.</li>
<li>Formatter should consume data, that is provided via set method calls</li>
<li>Better handling of status for formatters.</li>
<li>Control over encoding. Thus they need to know about the target encoding, and have to be able to define the encoding they return.</li>
<li>Distinction between the convention of a provided null value and no value at all</li>
<li>Multi-step conversion</li>
</ul>
<p>This will be done by providing an additional interface for most of the features and change the return<br />
type of the format method to Object.</p>
<h1>New syntax: <strong>Fluyt</strong></h1>
<p>Looking around on other engines I recognized a tendency to provide razor-like syntax. Razor is a template<br />
syntax for .net. It&#8217;s very brief and sparse with letters. Though, I thought it would be nice to have a<br />
syntax, that&#8217;s not that wordy and more consistent within itself (first) and to others (maybe I&#8217;ll build<br />
a complete syntax family upon Fluyt). Even though razor gave the idea, Fluyt is not really based on<br />
razor.</p>
<p>Fluyt will be reduced to a single syntactical element consisting on 3 segments. Each segment is optional,<br />
but there has to be at least one. The segments are:</p>
<ul>
<li>Name</li>
<li>Meta data (surrounded by round brackets)</li>
<li>A template region (I&#8217;m not yet really sure how to do it, but most likely curly brackets will be involved. At the moment I prefer single curly brackets with an additional dollar sign for closing. Between the bracket and the dollar the name can be repeated for optional sanity.</li>
</ul>
<p><pre class="brush: plain; light: true;">
$[&lt;name&gt;][([&lt;atribute&gt;='value'...])][{&lt;content area&gt;}[&lt;name&gt;]$]
</pre></p>
<p>In addition we have the 3-slash-comment from C_COMMENT syntax and the normal syntax selector.</p>
<p><pre class="brush: plain; wrap-lines: false;">
$cart{
$(msg='product.name' strech='30') $(msg='cart.count' strech='9r') $(msg='cart.price' strech='16r`)
===========================================================
$cart-entry{
/// we can define the length of the complete expression &quot;$price $currency&quot; with a continual region
$name(strech='30' ) $count(strech='9r` ) $(strech='16r'){$price $currency}$
${
$hint
}$
/// This name is optional. But it makes it simpler to follow the source.
}cart-entry$
$(default='' strech=`40r` ) ----------------
$(msg='cart.sum' strech=`40r` ) $(strech='16r){$price $currency}$
/// this regions closes without giving its name 'cart'
}$
</pre></p>
<p><img style="border:0 none;" src="http://www.jproggy.de/piwik/piwik.php?idsite=4&amp;rec=1" alt="" />More information on <a href="http://www.jproggy.org/snippetory/Syntax.html"><img style="position:relative;top:17px;" src="http://www.jproggy.org/img/jproggy_s.png" alt="jproggy.org" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/snippetory.wordpress.com/137/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/snippetory.wordpress.com/137/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=snippetory.wordpress.com&#038;blog=28224326&#038;post=137&#038;subd=snippetory&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://snippetory.wordpress.com/2012/08/18/feature-announcement-for-snippetory-0-9-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/c569040c8dd6a7d3c8c9d4130c46b938?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sirrotn</media:title>
		</media:content>

		<media:content url="http://www.jproggy.de/piwik/piwik.php?idsite=4&#38;rec=1" medium="image" />

		<media:content url="http://www.jproggy.org/img/jproggy_s.png" medium="image">
			<media:title type="html">jproggy.org</media:title>
		</media:content>
	</item>
		<item>
		<title>Maven Repository</title>
		<link>https://snippetory.wordpress.com/2011/12/17/maven-repository/</link>
		<comments>https://snippetory.wordpress.com/2011/12/17/maven-repository/#comments</comments>
		<pubDate>Sat, 17 Dec 2011 19:23:15 +0000</pubDate>
		<dc:creator>sirrotn</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Dependency Management]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Snippetory]]></category>
		<category><![CDATA[Template engine (web)]]></category>

		<guid isPermaLink="false">http://snippetory.wordpress.com/?p=115</guid>
		<description><![CDATA[Snippetory is now available in Maven Repository. This makes it easy to integrate it into projects. There&#8217;s a Maven Repository integration for almost any existing Java build tool. So, just add the dependency&#8230; <a class="read-more" href="https://snippetory.wordpress.com/2011/12/17/maven-repository/">Read More <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=snippetory.wordpress.com&#038;blog=28224326&#038;post=115&#038;subd=snippetory&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Snippetory is now available in <a href="http://search.maven.org/#artifactdetails|org.jproggy|snippetory|0.9.2|jar">Maven Repository</a>. This makes it easy to integrate it into projects. There&#8217;s a Maven Repository integration for almost any existing Java build tool. So, just add the dependency and dive into it:</p>
<p><pre class="brush: java;">
   Template test = Repo.parse(&quot;Hello {v:who}&quot;);
   test.set(&quot;who&quot;, world).render(System.out);
</pre></p>
<p>No additional dependencies, no problems just simplicity and fun.<br />
<img style="border:0 none;" src="http://www.jproggy.de/piwik/piwik.php?idsite=4&amp;rec=1" alt="" />Another simple example on <a href="http://www.jproggy.org/snippetory/VariantExample.html"><img style="position:relative;top:17px;" src="http://www.jproggy.org/img/jproggy_s.png" alt="jproggy.org" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/snippetory.wordpress.com/115/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/snippetory.wordpress.com/115/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=snippetory.wordpress.com&#038;blog=28224326&#038;post=115&#038;subd=snippetory&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://snippetory.wordpress.com/2011/12/17/maven-repository/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/c569040c8dd6a7d3c8c9d4130c46b938?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sirrotn</media:title>
		</media:content>

		<media:content url="http://www.jproggy.de/piwik/piwik.php?idsite=4&#38;rec=1" medium="image" />

		<media:content url="http://www.jproggy.org/img/jproggy_s.png" medium="image">
			<media:title type="html">jproggy.org</media:title>
		</media:content>
	</item>
		<item>
		<title>Separation and abstraction</title>
		<link>https://snippetory.wordpress.com/2011/11/27/separation/</link>
		<comments>https://snippetory.wordpress.com/2011/11/27/separation/#comments</comments>
		<pubDate>Sun, 27 Nov 2011 20:28:07 +0000</pubDate>
		<dc:creator>sirrotn</dc:creator>
				<category><![CDATA[Code Style]]></category>
		<category><![CDATA[Abstraction layer]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[JQuery]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://snippetory.wordpress.com/?p=82</guid>
		<description><![CDATA[Once having the template freed from logic, new risks appear. Template code and technical issues of the output format might enter the logic site. This reduces the value of the separation, even it&#8230; <a class="read-more" href="https://snippetory.wordpress.com/2011/11/27/separation/">Read More <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=snippetory.wordpress.com&#038;blog=28224326&#038;post=82&#038;subd=snippetory&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Once having the template freed from logic, new risks appear. Template code and technical issues of the output format might enter the logic site. This reduces the value of the separation, even it not fully destroys it. Especially re-usability is hurt. Though, a strong abstraction layer should be used to empower the separation.</p>
<p>Snippetory ships with a powerful and extensible abstraction layer. A central element is the encoding. The encoding is designed to handle technical issues of a specific output format when different encodings are integrated within each other. If we take HTML as base an URL might be integrated as is, plain text needs some characters to be escaped, and wiki will need some complicated thing&#8230;</p>
<p>Let&#8217;s look at some examples to get an idea how this works. Once I implemented a date picker based on jQuery. First I simply initialized it by putting a formatted and localized date into the input field like</p>
<p><pre class="brush: xml;">
&lt;input type=&quot;text&quot; name=&quot;start&quot; value=&quot;{v:start date='medium'}&quot; /&gt;
</pre></p>
<p>This worked fine for German and English, however Italian failed because java makes quiet different assumptions how the preferred format in the different languages look like, while jQuery thinks another way. Though, I needed a language agnostic way to hand over the parameter:</p>
<p><pre class="brush: jscript;">
$( &quot;.selector&quot; ).datepicker({ defaultDate: {v:preset date='JS_JS' });
</pre></p>
<p>Though, we can see, that formatting is sometimes in the responsibility of the template, though it should be possible to handle it there. However, it is part of the interface to the controller, which has to parse it. Though, the responsibility is not clear and has to be clarified wisely.</p>
<p><img style="border:0 none;" src="http://www.jproggy.de/piwik/piwik.php?idsite=4&amp;rec=1" alt="" />See you on <a href="http://www.jproggy.org/thoughts/oo_templates.html"><img style="position:relative;top:17px;" src="http://www.jproggy.org/img/jproggy_s.png" alt="jproggy.org" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/snippetory.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/snippetory.wordpress.com/82/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=snippetory.wordpress.com&#038;blog=28224326&#038;post=82&#038;subd=snippetory&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://snippetory.wordpress.com/2011/11/27/separation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/c569040c8dd6a7d3c8c9d4130c46b938?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sirrotn</media:title>
		</media:content>

		<media:content url="http://www.jproggy.de/piwik/piwik.php?idsite=4&#38;rec=1" medium="image" />

		<media:content url="http://www.jproggy.org/img/jproggy_s.png" medium="image">
			<media:title type="html">jproggy.org</media:title>
		</media:content>
	</item>
		<item>
		<title>Separation of concerns</title>
		<link>https://snippetory.wordpress.com/2011/11/03/separation-of-concerns/</link>
		<comments>https://snippetory.wordpress.com/2011/11/03/separation-of-concerns/#comments</comments>
		<pubDate>Wed, 02 Nov 2011 23:09:53 +0000</pubDate>
		<dc:creator>sirrotn</dc:creator>
				<category><![CDATA[Code Style]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Logic]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Snippetory]]></category>
		<category><![CDATA[Template]]></category>

		<guid isPermaLink="false">http://snippetory.wordpress.com/?p=29</guid>
		<description><![CDATA[Dealing with passive templates, I sometimes hear separating template and logic splits up things and makes it harder to maintain. I somewhat confused about that. I don&#8217;t solve my maintenance problems very often&#8230; <a class="read-more" href="https://snippetory.wordpress.com/2011/11/03/separation-of-concerns/">Read More <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=snippetory.wordpress.com&#038;blog=28224326&#038;post=29&#038;subd=snippetory&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>Dealing with passive templates, I sometimes hear separating template and logic splits up things and makes it harder to maintain. I somewhat confused about that. I don&#8217;t solve my maintenance problems very often by putting things together. Much more often I separate things to gain focus and open the door for reuse. For example break one method into two or even more. What are the effects?</p>
<table>
<tbody>
<tr>
<td>-</td>
<td><strong>Additional code. </strong>Method declaration as well as method call are added.</td>
</tr>
<tr>
<td>-</td>
<td><strong>Loss of overview.</strong> When I look on the outer method I can&#8217;t see what happens in the inner and vice versa.</td>
</tr>
<tr>
<td>+</td>
<td><strong>Gain focus.</strong> There&#8217;s only a small piece of logic to understand.</td>
</tr>
<tr>
<td>+</td>
<td><strong>Create a new reusable artifact.</strong> Maybe this will not happen as fist step, but often it&#8217;s the most important argument.</td>
</tr>
<tr>
<td>+</td>
<td><strong>Give a name to the new method.</strong> This means a minor piece of additional documentation.</td>
</tr>
</tbody>
</table>
<p>Very similar things happen when separating template and logic:</p>
<table>
<tbody>
<tr>
<td>-</td>
<td><strong>Additional code. </strong>(Only if the existing model is sufficient for the view technology.) Template code only has references, that have to be accessed by the logic code.</td>
</tr>
<tr>
<td>-</td>
<td><strong>Loss of overview.</strong> In the template one can&#8217;t see the logic anymore. However, in most cases this is not too interesting anyway.</td>
</tr>
<tr>
<td>+</td>
<td><strong>Gain focus.</strong> When writing templates one don&#8217;t need to care for data types, the exact structure of a model, or have any huge APIs in mind. Especially for people, coding not too many templates this is a great help. On logic side the code get&#8217;s much more compact, simpler to navigate and better integrated.</td>
</tr>
<tr>
<td>+</td>
<td><strong>Create a new reusable artifact.</strong> As methods any named section can be used independently. As the data is not bound internal by direct attribute access, another piece of logic can provide it from somewhere else, just like the parameters in a method call.</td>
</tr>
<tr>
<td>+</td>
<td><strong>&#8230;and there&#8217;s a piece of code that gets a name. </strong>Just a little piece of instant documentation.</td>
</tr>
</tbody>
</table>
<p><img style="border:0 none;" src="http://www.jproggy.de/piwik/piwik.php?idsite=4&amp;rec=1" alt="" />See you on <a href="http://www.jproggy.org/"><img style="position:relative;top:17px;" src="http://www.jproggy.org/img/jproggy_s.png" alt="jproggy.org" /></a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/snippetory.wordpress.com/29/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/snippetory.wordpress.com/29/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=snippetory.wordpress.com&#038;blog=28224326&#038;post=29&#038;subd=snippetory&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://snippetory.wordpress.com/2011/11/03/separation-of-concerns/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/c569040c8dd6a7d3c8c9d4130c46b938?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sirrotn</media:title>
		</media:content>

		<media:content url="http://www.jproggy.de/piwik/piwik.php?idsite=4&#38;rec=1" medium="image" />

		<media:content url="http://www.jproggy.org/img/jproggy_s.png" medium="image">
			<media:title type="html">jproggy.org</media:title>
		</media:content>
	</item>
		<item>
		<title>New tutorial</title>
		<link>https://snippetory.wordpress.com/2011/10/27/new-tutorial/</link>
		<comments>https://snippetory.wordpress.com/2011/10/27/new-tutorial/#comments</comments>
		<pubDate>Thu, 27 Oct 2011 07:17:29 +0000</pubDate>
		<dc:creator>sirrotn</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Reflection]]></category>
		<category><![CDATA[Snippetory]]></category>
		<category><![CDATA[Template]]></category>
		<category><![CDATA[Template engine (web)]]></category>
		<category><![CDATA[Tutorial]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://snippetory.wordpress.com/?p=30</guid>
		<description><![CDATA[I added a new tutorial on JProggy.org.  It shows the complete templating process using the Snippetory template engine. The example is based on reflection, to show the integration of tough logic.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=snippetory.wordpress.com&#038;blog=28224326&#038;post=30&#038;subd=snippetory&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p>I added a <a href="http://www.jproggy.org/snippetory/intfgen.html">new tutorial</a> on <a href="http://www.jproggy.org">JProggy.org</a>.  It shows the complete templating process using the <a href="http://www.jproggy.org/snippetory/">Snippetory template engine</a>. The example is based on reflection, to show the integration of tough logic.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/snippetory.wordpress.com/30/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/snippetory.wordpress.com/30/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=snippetory.wordpress.com&#038;blog=28224326&#038;post=30&#038;subd=snippetory&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://snippetory.wordpress.com/2011/10/27/new-tutorial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/c569040c8dd6a7d3c8c9d4130c46b938?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sirrotn</media:title>
		</media:content>
	</item>
		<item>
		<title>JSP vs. Snippetory</title>
		<link>https://snippetory.wordpress.com/2011/10/14/jsp-vs-snippetory/</link>
		<comments>https://snippetory.wordpress.com/2011/10/14/jsp-vs-snippetory/#comments</comments>
		<pubDate>Thu, 13 Oct 2011 22:33:28 +0000</pubDate>
		<dc:creator>sirrotn</dc:creator>
				<category><![CDATA[comparison]]></category>
		<category><![CDATA[Expression Language]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JavaServer Pages]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Snippetory]]></category>
		<category><![CDATA[Template]]></category>

		<guid isPermaLink="false">http://snippetory.wordpress.com/?p=13</guid>
		<description><![CDATA[I&#8217;m pretty aware, JSP is mature enough to get things done. However, working with passive templates I&#8217;ve learned, it can be done somewhat easier. At least for developers with not too much experience&#8230; <a class="read-more" href="https://snippetory.wordpress.com/2011/10/14/jsp-vs-snippetory/">Read More <span class="meta-nav">&#8594;</span></a><img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=snippetory.wordpress.com&#038;blog=28224326&#038;post=13&#038;subd=snippetory&#038;ref=&#038;feed=1" width="1" height="1" />]]></description>
				<content:encoded><![CDATA[<p><span style="font-family:Arial,sans-serif;"><span style="font-size:medium;">I&#8217;m pretty aware, JSP is mature enough to get things done. However, working with passive templates I&#8217;ve learned, it can be done somewhat easier. At least for developers with not too much experience in using JSP. One of the problems is its complexity. Tons of tags, expression language and, the diversity provided by different tag vendors. All this glued together by a primitive platform with little support for work related to templates. However, it provides the possibility to take a text block and deal with it. But locale handling and output consistency are missing. </span></span></p>
<p><span style="font-family:Arial,sans-serif;"><span style="font-size:medium;">If you need precise information things get even more complicated. Is an empty array empty for the EL empty keyword? Takes some time to find it out. And a number of quirks every day. Want to express the size of a collection? You need an additional field some where. And the tool support, considered one of main advantages, is not very fun. At least in while the HTML support is sufficient and java even great, JSP doesn&#8217;t really do the job. Opening a field definition accessed via EL? Nope. Opening a tag definition? Nope. Adding library definition when entering name space shortcut? Nope. Re-factoring a piece of code into a JSP tag? Again, not there. OK, I didn&#8217;t submit. I did never try to make this better. But the fact is the community does not preserve the power to support JSP adequately. And the complexity of JSP makes those additions more important the less complex technologies. </span></span></p>
<p><span style="font-family:Arial,sans-serif;"><span style="font-size:medium;">But enough complaining. Let&#8217;s implement the interface example using JSP. Generally it is common to implement a special view model and fill it in the so-called controller. This in necessary to get the interface a little more explicit, and to decouple execution order and presentation order. And, due to the reduced functionality of EL, the real model is not expressive enough to take over logic responsibilities. In fact this is a price we pay whenever using JSP, though I have to include this in the example.</span></span> <span style="font-family:Arial,sans-serif;"><span style="font-size:medium;">Next question is where to write this logic, i.e. How does the controller look like? </span></span></p>
<p><pre class="brush: java;">
package org.jproggy.examples.inftfgen.jsp;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class InterfaceGenController
 */
@WebFilter(&quot;/intfgen.jsp&quot;)
public class InterfaceGenController implements Filter {

    /**
     * Default constructor.
     */
    public InterfaceGenController() {
    }

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		try {
			Class&lt;!--?--&gt; intf = Class.forName(request.getParameter(&quot;intf&quot;));
			Set&lt;String&gt; types = new TreeSet&lt;String&gt;();
			InterfaceDefinition interfaceDefinition = new InterfaceDefinition();
			interfaceDefinition.setName(intf.getSimpleName());
			interfaceDefinition.setPackageName(intf.getPackage().getName());
			Collection availablePackages = new HashSet();
			availablePackages.add(intf.getPackage().getName());
			availablePackages.add(&quot;java.lang&quot;);

			for (Class&lt;?&gt; parent: intf.getInterfaces()) {
				if (!availablePackages.contains(parent.getPackage())) {
					types.add(parent.getName());
				}
				interfaceDefinition.addParent(parent.getSimpleName());
			}

			for (java.lang.reflect.Method refMethod : intf.getDeclaredMethods()) {
				Method method = copyMethod(types, availablePackages, refMethod);
				interfaceDefinition.addMethod(method);
			}

			groupTypes(types, interfaceDefinition);

			// pass the request along the filter chain
			chain.doFilter(request, response);
		} catch (Exception e) {
			throw new IOException(e);
		}

	}

	private void groupTypes(Set types,
			InterfaceDefinition interfaceDefinition) {
		String oldPrefix = &quot;&quot;;
		ImportGroup group = null;
		for (String type : types) {
			String prefix = type.split(&quot;\\.&quot;)[0];
			if (!oldPrefix.equals(prefix)) {
				if (group != null) interfaceDefinition.addImportgroups(group);
				group = new ImportGroup();
			}
			group.addImport(type);
		}
		if (group != null) interfaceDefinition.addImportgroups(group);
	}

	private Method copyMethod(Set types, Collection availablePackages,
			java.lang.reflect.Method refMethod) {
		Method method = new Method();
		method.setName(refMethod.getName());
		Class&lt;!--?--&gt; returnType = refMethod.getReturnType();
		if (!availablePackages.contains(returnType.getPackage())) {
			types.add(returnType.getName());
		}
		method.setName(returnType.getSimpleName());
		for (Class&lt;?&gt; type : refMethod.getParameterTypes()) {
			if (!availablePackages.contains(type.getPackage())) {
				types.add(type.getName());
			}
			method.addParamterType(type.getSimpleName());
		}
		return method;
	}

	public void init(FilterConfig fConfig) throws ServletException {
	}

	public static class InterfaceDefinition {
		String packageName;
		String name;
		List&lt;ImportGroup&gt; importgroups = new ArrayList();
		List&lt;String&gt; parents = new ArrayList&lt;String&gt;();
		List&lt;Method&gt; methods = new ArrayList&lt;Method&gt;();
		public String getPackageName() {
			return packageName;
		}
		public void setPackageName(String packageName) {
			this.packageName = packageName;
		}
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public List getImportgroups() {
			return importgroups;
		}
		public void addImportgroups(ImportGroup group) {
			importgroups.add(group);
		}
		public List getParents() {
			return parents;
		}
		public void addParent(String parent) {
			parents.add(parent);
		}
		public List getMethods() {
			return methods;
		}
		public void addMethod(Method method) {
			methods.add(method);
		}
	}
	public static class ImportGroup {
		List&lt;String&gt; imports = new ArrayList&lt;String&gt;();

		public List getImports() {
			return imports;
		}

		public void addImport(String imp) {
			this.imports.add(imp);
		}
	}
	public static class Method {
		String name;
		String returnType;
		List paramterTypes = new ArrayList();
		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public String getReturnType() {
			return returnType;
		}
		public void setReturnType(String returnType) {
			this.returnType = returnType;
		}
		public List getParamterTypes() {
			return paramterTypes;
		}
		public void addParamterType(String paramterType) {
			this.paramterTypes.add(paramterType);
		}
	}
}
</pre></p>
<p><span style="font-family:Arial,sans-serif;"><span style="font-size:medium;">As I don&#8217;t want to advertise for a special framework, and using any of them would be an overkill in such a simple example I decided to use a filter. For simplicities sake I will add the model classes as inner classes to the filter. </span></span> It&#8217;s still quite a bit of code. The model makes half of the lines, but, granted, not that much of the complexity.</p>
<p><span style="font-family:Arial,sans-serif;"><span style="font-size:medium;">After the data is gathered we can start looking at the JSP. This will not really look like a template. And to get the white-spaces controlled I&#8217;ll have to write somewhat awkward: </span></span></p>
<p><pre class="brush: java;">
&lt;%@ taglib prefix=&quot;c&quot; uri=&quot;http://java.sun.com/jsp/jstl/core&quot;
%&gt;package ${interfaceDefinition.packageName};

&lt;c:forEach var=&quot;group&quot; items=&quot;${interfaceDefinition.importgroups}&quot;
&gt;&lt;c:forEach var=&quot;import&quot; items=&quot;${group.imports}&quot;
&gt; import ${import};
&lt;/c:forEach&gt;
&lt;/c:forEach&gt;public interface ${interfaceDefinition.name} extends &lt;c:forEach var=&quot;parent&quot;
items=&quot;${interfaceDefinition.parents}&quot; varStatus=&quot;status&quot;
&gt;${parent}&lt;c:if test=&quot;${not status.first}&quot;&gt;, &lt;/c:if
&gt;&lt;/c:forEach&gt; {
&lt;c:forEach var=&quot;method&quot; items=&quot;${interfaceDefinition.methods}&quot;
&gt;  ${method.returnType} ${method.name}( &lt;c:forEach var=&quot;parameterType&quot; items=&quot;method.parameterTypes&quot;
varStatus=&quot;status&quot;&gt;&lt;c:if test=&quot;${not status.first}&quot;
&gt;, &lt;/c:if&gt;${parameterType} arg${status.index}&lt;/c:forEach&gt; );
&lt;/c:forEach&gt;}
</pre></p>
<p><span style="font-family:Arial,sans-serif;"><span style="font-size:medium;">To me it&#8217;s kind of hard to figure out this is a template for an interface definition even though I&#8217;ve already seen some interface definitions and some templates, too. Let&#8217;s look at the Snippetory template again:</span></span></p>
<p><pre class="brush: java;">
package {v:packageName};

&lt;t:imports&gt;
import {v:name};
&lt;/t:imports&gt;

public interface {v:name} extends {v:parent delimiter=&quot;, &quot;} {
&lt;t:methods&gt;
  {v:return_type} {v:name}(&lt;t:parameters delimiter=&quot;, &quot;&gt;{v:type} {v:name}&lt;/t:parameters&gt;);
&lt;/t:methods&gt;
}
</pre></p>
<p><span style="font-family:Arial,sans-serif;"><span style="font-size:medium;">In this case it&#8217;s clear on first sight. A template for an interface definition. No doubt about it. While the Java code is, ignoring the model, quite similar in quantity, the difference on template side is drastic. Even though it&#8217;s not just the sheer amount code, but there is an elegance that make our work really a bit simpler. A location mark for instance is a real template construct with support for escaping according to the surrounding encoding (like the <code>&lt;c:out/&gt;</code> tag does for XML and only for XML), formatting, and nice little helper like the delimiter attribute, that solves a typical template problem.<br />
</span></span></p>
<p><span style="font-family:Arial,sans-serif;"><span style="font-size:medium;">Of course, all the brilliant tags provided by all those people will not work on Snippetory. But I&#8217;ve never used one of that is not really simple to implement. Most are simply workarounds for JSP problems. But yes, there are some valuable tags, too, that would require a significant effort to re-implement using Snippetory. But the about 350 pages I deal and dealt with do not use them. And they&#8217;ve been implemented by quite different people.</span></span> <span style="font-family:Arial,sans-serif;"><span style="font-size:medium;">I skip performance tests here. On one hand I expect JSP to be a little bit faster. But on the other hand the lower implementation effort wights this pretty well. Performance is more interesting to me where the programming model is similar. And of course where Snippetory can win. </span></span> <span style="font-family:Arial,sans-serif;"><span style="font-size:medium;">That&#8217;s all for today. Maybe I&#8217;ll get back to JSP some day and try another example.</span></span></p>
<p><span style="font-family:Arial,sans-serif;"><span style="font-size:medium;">Have fun,</span></span></p>
<p><span style="font-family:Arial,sans-serif;"><span style="font-size:medium;">Sir RotN</span></span></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/snippetory.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/snippetory.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=snippetory.wordpress.com&#038;blog=28224326&#038;post=13&#038;subd=snippetory&#038;ref=&#038;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>https://snippetory.wordpress.com/2011/10/14/jsp-vs-snippetory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="https://0.gravatar.com/avatar/c569040c8dd6a7d3c8c9d4130c46b938?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">sirrotn</media:title>
		</media:content>
	</item>
	</channel>
</rss>
