<?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>Flex/Flash/J2EE/C++ RIA Developer in Los Angeles</title>
	<atom:link href="/news/feed/" rel="self" type="application/rss+xml" />
	<link>http://austinkottke.com/news</link>
	<description>Austin Kottke&#039;s Programming Site</description>
	<lastBuildDate>Wed, 07 Dec 2011 23:44:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>The brilliant choices of Steve Jobs, Adobe, multi-talented developers now force us to use Javascript &#8211; ECMAScript 1.0?</title>
		<link>http://austinkottke.com/news/2011/12/07/the-brilliant-choices-of-steve-jobs-adobe-multi-talented-developers-now-force-us-to-use-javascript-ecmascript-1-0/</link>
		<comments>http://austinkottke.com/news/2011/12/07/the-brilliant-choices-of-steve-jobs-adobe-multi-talented-developers-now-force-us-to-use-javascript-ecmascript-1-0/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 21:11:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://austinkottke.com/news/?p=97</guid>
		<description><![CDATA[Anyone who has done RIA development, back-end development and worked with a myriad of languages that include strong typing and...]]></description>
			<content:encoded><![CDATA[<p>Anyone who has done RIA development, back-end development and worked with a myriad of languages that include strong typing and compile time checking knows that Adobe&#8217;s announcement of the non-existence of a mobile flash player has set the entire flash development community backwards into a realm of using javascript and shitty compilation standards. HTML5 is cool, but for real &#8211; it comes down to javascript. </p>
<p>Don&#8217;t get me wrong I love javascript, for little things here and there and working on a page. But a usual flash application can be up to a 100,000 lines of front-end code. </p>
<p>I sought out to prove to myself that javascript could be a force to be reckoned with so I set myself up with Aptana again and downloaded all of the latest libraries, jquery, mootools etc. I then decided to create classes using mootools. To my dismay creating a class is at run time only so guess what:</p>
<p>1. If using new frameworks to create classes instead of the usual prototype BS, you will thoroughly disappointed that you will have no compile time checking.</p>
<p>2. Thus if you have an error in your class you will never know until you run the app.</p>
<p>3. console.log doesnt work in IE 8. </p>
<p>Thus from my deduction the only logical approach to this is the fact that you must use prototype to create your classes and not rely on strong typing. </p>
<p>Even then, if you use prototype to create a class AND then use another class within that class all compile time checking goes out the window. </p>
<p>This slows development time down tremendously and is the primary reason I think developers like Google are going with alternate solutions like Dart.</p>
<p>I really think Adobe should have waited for the announcement. I think Adobe should have made the announcement WHEN they had a solution. It makes developers now flounder as a whole. You dont announce the big issue when you have no alternative. </p>
<p>So I hope adobe builds in something into dreamweaver or eclipse that does INCREDIBLE javascript parsing. The dreamweaver parsing in 5.5 is ok, but come on. Can we get LIVE compile time checking with JS? If you are making this the alternative to flash development. </p>
<p>Can you get the error detection as awesome as flex builder? </p>
<p>The amount of millions of dollars wasted in no compile time checking is at stake here and I think that managers need to know the alternatives to development.<br />
<strong><br />
ECMAScript:</strong><br />
Seriously, rather than come to any standard about proper web development in a language they drop the ECMAScript 4 specification which is something that could help make javascript more readable and strong typing &#8211; lots of things. Companies like Microsoft and Yahoo say its too complex. </p>
<p>Seriously, who thinks javascript is amazing at Microsoft? Can they see the issues here?<br />
<strong><br />
It appears javascript is more about shorthand than it is about writing clean, documented code:</strong></p>
<p>Just look at this article about js 1.8 whereby instead of implementing ECMAScript 4 enhancements that include packages, namespaces, classes. They implement CLOSURES &#8211; shorthand code for methods that make code a lot more unreadable.</p>
<p>https://developer.mozilla.org/en/New_in_JavaScript_1.8</p>
<p>I think it&#8217;s a backwards move and I think Google sees this too which is why Google Dart is being developed.</p>
]]></content:encoded>
			<wfw:commentRss>http://austinkottke.com/news/2011/12/07/the-brilliant-choices-of-steve-jobs-adobe-multi-talented-developers-now-force-us-to-use-javascript-ecmascript-1-0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Adobe&#8217;s Mobile Development Initiative</title>
		<link>http://austinkottke.com/news/2011/08/29/adobes-mobile-development-initiative/</link>
		<comments>http://austinkottke.com/news/2011/08/29/adobes-mobile-development-initiative/#comments</comments>
		<pubDate>Mon, 29 Aug 2011 20:36:23 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[actionscript]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://austinkottke.com/news/?p=94</guid>
		<description><![CDATA[I would like to get feedback from developers from using Adobe&#8217;s Mobile Development toolset, particularly in flex sdk 4.5. Can...]]></description>
			<content:encoded><![CDATA[<p>I would like to get feedback from developers from using Adobe&#8217;s Mobile Development toolset, particularly in flex sdk 4.5.</p>
<p>Can some developers provide some pros and cons in using it? Speed of performance, android phones, tablets. Also, Ive tried some apps on an Iphone 3GS and found them really slow.</p>
<p>How is the speed now? What can and cant be done?</p>
]]></content:encoded>
			<wfw:commentRss>http://austinkottke.com/news/2011/08/29/adobes-mobile-development-initiative/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Undocumented APIs &#8211; Mobile Development on Flash Platform &#8211; CS 5.5</title>
		<link>http://austinkottke.com/news/2011/05/09/undocumented-apis-mobile-development-on-flash-platform-cs-5-5/</link>
		<comments>http://austinkottke.com/news/2011/05/09/undocumented-apis-mobile-development-on-flash-platform-cs-5-5/#comments</comments>
		<pubDate>Mon, 09 May 2011 16:56:09 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://austinkottke.com/news/?p=88</guid>
		<description><![CDATA[So now all of us awesome developers who have been developing and programming for the adobe flash platform for years...]]></description>
			<content:encoded><![CDATA[<p>So now all of us awesome developers who have been developing and programming for the adobe flash platform for years now have an opportunity to write some awesome apps for mobile platforms. </p>
<p>The big question that we as developers have and need answered are &#8211; what are the drawbacks of developing with Adobe&#8217;s tools as opposed to developing with something like the android SDK or the Iphone SDK. What challenges and problems are we going to encounter.</p>
<p>My questions for adobe:</p>
<ol>
<b>1. </b>What is the roadmap and to-dos on the Air Mobile SDK </p>
<p><b>2. </b>Native controls &#8211; how do you access these using the Air Mobile SDK</p>
<p><b>3. </b>How do you program in 3D for IOS/Android using native GL graphics calls. Is this possible?</p>
<p><b>4. </b>Is there some way to leverage advanced APIs for IOS and Android</p>
<p><b>5. </b>Can you actually use APIS on the IOS platform via a &#8220;hack&#8221; or some way&#8230; what if a company invests millions of dollars and the adobe tools are selected as the platform of choice and we need to do an advanced task that is not in the AS3 Air Mobile SDK? What do we do?</ol>
</ol>
<p>I think that a lot of developers have these questions and it would be good to get some light on this before talking to the higher ups on the pros and cons.</p>
<p>Thanks =)</p>
]]></content:encoded>
			<wfw:commentRss>http://austinkottke.com/news/2011/05/09/undocumented-apis-mobile-development-on-flash-platform-cs-5-5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RobotLegs &lt; Pure MVC &#8211; My rant</title>
		<link>http://austinkottke.com/news/2011/03/25/robotlegs-pure-mvc-my-rant/</link>
		<comments>http://austinkottke.com/news/2011/03/25/robotlegs-pure-mvc-my-rant/#comments</comments>
		<pubDate>Fri, 25 Mar 2011 22:07:14 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[actionscript]]></category>
		<category><![CDATA[actionscript 3]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>

		<guid isPermaLink="false">http://austinkottke.com/news/?p=85</guid>
		<description><![CDATA[So, Im always digging into new frameworks and trying to understand the philosophies behind why developers chose to make new...]]></description>
			<content:encoded><![CDATA[<p>So, Im always digging into new frameworks and trying to understand the philosophies behind why developers chose to make new frameworks to help others.</p>
<p>After falling in love with the new [Inject] metatag and thinking it&#8217;s the coolest thing since Java has been doing this for years anyway with Annotations, I thought this framework must be rad =) </p>
<p>So after hours of looking at the documentation, the one thing I found out and is the bane of all robot legs development is CLASS NAMING. Lord have mercy, there is a base class called &#8220;Actor&#8221; &#8211; THATS THE NAME OF THE CLASS. Ok, so after reading GoF and all these development books over the years the one thing that java/flex/flash developers have a huge problem is is correctly conveying the names of classes. Conceptually representing something. With that said &#8220;ACTOR&#8221; is the worst name for a class ever &#8211; I mean, it communicates absolutely nothing! The concept is so ambiguous and it hurts just thinking about it. And it&#8217;s used EVERYWHERE. PureMVC atleast names the classes by common design patterns so it&#8217;s clear to everyone using it if you&#8217;ve studied these patterns.</p>
<p>Lord have mercy &#8211; can we just get a pure mvc framework with an [Inject] meta tag? Ill be happy then =)</p>
]]></content:encoded>
			<wfw:commentRss>http://austinkottke.com/news/2011/03/25/robotlegs-pure-mvc-my-rant/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Inline Webkit Renderer for Flash Player 11</title>
		<link>http://austinkottke.com/news/2011/03/17/inline-webkit-renderer-for-flash-player-11/</link>
		<comments>http://austinkottke.com/news/2011/03/17/inline-webkit-renderer-for-flash-player-11/#comments</comments>
		<pubDate>Thu, 17 Mar 2011 23:28:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[actionscript]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[layout]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://austinkottke.com/news/?p=80</guid>
		<description><![CDATA[Something that I think should be done for the flash player, now that HTML 5 is gaining ground, is an...]]></description>
			<content:encoded><![CDATA[<p>Something that I think should be done for the flash player, now that HTML 5 is gaining ground, is an inline HTML renderer that should be packaged as part of the download. Potentially it could be an optional download. I mean the core code base is already a part of the AIR packager. How hard would it be to make an external RSL that gets cached or make it part of the flash player 11 installation with a checkbox to download this in addition. </p>
<p>If there is an update to the web kit renderer, it then flags this in the flashplayer download manager&#8230; Just a thought to make flash player 11 completely blow away. We&#8217;ve got 3d support, but how about a little HTML 5 renderer as part of the flash player?</p>
]]></content:encoded>
			<wfw:commentRss>http://austinkottke.com/news/2011/03/17/inline-webkit-renderer-for-flash-player-11/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>AGAL (Adobe Graphics Assembly Language) conversion to HLSL</title>
		<link>http://austinkottke.com/news/2011/03/02/agal-adobe-graphics-assembly-language-conversion-to-hlsl/</link>
		<comments>http://austinkottke.com/news/2011/03/02/agal-adobe-graphics-assembly-language-conversion-to-hlsl/#comments</comments>
		<pubDate>Wed, 02 Mar 2011 17:50:54 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[3d]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://austinkottke.com/news/?p=75</guid>
		<description><![CDATA[So, the new flash player is out. And the one thing Im thinking is &#8211; AWESOME. So, I&#8217;ve been looking...]]></description>
			<content:encoded><![CDATA[<p>So, the new flash player is out. And the one thing Im thinking is &#8211; AWESOME. So, I&#8217;ve been looking at the API docs and the program code and all that looks hot. Stencil Buffer, Depth Buffer, Vertex Buffer &#8211; they basically made it almost identical to NVidia&#8217;s C++ CG, CGFX. However I did not see profiles, but Im sure this is going to be a smart solution done.</p>
<p>So the wheels are turning and Im only thinking to myself, If Adobe, NVidia, and Microsoft can get together to develop some kind of HLSL (High Level Shader Language) that all three can use &#8211; a simple wrapper &#8211; MAN we&#8217;re going to be in heaven as 3d developers. Then, the shaders for say your favorite PC game can be loaded directly into a flash game, and the same shaders can apply to the model. Because you&#8217;ll be using a PC for all types of development.</p>
<p>The only issue this poses is when you export to mobile &#8211; a lot of the same shaders will have to be dummied down &#8211; so adobe will need to come up with some kind of profile mechanism &#8211; similar to how CGFX does it where it loads back up shaders if the hardware cannot support the shader.</p>
<p>Are you excited about this? I think this is going to kick ass!!!</p>
]]></content:encoded>
			<wfw:commentRss>http://austinkottke.com/news/2011/03/02/agal-adobe-graphics-assembly-language-conversion-to-hlsl/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>J2EE Filter that modifies a Stripes response for Velocity rendering</title>
		<link>http://austinkottke.com/news/2011/01/28/j2ee-filter-that-modifies-the-a-stripes-request-for-velocity-rendering/</link>
		<comments>http://austinkottke.com/news/2011/01/28/j2ee-filter-that-modifies-the-a-stripes-request-for-velocity-rendering/#comments</comments>
		<pubDate>Fri, 28 Jan 2011 18:16:18 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[stripes]]></category>
		<category><![CDATA[velocity]]></category>

		<guid isPermaLink="false">http://austinkottke.com/news/?p=57</guid>
		<description><![CDATA[I combined Stripes and Velocity into a J2EE filter that came out to be extremely useful, so I could have...]]></description>
			<content:encoded><![CDATA[<p>I combined <a href="http://stripesframework.org">Stripes </a>and <a href="http://velocity.apache.org/">Velocity </a>into a J2EE filter that came out to be extremely useful, so I could have Stripes/JSPs and have Velocity rendering with every request. </p>
<p>I love the toolbox.xml concept of velocity so I couldnt live without it, but wanted to use stripes for its amazing action controller functionality. Here is a filter which modifies the stripes response and then parses the response through the Velocity Template Engine. </p>
<div style="height: 300px; overflow-y: scroll; ">


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><pre class="de1">&nbsp;
<span class="kw1">package</span> <span class="co2">org.adk.java.viewfilter</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">import</span> <span class="co2">org.adk.java.locale.LocaleTool</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.io.CharArrayWriter</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.io.IOException</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.io.PrintWriter</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.util.Collection</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.util.Iterator</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.util.Locale</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.util.Map</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.util.Set</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.util.logging.Level</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.util.logging.Logger</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">javax.servlet.Filter</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">javax.servlet.FilterChain</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">javax.servlet.FilterConfig</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">javax.servlet.ServletContext</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">javax.servlet.ServletException</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">javax.servlet.ServletRequest</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">javax.servlet.ServletResponse</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">javax.servlet.http.HttpServletRequest</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">javax.servlet.http.HttpServletResponse</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">javax.servlet.http.HttpSession</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.adk.java.store.StoreWebApplication</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.adk.java.store.WebSessionBean</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.adk.java.log.KLogger</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.adk.java.secure.SecureRedirectorActionBean</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.adk.java.stripes.ActionBeanUrlManager</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.adk.java.viewfilter.tools.BaseTool</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.adk.java.viewfilter.tools.BreadCrumbTool</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.adk.java.viewfilter.tools.PropertyTool</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.adk.java.viewfilter.tools.RequestTool</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.apache.velocity.VelocityContext</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.apache.velocity.app.Velocity</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.apache.velocity.tools.view.XMLToolboxManager</span><span class="sy0">;</span>
&nbsp;
<span class="coMULTI">/********************************************************************************************
 * &lt;p&gt;
 * Our basic filter, all it does is take our WebSessionBean which is a wrapper around
 * the current session and passes it in the request, so that all jsps and other objects
 * can access the data, such as the current users shopping cart, his user info, and
 * other pertinent details to the session for this user.
 * &lt;p&gt;
 * In addition to basic session addition, we also take the content and
 * add in the velocity template engine so the session can be accessed from
 * velocity, and all content, after stripes is done with it is modified
 * with velocity.
 * &lt;p&gt;
 * We perform the following steps:
 * -------------------------------
 * &lt;ol&gt;
 * &lt;li&gt;  Load in the velocity toolbox so these can be exposed and used throughout
 *    the web app.
 * 
 * &lt;li&gt; Add the session to the queue and attributes
 *
 * &lt;li&gt;  Perform the filter chain and take the modified content in the form
 *    of a PrintWriter
 *
 * &lt;li&gt;  Modify this content with the Velocity Engine.
 *
 * &lt;li&gt;  Using the localeTool, we can then render all translations loaded in
 *    the appropriate strings.xml file.
 *&lt;/ol&gt;
 *
 * @author Austin Kottke
 ********************************************************************************************/</span>
<span class="kw1">public</span> <span class="kw1">class</span> ViewFilterEngine <span class="kw1">implements</span> Filter <span class="br0">&#123;</span>
&nbsp;
    <span class="kw1">private</span> StoreWebApplication webApp <span class="sy0">=</span> StoreWebApplication.<span class="me1">getInstance</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="kw1">private</span> KLogger logger <span class="sy0">=</span> KLogger.<span class="me1">getLogger</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="kw1">private</span> VelocityContext velocityContext <span class="sy0">=</span> <span class="kw1">new</span> VelocityContext<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw1">static</span> ViewFilterEngine instance <span class="sy0">;</span>
    <span class="kw1">private</span> FilterConfig filterConfig<span class="sy0">;</span>
    <span class="kw1">private</span> ServletContext servletContext<span class="sy0">;</span>
&nbsp;
    <span class="co1">// Security redirector</span>
    <span class="kw1">private</span> SecureRedirectorActionBean secureRedir <span class="sy0">=</span> <span class="kw1">new</span> SecureRedirectorActionBean<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
    <span class="co1">// The actual path of the primary servlet. From here we can load</span>
    <span class="co1">// in all other files based on this path.</span>
    <span class="kw1">private</span> <span class="kw3">String</span> currentPath<span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw3">String</span> toolboxPath<span class="sy0">;</span>
    <span class="kw1">private</span> XMLToolboxManager toolboxManager<span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw3">Map</span> toolBox<span class="sy0">;</span>
&nbsp;
    <span class="co1">// A reference to the locale tool.</span>
    <span class="kw1">private</span> LocaleTool localeTool<span class="sy0">;</span>
    <span class="kw1">private</span> RequestTool requestTool<span class="sy0">;</span>
    <span class="kw1">private</span> BreadCrumbTool breadCrumbTool<span class="sy0">;</span>
&nbsp;
    <span class="kw1">private</span> <span class="kw4">boolean</span> initialized <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span>
&nbsp;
    <span class="co1">// Action url manager</span>
    <span class="kw1">private</span> ActionBeanUrlManager actionUrlManager <span class="sy0">;</span>
&nbsp;
    <span class="kw1">private</span> <span class="kw4">void</span> ViewFilterEngine<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     *
     * @return
     */</span>
    <span class="kw1">public</span> <span class="kw1">static</span> ViewFilterEngine getInstance<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
        <span class="kw1">if</span> <span class="br0">&#40;</span>instance <span class="sy0">==</span> <span class="kw2">null</span> <span class="br0">&#41;</span><span class="br0">&#123;</span>
            <span class="kw1">return</span> <span class="kw1">new</span> ViewFilterEngine<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
        <span class="kw1">return</span> instance<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
&nbsp;
&nbsp;
    <span class="co3">/**
     *
     * @param aConfig
     * @throws ServletException
     */</span>
    <span class="kw1">public</span> <span class="kw4">void</span> init<span class="br0">&#40;</span>FilterConfig aConfig<span class="br0">&#41;</span> <span class="kw1">throws</span> ServletException <span class="br0">&#123;</span>
        <span class="kw1">this</span>.<span class="me1">filterConfig</span><span class="sy0">=</span>aConfig<span class="sy0">;</span>
        <span class="kw1">this</span>.<span class="me1">currentPath</span> <span class="sy0">=</span> filterConfig.<span class="me1">getServletContext</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getRealPath</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw1">this</span>.<span class="me1">toolboxPath</span> <span class="sy0">=</span> currentPath <span class="sy0">+</span> filterConfig.<span class="me1">getInitParameter</span><span class="br0">&#40;</span><span class="st0">&quot;ToolBoxPath&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw1">this</span>.<span class="me1">servletContext</span> <span class="sy0">=</span> filterConfig.<span class="me1">getServletContext</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">;</span>
&nbsp;
        logger.<span class="me1">initFilters</span><span class="br0">&#40;</span> currentPath <span class="br0">&#41;</span><span class="sy0">;</span>
        instance <span class="sy0">=</span> <span class="kw1">this</span><span class="sy0">;</span>
        <span class="kw1">try</span> <span class="br0">&#123;</span>
&nbsp;
            toolboxManager <span class="sy0">=</span> <span class="kw1">new</span> XMLToolboxManager<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            Velocity.<span class="me1">init</span><span class="br0">&#40;</span>currentPath <span class="sy0">+</span> <span class="st0">&quot;/WEB-INF/classes/velocity.properties&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Loading velocity toolbox: &quot;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
            toolboxManager.<span class="me1">load</span><span class="br0">&#40;</span> toolboxPath <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="co1">// Initialize the velocity tools and add them to the</span>
            <span class="co1">// velocity context so they can be used in the app</span>
            initVelocityTools<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span><span class="kw3">Exception</span> ex<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            Logger.<span class="me1">getLogger</span><span class="br0">&#40;</span>ViewFilterEngine.<span class="kw1">class</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">log</span><span class="br0">&#40;</span>Level.<span class="me1">SEVERE</span>, <span class="kw2">null</span>, ex<span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     * Propery loads and initializes all of the velocity tools so they can be used
     * throughout the application.
     */</span>
    <span class="kw1">public</span> <span class="kw4">void</span> initVelocityTools<span class="br0">&#40;</span><span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
         <span class="co1">// Retrieve the toolbox</span>
         toolBox <span class="sy0">=</span> toolboxManager.<span class="me1">getToolbox</span><span class="br0">&#40;</span><span class="kw2">null</span><span class="br0">&#41;</span><span class="sy0">;</span>
         <span class="kw3">Set</span> keys <span class="sy0">=</span> toolBox.<span class="me1">keySet</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
         <span class="kw1">if</span><span class="br0">&#40;</span> keys.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&lt;=</span> <span class="nu0">0</span> <span class="br0">&#41;</span> <span class="kw1">return</span><span class="sy0">;</span>
&nbsp;
         <span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw3">Object</span> key <span class="sy0">:</span> keys <span class="br0">&#41;</span>
         <span class="br0">&#123;</span>
            <span class="kw3">String</span> k  <span class="sy0">=</span> key.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw3">Object</span> obj <span class="sy0">=</span> toolBox.<span class="me1">get</span><span class="br0">&#40;</span>k<span class="br0">&#41;</span><span class="sy0">;</span>
            logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Tool object [&quot;</span><span class="sy0">+</span>k<span class="sy0">+</span><span class="st0">&quot;] = &quot;</span> <span class="sy0">+</span> obj<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            velocityContext.<span class="me1">put</span><span class="br0">&#40;</span>k, obj<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="kw1">try</span>
            <span class="br0">&#123;</span>
                <span class="kw1">if</span><span class="br0">&#40;</span> obj.<span class="me1">getClass</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getSuperclass</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;BaseTool&quot;</span><span class="br0">&#41;</span> <span class="sy0">&gt;=</span> <span class="nu0">0</span>  <span class="br0">&#41;</span>
                <span class="br0">&#123;</span>
                    logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Setting tool properties: &quot;</span> <span class="sy0">+</span> obj<span class="br0">&#41;</span><span class="sy0">;</span>
                    BaseTool t <span class="sy0">=</span> <span class="br0">&#40;</span>BaseTool <span class="br0">&#41;</span> obj<span class="sy0">;</span>
                    logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Property set!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                    t.<span class="me1">setServletFilePath</span><span class="br0">&#40;</span>currentPath<span class="br0">&#41;</span><span class="sy0">;</span>
                    t.<span class="me1">setContext</span><span class="br0">&#40;</span>velocityContext<span class="br0">&#41;</span><span class="sy0">;</span>
                    t.<span class="me1">setServletContext</span><span class="br0">&#40;</span>servletContext<span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="br0">&#125;</span>
            <span class="br0">&#125;</span> <span class="kw1">catch</span><span class="br0">&#40;</span><span class="kw3">Exception</span> e<span class="br0">&#41;</span><span class="br0">&#123;</span><span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
         <span class="kw1">try</span>
         <span class="br0">&#123;</span>
&nbsp;
             <span class="kw1">if</span><span class="br0">&#40;</span> toolBox.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;breadcrumbTool&quot;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">null</span> <span class="br0">&#41;</span>
             breadCrumbTool <span class="sy0">=</span> <span class="br0">&#40;</span>BreadCrumbTool<span class="br0">&#41;</span> toolBox.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;breadcrumbTool&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
             <span class="kw1">if</span><span class="br0">&#40;</span> toolBox.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;locale&quot;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span>
             localeTool <span class="sy0">=</span> <span class="br0">&#40;</span>LocaleTool<span class="br0">&#41;</span> toolBox.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;locale&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
             <span class="kw1">if</span><span class="br0">&#40;</span> toolBox.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;requestTool&quot;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span>
             requestTool <span class="sy0">=</span> <span class="br0">&#40;</span>RequestTool<span class="br0">&#41;</span> toolBox.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;requestTool&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
         <span class="br0">&#125;</span> <span class="kw1">catch</span><span class="br0">&#40;</span> <span class="kw3">Exception</span> e <span class="br0">&#41;</span>
         <span class="br0">&#123;</span>
             logger.<span class="me1">error</span><span class="br0">&#40;</span><span class="st0">&quot;Error - missing locale tool and / or request tool in the toolbox.xml&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
         <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**========================================================================
     * Here we add the session to the webApp singleton and add the user to the
     * session queue if he is not already there. We also modify the content
     * with VTL.
     * 
     * @param request
     * @param response
     * @param chain
     * @throws java.io.IOException
     * @throws javax.servlet.ServletException
     *========================================================================*/</span>
&nbsp;
    <span class="kw1">public</span> <span class="kw4">void</span> doFilter<span class="br0">&#40;</span>ServletRequest request, ServletResponse response, FilterChain chain<span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">IOException</span>, ServletException
    <span class="br0">&#123;</span>
        HttpServletRequest req <span class="sy0">=</span>  <span class="br0">&#40;</span>HttpServletRequest<span class="br0">&#41;</span> request<span class="sy0">;</span>
        HttpServletResponse resp <span class="sy0">=</span> <span class="br0">&#40;</span>HttpServletResponse<span class="br0">&#41;</span> response<span class="sy0">;</span>
        PropertyTool p  <span class="sy0">=</span> <span class="br0">&#40;</span>PropertyTool<span class="br0">&#41;</span> toolBox.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;propertyTool&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="coMULTI">/*********************************************************************
         * Initalize the tools that need the current request object.
         *********************************************************************/</span>
&nbsp;
        doRequestInitialization<span class="br0">&#40;</span>p,req,resp<span class="br0">&#41;</span><span class="sy0">;</span>
        p.<span class="me1">initProperties</span><span class="br0">&#40;</span>req.<span class="me1">getContextPath</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,  req.<span class="me1">getRequestURI</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw1">if</span><span class="br0">&#40;</span> <span class="sy0">!</span> initialized <span class="br0">&#41;</span>
        <span class="br0">&#123;</span>
                webApp.<span class="me1">doInitialization</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                actionUrlManager <span class="sy0">=</span> ActionBeanUrlManager.<span class="me1">getActionUrlManager</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                initialized <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
&nbsp;
        <span class="coMULTI">/*********************************************************************
         * Take the current session, and if it is not already added to
         * to the current request, add this to the current session.
         *********************************************************************/</span>
        HttpSession s <span class="sy0">=</span> addSessionToQueue<span class="br0">&#40;</span> req, resp<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="coMULTI">/*********************************************************************
         * Check if the page should be redirected to Https.
         *********************************************************************/</span>
       <span class="kw1">if</span><span class="br0">&#40;</span> doHttpsCheck<span class="br0">&#40;</span>p, req,resp<span class="br0">&#41;</span>  <span class="br0">&#41;</span>
           <span class="kw1">return</span><span class="sy0">;</span>
&nbsp;
        <span class="coMULTI">/*********************************************************************
         * Return the html stream.
         *********************************************************************/</span>
        <span class="kw3">CharArrayWriter</span> caw <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">CharArrayWriter</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Retrieving html stream... [&quot;</span><span class="sy0">+</span>req.<span class="me1">getRequestURI</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">&quot;]&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">try</span>
        <span class="br0">&#123;</span>
&nbsp;
         <span class="kw3">PrintWriter</span> out <span class="sy0">=</span> getHtmlStream<span class="br0">&#40;</span>chain, req, resp, caw <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="coMULTI">/*********************************************************************
         * render the html stream with velocity and persist the session
         * so velocity can access this.
         *********************************************************************/</span>
&nbsp;
        velocityContext.<span class="me1">put</span><span class="br0">&#40;</span> <span class="st0">&quot;velocitySession&quot;</span>, s <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        out.<span class="me1">write</span><span class="br0">&#40;</span>  renderVelocity<span class="br0">&#40;</span> caw.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span> <span class="kw1">catch</span><span class="br0">&#40;</span><span class="kw3">Exception</span> e <span class="br0">&#41;</span>
        <span class="br0">&#123;</span>
            logger.<span class="me1">error</span><span class="br0">&#40;</span><span class="st0">&quot;Error: &quot;</span> <span class="sy0">+</span> e.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
&nbsp;
    <span class="br0">&#125;</span>
&nbsp;
    <span class="coMULTI">/***
     * Initializes the tools and the property tool for requests that need the
     * information. It also initializes all of the tools that are instances
     * of base tools, including setting the current request and setting the
     * current locale for the localeTool.
     * 
     * @param p
     * @param request
     * @param response
     */</span>
    <span class="kw1">public</span> <span class="kw4">void</span> doRequestInitialization<span class="br0">&#40;</span>PropertyTool p, HttpServletRequest request, HttpServletResponse response<span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        <span class="kw1">try</span>
        <span class="br0">&#123;</span>
            breadCrumbTool.<span class="me1">setServletContextPath</span><span class="br0">&#40;</span> request.<span class="me1">getContextPath</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw3">String</span> curLocale <span class="sy0">=</span> request.<span class="me1">getParameter</span><span class="br0">&#40;</span><span class="st0">&quot;locale&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw1">if</span><span class="br0">&#40;</span> curLocale <span class="sy0">!=</span> <span class="kw2">null</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
                <span class="kw3">Locale</span> l <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span>
                <span class="kw3">String</span> lang <span class="sy0">=</span> curLocale.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;_&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span>
                <span class="kw1">if</span><span class="br0">&#40;</span> curLocale.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;_&quot;</span><span class="br0">&#41;</span> <span class="sy0">&gt;=</span> <span class="nu0">0</span><span class="br0">&#41;</span>
                <span class="br0">&#123;</span>
                    <span class="kw3">String</span> country <span class="sy0">=</span> curLocale.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;_&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span>
                    l <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">Locale</span><span class="br0">&#40;</span>lang, country<span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="br0">&#125;</span>
                <span class="kw1">else</span>
                <span class="br0">&#123;</span>
                    <span class="kw1">if</span><span class="br0">&#40;</span> lang.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;en&quot;</span><span class="br0">&#41;</span> <span class="sy0">&gt;=</span><span class="nu0">0</span> <span class="br0">&#41;</span>
                    l <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">Locale</span><span class="br0">&#40;</span>lang, <span class="st0">&quot;US&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                    <span class="kw1">else</span>
                    l <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">Locale</span><span class="br0">&#40;</span>lang,lang<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
                <span class="br0">&#125;</span>
                localeTool.<span class="me1">setCurrentLocale</span><span class="br0">&#40;</span> l <span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
&nbsp;
&nbsp;
&nbsp;
            <span class="kw3">Collection</span> c <span class="sy0">=</span> toolBox.<span class="me1">values</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw3">Iterator</span> i <span class="sy0">=</span> c.<span class="me1">iterator</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw1">while</span><span class="br0">&#40;</span> i.<span class="me1">hasNext</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>
            <span class="br0">&#123;</span>
                <span class="kw1">try</span>
                <span class="br0">&#123;</span>
                     <span class="kw3">Object</span> o <span class="sy0">=</span> i.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
                     <span class="kw1">if</span><span class="br0">&#40;</span> o.<span class="me1">getClass</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getSuperclass</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;BaseTool&quot;</span><span class="br0">&#41;</span> <span class="sy0">&gt;=</span> <span class="nu0">0</span>  <span class="br0">&#41;</span>
                     <span class="br0">&#123;</span>
                         <span class="co1">//logger.debug(&quot;Base tool! &quot; + o);</span>
                         BaseTool t <span class="sy0">=</span> <span class="br0">&#40;</span>BaseTool<span class="br0">&#41;</span> o<span class="sy0">;</span>
                         t.<span class="me1">setRequest</span><span class="br0">&#40;</span>request<span class="br0">&#41;</span><span class="sy0">;</span>
                     <span class="br0">&#125;</span>
&nbsp;
                <span class="br0">&#125;</span><span class="kw1">catch</span><span class="br0">&#40;</span><span class="kw3">Exception</span> e <span class="br0">&#41;</span><span class="br0">&#123;</span><span class="br0">&#125;</span>
            <span class="br0">&#125;</span>
&nbsp;
&nbsp;
&nbsp;
        <span class="br0">&#125;</span> <span class="kw1">catch</span><span class="br0">&#40;</span><span class="kw3">Exception</span> e <span class="br0">&#41;</span><span class="br0">&#123;</span>
            logger.<span class="me1">error</span><span class="br0">&#40;</span><span class="st0">&quot;Did you not load in the propertyTool ? - Check your velocity toolbox.xml file.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            logger.<span class="me1">error</span><span class="br0">&#40;</span><span class="st0">&quot;Error: you might be missing a /global.properties in the site root! &quot;</span> <span class="sy0">+</span> e.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
    <span class="br0">&#125;</span>
    <span class="coMULTI">/***
     * Modifys the request if this page should be secured or not. If it is
     * supposed to be secured, based on the global properties 'securePage' we
     * then forward to Https. If it is not supposed to be secured, then
     * we redirect to a regular url.
     *
     * @param p The property tool for lookup of the securePage property.
     * @param request The current request
     * @param response The response request.
     * @return
     */</span>
&nbsp;
    <span class="kw1">public</span> <span class="kw4">boolean</span> doHttpsCheck<span class="br0">&#40;</span>PropertyTool p, HttpServletRequest request, HttpServletResponse response<span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
&nbsp;
        logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Secure page: &quot;</span> <span class="sy0">+</span> p.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;securePage&quot;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">try</span>
        <span class="br0">&#123;</span>
            <span class="kw1">if</span><span class="br0">&#40;</span> p.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;securePage&quot;</span><span class="br0">&#41;</span>.<span class="me1">equals</span><span class="br0">&#40;</span><span class="st0">&quot;1&quot;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> request.<span class="me1">isSecure</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">==</span> <span class="kw2">false</span><span class="br0">&#41;</span>
            <span class="br0">&#123;</span>
                logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;This page should be secured...&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="kw3">String</span> securedUrl <span class="sy0">=</span> secureRedir.<span class="me1">returnSecureUrl</span><span class="br0">&#40;</span>request, request.<span class="me1">getRequestURI</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
                logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Secure url: &quot;</span>  <span class="sy0">+</span> securedUrl <span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="kw1">try</span> <span class="br0">&#123;</span>
                    response.<span class="me1">sendRedirect</span><span class="br0">&#40;</span>securedUrl<span class="br0">&#41;</span><span class="sy0">;</span>
                    <span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span>
                <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span><span class="kw3">Exception</span> ex<span class="br0">&#41;</span> <span class="br0">&#123;</span>
                    logger.<span class="me1">error</span><span class="br0">&#40;</span><span class="st0">&quot;Error redirecting to url...&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                    <span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span>
                <span class="br0">&#125;</span>
            <span class="br0">&#125;</span>
&nbsp;
            <span class="co1">// Do check for if this should not be a secure page, but is in https mode.</span>
&nbsp;
&nbsp;
            <span class="kw1">if</span><span class="br0">&#40;</span> p.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;securePage&quot;</span><span class="br0">&#41;</span>.<span class="me1">equals</span><span class="br0">&#40;</span><span class="st0">&quot;0&quot;</span><span class="br0">&#41;</span> <span class="sy0">&amp;&amp;</span> request.<span class="me1">isSecure</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">==</span> <span class="kw2">true</span><span class="br0">&#41;</span>
            <span class="br0">&#123;</span>
                logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;This page should be NOT be secured!&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                 <span class="kw3">String</span> regularUrl <span class="sy0">=</span> secureRedir.<span class="me1">returnRegularUrl</span><span class="br0">&#40;</span>request, request.<span class="me1">getRequestURI</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
                 <span class="kw1">try</span> <span class="br0">&#123;</span>
                    logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Redirecting to: &quot;</span> <span class="sy0">+</span> regularUrl<span class="br0">&#41;</span><span class="sy0">;</span>
                    response.<span class="me1">sendRedirect</span><span class="br0">&#40;</span>regularUrl<span class="br0">&#41;</span><span class="sy0">;</span>
                    <span class="kw1">return</span> <span class="kw2">true</span><span class="sy0">;</span>
                <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span><span class="kw3">Exception</span> ex<span class="br0">&#41;</span> <span class="br0">&#123;</span>
                    logger.<span class="me1">error</span><span class="br0">&#40;</span><span class="st0">&quot;Error redirecting to url... &quot;</span> <span class="sy0">+</span>ex.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                    <span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span>
                <span class="br0">&#125;</span>
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
        <span class="kw1">catch</span><span class="br0">&#40;</span><span class="kw3">Exception</span> e <span class="br0">&#41;</span><span class="br0">&#123;</span>
            <span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
        <span class="kw1">return</span> <span class="kw2">false</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="coMULTI">/*
     *
     * Adds the session bean to our web app session queue, so this can be
     * referred to throughout the application
     *
     * @param request
     * @param response
     * @return Returns the HttpSession instance
     **/</span>
&nbsp;
    <span class="kw1">public</span> HttpSession addSessionToQueue<span class="br0">&#40;</span>HttpServletRequest request, HttpServletResponse response <span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        HttpSession currentSession <span class="sy0">=</span> <span class="br0">&#40;</span>HttpSession<span class="br0">&#41;</span> request.<span class="me1">getSession</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        WebSessionBean cartSession <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span>
&nbsp;
        logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Total sessions: &quot;</span> <span class="sy0">+</span> webApp.<span class="me1">getActiveSessions</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw4">boolean</span> isSessioninQueue <span class="sy0">=</span> webApp.<span class="me1">isSessionInQueue</span><span class="br0">&#40;</span>currentSession.<span class="me1">getId</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">if</span><span class="br0">&#40;</span> <span class="sy0">!</span> isSessioninQueue <span class="br0">&#41;</span> <span class="br0">&#123;</span>
            cartSession <span class="sy0">=</span> <span class="kw1">new</span> WebSessionBean <span class="br0">&#40;</span> currentSession <span class="br0">&#41;</span><span class="sy0">;</span>
            webApp.<span class="me1">addSession</span><span class="br0">&#40;</span> cartSession <span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
&nbsp;
        <span class="kw1">if</span><span class="br0">&#40;</span> isSessioninQueue <span class="br0">&#41;</span> cartSession <span class="sy0">=</span> <span class="br0">&#40;</span>WebSessionBean<span class="br0">&#41;</span> webApp.<span class="me1">getSession</span><span class="br0">&#40;</span>currentSession.<span class="me1">getId</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="co1">// on the request for this particular user, make sure the session is included</span>
        <span class="co1">// with the shopping info, etc.</span>
        request.<span class="me1">setAttribute</span><span class="br0">&#40;</span> <span class="st0">&quot;sessionBean&quot;</span>, cartSession <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">return</span> cartSession<span class="sy0">;</span>
&nbsp;
    <span class="br0">&#125;</span>
&nbsp;
&nbsp;
&nbsp;
    <span class="co3">/**
     * Returns a PrintWriter with the current Html stream, after it has gone
     * through all redirects and filters.
     *
     * We do this by making a wrapper around the current html response and then
     * writing the current content after the  filters have been performed.
     * Once we have a writer we can then modify the response with whatever is
     * needed. Currently we modify the current response with the
     * velocity template engine, so we can also use VTL in a jsp or html.
     *
     * @param chain
     * @param request
     * @param response
     * @param writer
     * @return A PrintWriter with the modified html content.
     **/</span>
&nbsp;
    <span class="kw1">public</span> <span class="kw3">PrintWriter</span> getHtmlStream<span class="br0">&#40;</span>FilterChain chain, HttpServletRequest request, HttpServletResponse response, <span class="kw3">CharArrayWriter</span> writer <span class="br0">&#41;</span><span class="br0">&#123;</span>
        <span class="coMULTI">/****************************************************************
         * Add in our custom response wrapper, so all filters and content
         * are written to, then we can add in our own content once we
         * have the outputted content in string form.
         ****************************************************************/</span>
        <span class="kw3">PrintWriter</span> out <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">try</span>
        <span class="br0">&#123;</span>
            out <span class="sy0">=</span> response.<span class="me1">getWriter</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            CharRequestWrapper reqWrapper <span class="sy0">=</span> <span class="kw1">new</span> CharRequestWrapper<span class="br0">&#40;</span> request, request.<span class="me1">getRequestURI</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, request.<span class="me1">getRequestURL</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
            CharResponseWrapper respWrapper <span class="sy0">=</span> <span class="kw1">new</span> CharResponseWrapper<span class="br0">&#40;</span> response <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="coMULTI">/****************************************************************
             * If what was requested was an html page, then we need to
             * still retrieve the content based on the request, since we use
             * jsp as our presentation technology we still want to serve
             * up the content based on an html string.
             ****************************************************************/</span>
&nbsp;
            chain.<span class="me1">doFilter</span><span class="br0">&#40;</span>reqWrapper, respWrapper<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="coMULTI">/****************************************************************
             * If we have a 404, then we forward to the error pages...
             ****************************************************************/</span>
            <span class="kw4">boolean</span> sendErrorPage <span class="sy0">=</span> <span class="kw2">false</span><span class="sy0">;</span>
            <span class="kw1">if</span><span class="br0">&#40;</span> respWrapper.<span class="me1">getErrorCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">==</span> HttpServletResponse.<span class="me1">SC_NOT_FOUND</span> <span class="br0">&#41;</span> sendErrorPage <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span>
            <span class="kw1">if</span><span class="br0">&#40;</span> respWrapper.<span class="me1">getErrorCode</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">==</span> HttpServletResponse.<span class="me1">SC_INTERNAL_SERVER_ERROR</span> <span class="br0">&#41;</span> sendErrorPage <span class="sy0">=</span> <span class="kw2">true</span><span class="sy0">;</span>
&nbsp;
            <span class="kw1">if</span><span class="br0">&#40;</span> sendErrorPage <span class="br0">&#41;</span> respWrapper.<span class="me1">sendRedirect</span><span class="br0">&#40;</span>reqWrapper.<span class="me1">getContextPath</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;/engine/error/error.jsp&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp;
            writer.<span class="me1">write</span><span class="br0">&#40;</span> respWrapper.<span class="me1">getContent</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
&nbsp;
        <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span><span class="kw3">Throwable</span> ex<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            Logger.<span class="me1">getLogger</span><span class="br0">&#40;</span>ViewFilterEngine.<span class="kw1">class</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">log</span><span class="br0">&#40;</span>Level.<span class="me1">SEVERE</span>, <span class="kw2">null</span>, ex<span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span> 
&nbsp;
        <span class="kw1">return</span> out<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     *
     * @param htmlContent
     * @return
     */</span>
    <span class="kw1">public</span> <span class="kw3">CharArrayWriter</span> renderVelocity<span class="br0">&#40;</span><span class="kw3">String</span> htmlContent<span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
&nbsp;
        <span class="kw3">CharArrayWriter</span> outputVelocity <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">CharArrayWriter</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw1">try</span> <span class="br0">&#123;</span>
&nbsp;
&nbsp;
            Velocity.<span class="me1">evaluate</span><span class="br0">&#40;</span>velocityContext, outputVelocity, <span class="st0">&quot;log&quot;</span>, htmlContent<span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span><span class="kw3">Throwable</span> ex<span class="br0">&#41;</span> <span class="br0">&#123;</span>
            Logger.<span class="me1">getLogger</span><span class="br0">&#40;</span>ViewFilterEngine.<span class="kw1">class</span>.<span class="me1">getName</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">log</span><span class="br0">&#40;</span>Level.<span class="me1">SEVERE</span>, <span class="kw2">null</span>, ex<span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
&nbsp;
        <span class="kw1">return</span> outputVelocity<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     *
     * @return
     */</span>
    <span class="kw1">public</span> XMLToolboxManager getToolboxManager<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> toolboxManager<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     *
     * @param t
     */</span>
    <span class="kw1">public</span> <span class="kw4">void</span> setToolboxManager<span class="br0">&#40;</span>XMLToolboxManager t<span class="br0">&#41;</span> <span class="br0">&#123;</span>
         toolboxManager <span class="sy0">=</span> t<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     *
     */</span>
    <span class="kw1">public</span> <span class="kw4">void</span> destroy<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        webApp.<span class="me1">clearSessions</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     *
     * @return
     */</span>
    <span class="kw1">public</span> <span class="kw3">Map</span> getToolBox<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">return</span> toolBox<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     *
     * @param toolBox
     */</span>
    <span class="kw1">public</span> <span class="kw4">void</span> setToolBox<span class="br0">&#40;</span><span class="kw3">Map</span> toolBox<span class="br0">&#41;</span> <span class="br0">&#123;</span>
        <span class="kw1">this</span>.<span class="me1">toolBox</span> <span class="sy0">=</span> toolBox<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
&nbsp;
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


</div>
<p>A bread crumb tool, for creating breadcrumbs from a site map:</p>
<div style="height: 300px; overflow-y: scroll; ">


<div class="wp-geshi-highlight-wrap5"><div class="wp-geshi-highlight-wrap4"><div class="wp-geshi-highlight-wrap3"><div class="wp-geshi-highlight-wrap2"><div class="wp-geshi-highlight-wrap"><div class="wp-geshi-highlight"><div class="java"><pre class="de1">&nbsp;
<span class="kw1">package</span> <span class="co2">org.adk.java.viewfilter.tools</span><span class="sy0">;</span>
&nbsp;
<span class="kw1">import</span> <span class="co2">java.util.ArrayList</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.util.List</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.util.Map</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.util.Set</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">java.util.TreeMap</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.adk.java.log.KLogger</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.adk.java.web.sitemap.SiteDirectory</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.adk.java.web.sitemap.SiteMapBuilder</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.adk.java.web.sitemap.SitePage</span><span class="sy0">;</span>
<span class="kw1">import</span> <span class="co2">org.jdom.Attribute</span><span class="sy0">;</span>
&nbsp;
<span class="coMULTI">/***===============================================================================
 * The BreadCrumbTool generates a tree structure based on a site map xml file
 * located in the WEB-INF directory.
 * &lt;p&gt;
 * The way we do this, is through first using the {@link SiteMapBuilder} class which
 * generates a tree structure full of SiteDirectory and SitePage classes including
 * sub directories.
 * &lt;p&gt;
 * Then using the {@link SiteMapBuilder} class, we can retrieve the entire structure
 * in a TreeMap.
 * &lt;p&gt;
 * We then use velocity to create the breadcrumb as follows:&lt;br&gt;
 * =========================================================
 * &lt;p&gt;
 *   #set( $requestUri =  &quot;$requestTool.getRequest().getRequestURI()&quot; )
 *   #set ( $pageTitle = &quot;&quot;)
 *   #set ( $dirs = $breadcrumbTool.getDirectory( $requestUri  ) )
 *
 *    &lt;span  style=&quot;font-size: 10px; font-family: verdana&quot;&gt;
 *    #foreach ($dir in $dirs )
 *       #set ( $isDisplayed = &quot;$!dir.isDisplayed()&quot;)
 *
 *       &lt;a href=&quot;$dir.getFinalTreeUrl()&quot;&gt;$locale.get( &quot;$dir.getId()&quot; )&lt;/a&gt;
 *    #end
 *
 *&lt;p&gt;
 * What this does:&lt;br&gt;
 * ===============
 *&lt;p&gt;
 * It retrieves the entire directory object and puts it in $dirs.
 *&lt;p&gt;
 * We then loop through each directory and generate a link and we pull the
 * title of the directory using the $locale tool.
 *&lt;br&gt;
 * As a note - this class needs major refactoring. I recommend another
 * version that handles dynamic directory creation.
 *
 * @see SiteMapBuilder
 * 
 * @version 0.1
 * @author Austin Kottke
 * ===============================================================================*/</span>
&nbsp;
<span class="kw1">public</span> <span class="kw1">class</span> BreadCrumbTool <span class="kw1">extends</span> BaseTool <span class="br0">&#123;</span>
&nbsp;
    <span class="kw1">private</span> KLogger logger <span class="sy0">=</span> KLogger.<span class="me1">getLogger</span><span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="kw1">private</span> SiteMapBuilder primarySiteMap  <span class="sy0">=</span> <span class="kw1">new</span> SiteMapBuilder<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="kw1">private</span> <span class="kw3">String</span> siteMapXmlPath<span class="sy0">;</span>
&nbsp;
    <span class="co3">/**
     *
     */</span>
    <span class="kw1">public</span> <span class="kw4">void</span> BreadCrumbTool<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     *
     * @param params
     */</span>
    <span class="kw1">public</span> <span class="kw4">void</span> configure<span class="br0">&#40;</span><span class="kw3">Map</span> params<span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;configure() called.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        siteMapXmlPath <span class="sy0">=</span> params.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;siteMapXmlPath&quot;</span><span class="br0">&#41;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">;</span>
&nbsp;
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**
     *
     * @param requestUri
     */</span>
    <span class="kw1">public</span> <span class="kw4">void</span> get<span class="br0">&#40;</span> <span class="kw3">String</span> requestUri <span class="br0">&#41;</span><span class="br0">&#123;</span>
        <span class="kw1">if</span><span class="br0">&#40;</span> <span class="sy0">!</span> primarySiteMap.<span class="me1">isInitialized</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
            primarySiteMap.<span class="me1">buildSiteMap</span><span class="br0">&#40;</span> <span class="kw1">this</span>.<span class="me1">getServletFilePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> siteMapXmlPath <span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
&nbsp;
        generateBreadcrumb<span class="br0">&#40;</span>requestUri<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**===============================================================================
     * This is the primary entry point to retrieve the breadcrumb directory.
     *
     * It returns an arraylist based on where the page request is coming
     * from.
     *
     * @param requestUri
     * @return
     *===============================================================================*/</span>
&nbsp;
    <span class="kw1">public</span> <span class="kw3">ArrayList</span> getDirectory<span class="br0">&#40;</span> <span class="kw3">String</span> requestUri <span class="br0">&#41;</span><span class="br0">&#123;</span>
        logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;getDirectory() called.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">if</span><span class="br0">&#40;</span> <span class="sy0">!</span> primarySiteMap.<span class="me1">isInitialized</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span>
            primarySiteMap.<span class="me1">buildSiteMap</span><span class="br0">&#40;</span> <span class="kw1">this</span>.<span class="me1">getServletFilePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> siteMapXmlPath <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Servlet context name: &quot;</span> <span class="sy0">+</span> getServletContext<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getServletContextName</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw3">String</span> uriContextPath <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">getServletContextPath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw3">String</span> requestPath <span class="sy0">=</span> requestUri.<span class="me1">replace</span><span class="br0">&#40;</span>uriContextPath, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw3">ArrayList</span> b <span class="sy0">=</span> generateBreadcrumb<span class="br0">&#40;</span>requestPath<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="co1">// Build urls...</span>
        <span class="kw3">String</span> url <span class="sy0">=</span> <span class="st0">&quot;&quot;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw4">int</span> i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">&lt;</span>b.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> i<span class="sy0">++</span> <span class="br0">&#41;</span>
        <span class="br0">&#123;</span>
&nbsp;
            <span class="kw1">try</span>
            <span class="br0">&#123;</span>
                SiteDirectory dir <span class="sy0">=</span> <span class="br0">&#40;</span>SiteDirectory<span class="br0">&#41;</span> b.<span class="me1">get</span><span class="br0">&#40;</span>i<span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="kw1">if</span><span class="br0">&#40;</span> dir.<span class="me1">getDynamicPageId</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span> <span class="kw1">continue</span><span class="sy0">;</span>
&nbsp;
&nbsp;
                url <span class="sy0">+=</span> dir.<span class="me1">getUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                SitePage p <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span>
&nbsp;
                <span class="kw1">if</span><span class="br0">&#40;</span> dir.<span class="me1">getPages</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&gt;=</span> <span class="nu0">1</span> <span class="br0">&#41;</span>
                <span class="br0">&#123;</span>
                    <span class="kw3">String</span> pageKey <span class="sy0">=</span> dir.<span class="me1">getDefaultPage</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                    p <span class="sy0">=</span> dir.<span class="me1">getPages</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">get</span><span class="br0">&#40;</span>pageKey<span class="br0">&#41;</span><span class="sy0">;</span>
                    url <span class="sy0">+=</span> <span class="st0">&quot;/&quot;</span><span class="sy0">+</span>p.<span class="me1">getUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                <span class="br0">&#125;</span>
&nbsp;
                dir.<span class="me1">setFinalTreeUrl</span><span class="br0">&#40;</span>url.<span class="me1">replace</span><span class="br0">&#40;</span><span class="st0">&quot;.jsp&quot;</span>, <span class="st0">&quot;.html&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
                <span class="kw1">if</span><span class="br0">&#40;</span> dir.<span class="me1">getPages</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&gt;=</span> <span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
                    url <span class="sy0">=</span> url.<span class="me1">replace</span><span class="br0">&#40;</span><span class="st0">&quot;/&quot;</span><span class="sy0">+</span>p.<span class="me1">getUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                   <span class="co1">// logger.debug(&quot;Modified url: &quot; + url );</span>
                <span class="br0">&#125;</span>
&nbsp;
&nbsp;
            <span class="br0">&#125;</span> <span class="kw1">catch</span> <span class="br0">&#40;</span><span class="kw3">Exception</span> e <span class="br0">&#41;</span> <span class="br0">&#123;</span> <span class="br0">&#125;</span>
&nbsp;
        <span class="br0">&#125;</span>
&nbsp;
        <span class="kw3">List</span> newbreadcrumb <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">List</span><span class="br0">&#41;</span> getRequest<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getAttribute</span><span class="br0">&#40;</span><span class="st0">&quot;additionalbreadcrumb&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw1">if</span><span class="br0">&#40;</span> newbreadcrumb <span class="sy0">!=</span> <span class="kw2">null</span> <span class="br0">&#41;</span>
        <span class="br0">&#123;</span>
            <span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw4">int</span> j<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> j<span class="sy0">&lt;</span>newbreadcrumb.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> j<span class="sy0">++</span><span class="br0">&#41;</span>
                b.<span class="me1">add</span><span class="br0">&#40;</span> newbreadcrumb.<span class="me1">get</span><span class="br0">&#40;</span>j<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="br0">&#125;</span>
&nbsp;
        <span class="kw1">return</span> b<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="co3">/**===============================================================================
     * Let us say that you are adding in dynamic directories and do not want to
     * use the site map, you can add urls at request time so that the bread crumb
     * shows up properly.
     *
     * This is recommended to use in case of very dynamic cases, but otherwise you
     * should configure the SiteMap.xml file.
     *
     * @param localeId The current page locale id to be displayed to the end user
     * @param urlPath the Path to the service or url being generated.
     *===============================================================================*/</span>
&nbsp;
    <span class="kw1">public</span> <span class="kw4">void</span> addDirectory<span class="br0">&#40;</span><span class="kw3">String</span> localeId, <span class="kw3">String</span> urlPath<span class="br0">&#41;</span><span class="br0">&#123;</span>
        logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;addUrl() called.&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw3">List</span> breadcrumb <span class="sy0">=</span> getAdditionalBreadcrumb<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        SiteDirectory dir <span class="sy0">=</span> <span class="kw1">new</span> SiteDirectory<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        dir.<span class="me1">setId</span><span class="br0">&#40;</span>localeId<span class="br0">&#41;</span><span class="sy0">;</span>
        dir.<span class="me1">setFinalTreeUrl</span><span class="br0">&#40;</span> urlPath <span class="br0">&#41;</span><span class="sy0">;</span>
        dir.<span class="me1">setDynamicPageId</span><span class="br0">&#40;</span> <span class="st0">&quot;dynamic&quot;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
        breadcrumb.<span class="me1">add</span><span class="br0">&#40;</span>dir<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        getRequest<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">setAttribute</span><span class="br0">&#40;</span><span class="st0">&quot;additionalbreadcrumb&quot;</span>, breadcrumb<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="coMULTI">/***
     * Adds a page using the localeId as the name, this is primarily
     * used for static pages that do not change.
     * 
     * @param localeId
     */</span>
&nbsp;
    <span class="kw1">public</span> <span class="kw4">void</span> addPage<span class="br0">&#40;</span><span class="kw3">String</span> localeId <span class="br0">&#41;</span><span class="br0">&#123;</span>
        <span class="kw3">List</span> breadcrumb <span class="sy0">=</span> getAdditionalBreadcrumb<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        SitePage p <span class="sy0">=</span> <span class="kw1">new</span> SitePage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        p.<span class="me1">setId</span><span class="br0">&#40;</span> localeId <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        breadcrumb.<span class="me1">add</span><span class="br0">&#40;</span>p<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="coMULTI">/***
     * Used for dynamic pages that change the title based on a specific
     * attribute passed.
     * 
     * @param localeId
     * @param dynamicPageTitleAttribute
     */</span>
&nbsp;
     <span class="kw1">public</span> <span class="kw4">void</span> addPage<span class="br0">&#40;</span><span class="kw3">String</span> localeId, <span class="kw3">String</span> dynamicPageTitleAttribute <span class="br0">&#41;</span><span class="br0">&#123;</span>
        <span class="kw3">List</span> breadcrumb <span class="sy0">=</span> getAdditionalBreadcrumb<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        SitePage p <span class="sy0">=</span> <span class="kw1">new</span> SitePage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        p.<span class="me1">setId</span><span class="br0">&#40;</span> localeId <span class="br0">&#41;</span><span class="sy0">;</span>
        p.<span class="me1">setDynamicPageTitle</span><span class="br0">&#40;</span> dynamicPageTitleAttribute <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        breadcrumb.<span class="me1">add</span><span class="br0">&#40;</span>p<span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
    <span class="coMULTI">/***
     * Stores a bread crumb in the request attributes. Used primarily for
     * creating directories that are marked as dynamic. We then can
     * add on additional directories and subdirectories at will. Particularly
     * useful for pages that have very dynamic page structures.
     * 
     * @return List A breadcrumb list that will be added on to the end of the breadcrumb
     */</span>
    <span class="kw1">public</span> <span class="kw3">List</span> getAdditionalBreadcrumb<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
        <span class="kw3">List</span> breadcrumb <span class="sy0">=</span> <span class="kw2">null</span> <span class="sy0">;</span>
        <span class="kw1">try</span> <span class="br0">&#123;</span>
            <span class="kw1">if</span><span class="br0">&#40;</span> getRequest<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getAttribute</span><span class="br0">&#40;</span><span class="st0">&quot;additionalbreadcrumb&quot;</span><span class="br0">&#41;</span> <span class="sy0">!=</span> <span class="kw2">null</span> <span class="br0">&#41;</span>
                breadcrumb <span class="sy0">=</span> <span class="br0">&#40;</span><span class="kw3">List</span><span class="br0">&#41;</span>getRequest<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getAttribute</span><span class="br0">&#40;</span><span class="st0">&quot;additionalbreadcrumb&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw1">else</span>
                breadcrumb <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">ArrayList</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="br0">&#125;</span> <span class="kw1">catch</span><span class="br0">&#40;</span><span class="kw3">Exception</span> e <span class="br0">&#41;</span><span class="br0">&#123;</span><span class="br0">&#125;</span>
        <span class="kw1">return</span> breadcrumb<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
&nbsp;
    <span class="co3">/**
     *
     * @return
     */</span>
    <span class="kw1">public</span> SitePage getPage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
        <span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="coMULTI">/****************************************************************************
     * Creates the bread crumb.
     * 
     * @param requestUri
     * @return
     ****************************************************************************/</span>
    <span class="kw1">public</span> <span class="kw3">ArrayList</span> generateBreadcrumb<span class="br0">&#40;</span><span class="kw3">String</span> requestUri<span class="br0">&#41;</span><span class="br0">&#123;</span>
&nbsp;
        logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;generateBreadcrumb for: &quot;</span> <span class="sy0">+</span> requestUri<span class="br0">&#41;</span><span class="sy0">;</span>
        TreeMap<span class="sy0">&lt;</span>String,SiteDirectory<span class="sy0">&gt;</span>  map <span class="sy0">=</span> <span class="kw1">this</span>.<span class="me1">primarySiteMap</span>.<span class="me1">getSiteMap</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw3">Set</span> directorySet <span class="sy0">=</span> map.<span class="me1">entrySet</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw3">String</span> reqUri <span class="sy0">=</span> requestUri<span class="sy0">;</span>
&nbsp;
        <span class="co1">// Check if the action is in the request uri, which needs to be taken</span>
        <span class="co1">// out as this is not a top level directory</span>
        <span class="kw1">if</span><span class="br0">&#40;</span> requestUri.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;action&quot;</span><span class="br0">&#41;</span> <span class="sy0">&gt;=</span> <span class="nu0">0</span> <span class="br0">&#41;</span>
            reqUri <span class="sy0">=</span> requestUri.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;/action&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw3">String</span> <span class="br0">&#91;</span><span class="br0">&#93;</span> directories <span class="sy0">=</span> reqUri.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;/&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        SiteDirectory parentDir <span class="sy0">=</span> <span class="kw2">null</span><span class="sy0">;</span>
        <span class="kw3">ArrayList</span> breadcrumb <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">ArrayList</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        breadcrumb.<span class="me1">add</span><span class="br0">&#40;</span>map.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;dir_home&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Directory size: &quot;</span> <span class="sy0">+</span> directorySet.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw4">int</span> i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">&lt;</span>directorySet.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span> i<span class="sy0">++</span> <span class="br0">&#41;</span>  <span class="br0">&#123;</span>
            <span class="kw3">String</span> key <span class="sy0">=</span> directorySet.<span class="me1">toArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;=&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span>
            SiteDirectory d <span class="sy0">=</span> map.<span class="me1">get</span><span class="br0">&#40;</span>key<span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw3">String</span> topLeveldirectoryName <span class="sy0">=</span> d.<span class="me1">getUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">replace</span><span class="br0">&#40;</span><span class="st0">&quot;/&quot;</span>, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw4">int</span> k<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> k<span class="sy0">&lt;</span>directories.<span class="me1">length</span><span class="sy0">;</span> k<span class="sy0">++</span> <span class="br0">&#41;</span>
            <span class="br0">&#123;</span>
                <span class="kw3">String</span> directoryToFind <span class="sy0">=</span> directories<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">trim</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
                <span class="kw1">if</span><span class="br0">&#40;</span> directoryToFind.<span class="me1">length</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> <span class="nu0">1</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
                    <span class="kw1">if</span><span class="br0">&#40;</span> topLeveldirectoryName.<span class="me1">equals</span><span class="br0">&#40;</span>directoryToFind<span class="br0">&#41;</span><span class="br0">&#41;</span>
                    <span class="br0">&#123;</span>
                        logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Matching top level directory: &quot;</span> <span class="sy0">+</span> topLeveldirectoryName <span class="br0">&#41;</span><span class="sy0">;</span>
                        getFinalDirectoryStructure<span class="br0">&#40;</span>d, directories, breadcrumb, <span class="nu0">0</span><span class="br0">&#41;</span><span class="sy0">;</span>
                        <span class="kw1">return</span> breadcrumb<span class="sy0">;</span>
                    <span class="br0">&#125;</span>
                <span class="br0">&#125;</span>
            <span class="br0">&#125;</span>
&nbsp;
        <span class="br0">&#125;</span>
&nbsp;
&nbsp;
&nbsp;
        <span class="kw1">return</span> breadcrumb<span class="sy0">;</span>
    <span class="br0">&#125;</span>
&nbsp;
    <span class="coMULTI">/***===============================================================================
     * Generates the final directory used for the breadcrumb, this can include
     * any number of directories and a single page to send the url to.
     * 
     * @param dir 
     * @param requestPath
     * @param intDirIndex
     * @param breadcrumb
     * ===============================================================================*/</span>
&nbsp;
    <span class="kw1">public</span> <span class="kw4">void</span> getFinalDirectoryStructure<span class="br0">&#40;</span>SiteDirectory dir, <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> requestPath, <span class="kw3">ArrayList</span> breadcrumb, <span class="kw4">int</span> intDirIndex<span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        breadcrumb.<span class="me1">add</span><span class="br0">&#40;</span> dir <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw4">int</span> k<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> k<span class="sy0">&lt;</span>requestPath.<span class="me1">length</span><span class="sy0">;</span> k<span class="sy0">++</span> <span class="br0">&#41;</span>
        <span class="br0">&#123;</span>
            <span class="kw3">String</span> pathToFind <span class="sy0">=</span> requestPath<span class="br0">&#91;</span>k<span class="br0">&#93;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">trim</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="kw4">int</span> dirLength <span class="sy0">=</span> dir.<span class="me1">getSubcategories</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw4">int</span> pageLength <span class="sy0">=</span> dir.<span class="me1">getPages</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">size</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="kw3">Set</span> pages <span class="sy0">=</span> dir.<span class="me1">getPages</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">entrySet</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="kw3">Set</span> directories <span class="sy0">=</span> dir.<span class="me1">getSubcategories</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">entrySet</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="co1">//logger.debug(&quot;Current dir index: &quot; + dir.getId() );</span>
            <span class="co1">// Check directories and then check pages.</span>
            <span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw4">int</span> i<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> i<span class="sy0">&lt;</span>dirLength<span class="sy0">;</span> i<span class="sy0">++</span> <span class="br0">&#41;</span>
            <span class="br0">&#123;</span>
                <span class="kw3">String</span> dirKey <span class="sy0">=</span> directories.<span class="me1">toArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;=&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span>
                SiteDirectory d <span class="sy0">=</span> dir.<span class="me1">getSubcategories</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">get</span><span class="br0">&#40;</span>dirKey<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
                <span class="kw1">if</span><span class="br0">&#40;</span> pathToFind.<span class="me1">equals</span><span class="br0">&#40;</span> d.<span class="me1">getUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">replace</span><span class="br0">&#40;</span><span class="st0">&quot;/&quot;</span>, <span class="st0">&quot;&quot;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span>  <span class="br0">&#123;</span>
                    logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Directory: &quot;</span> <span class="sy0">+</span> d.<span class="me1">getDynamicPageId</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
                    getFinalDirectoryStructure<span class="br0">&#40;</span>d, requestPath, breadcrumb, i<span class="br0">&#41;</span><span class="sy0">;</span>
                    <span class="kw1">return</span><span class="sy0">;</span>
                <span class="br0">&#125;</span>
&nbsp;
            <span class="br0">&#125;</span>
&nbsp;
            <span class="co1">// Now go through the last few pages...</span>
            <span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw4">int</span> m<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> m<span class="sy0">&lt;</span>pageLength<span class="sy0">;</span> m<span class="sy0">++</span> <span class="br0">&#41;</span>
            <span class="br0">&#123;</span>
                <span class="kw3">String</span> pageKey <span class="sy0">=</span> pages.<span class="me1">toArray</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#91;</span>m<span class="br0">&#93;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;=&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="sy0">;</span>
                SitePage p <span class="sy0">=</span>  dir.<span class="me1">getPages</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">get</span><span class="br0">&#40;</span>pageKey<span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
                <span class="kw3">String</span> url <span class="sy0">=</span> p.<span class="me1">getUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
                <span class="kw1">if</span><span class="br0">&#40;</span> url.<span class="me1">equals</span><span class="br0">&#40;</span> requestPath<span class="br0">&#91;</span>k<span class="br0">&#93;</span><span class="br0">&#41;</span> <span class="sy0">||</span> url.<span class="me1">equals</span><span class="br0">&#40;</span> requestPath<span class="br0">&#91;</span>k<span class="br0">&#93;</span>.<span class="me1">replace</span><span class="br0">&#40;</span><span class="st0">&quot;.html&quot;</span>, <span class="st0">&quot;.jsp&quot;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="br0">&#123;</span>
                    logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Found a page match: [&quot;</span><span class="sy0">+</span>p.<span class="me1">getUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">&quot;] in directory: [&quot;</span><span class="sy0">+</span>dir.<span class="me1">getId</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">+</span><span class="st0">&quot;]&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
                    breadcrumb.<span class="me1">add</span><span class="br0">&#40;</span>p<span class="br0">&#41;</span><span class="sy0">;</span>
                    <span class="kw1">return</span><span class="sy0">;</span>
                <span class="br0">&#125;</span>
            <span class="br0">&#125;</span>
        <span class="br0">&#125;</span>
&nbsp;
    <span class="br0">&#125;</span>
&nbsp;
    <span class="coMULTI">/****************************************************************************
     * Builds a dynamic directory based on the requestUri. A store has
     * many categories and sub categories which are generated dynamically
     * and are not in the site map.
     * &lt;p&gt;
     * As a result of this, it is impossible if not tedious to create an entire
     * directory structure based on a possible directory structure that has
     * many infinite possibilities of shopping options.
     *&lt;p&gt;
     * So to generate the dynamic directory we simply build the structure based
     * on the uri and let the action handler correctly go to the correct directory
     * structure.
     *&lt;p&gt;
     * Example of a Directory:
     * ------------------------
     * &lt;p&gt;
     *
     * Home &gt; Store &gt; Books &gt; Fiction &gt; New and Used &gt; Foundation Series
     * &lt;p&gt;
     * As you can see the directory structure is very long and the categories
     * are built within Books to Fiction to New and Used.
     *
     * @deprecated Not used, use the addDirectory and addPage methods as these
     *             are less messy.
     ****************************************************************************/</span>
&nbsp;
    <span class="kw1">public</span> <span class="kw4">void</span> addDynamicDirectoryToBreadCrumb<span class="br0">&#40;</span> <span class="kw3">ArrayList</span> breadcrumb, SiteDirectory d, <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span> requestDirectories<span class="br0">&#41;</span>
    <span class="br0">&#123;</span>
        logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;addDynamicDirectoryToBreadCrumb() called: &quot;</span> <span class="sy0">+</span> d <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="co1">// ==============================================================================</span>
        <span class="co1">// We need to first find what the directory name is and in the current path array</span>
        <span class="co1">// contains the requestUri. We find the index into this path array so we can then</span>
        <span class="co1">// parse the remaining part of the array and build a dynamic directory with all</span>
        <span class="co1">// path info taken into account.</span>
        <span class="co1">// ==============================================================================</span>
        <span class="kw3">String</span> currentDirPathName <span class="sy0">=</span> d.<span class="me1">getUrl</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;/&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="sy0">;</span>
        <span class="kw4">int</span> currentDirectoryIndex <span class="sy0">=</span> <span class="nu0">0</span><span class="sy0">;</span>
        <span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw4">int</span> k<span class="sy0">=</span><span class="nu0">0</span><span class="sy0">;</span> k<span class="sy0">&lt;</span>requestDirectories.<span class="me1">length</span><span class="sy0">;</span> k<span class="sy0">++</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
            <span class="kw1">if</span><span class="br0">&#40;</span> requestDirectories<span class="br0">&#91;</span>k<span class="br0">&#93;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">equals</span><span class="br0">&#40;</span> currentDirPathName <span class="br0">&#41;</span> <span class="br0">&#41;</span> currentDirectoryIndex<span class="sy0">=</span>k<span class="sy0">;</span>
        <span class="br0">&#125;</span>
        <span class="co1">// ==============================================================================</span>
        <span class="co1">// Now we have the current directory index, we now need to build the correct</span>
        <span class="co1">// dynamic directory.</span>
        <span class="co1">//</span>
        <span class="co1">// The remaining directory names correspond to localeIds and refer to</span>
        <span class="co1">// an action service.</span>
        <span class="co1">// ==============================================================================</span>
        <span class="kw3">Attribute</span> e <span class="sy0">=</span> d.<span class="me1">getAttributeById</span><span class="br0">&#40;</span><span class="st0">&quot;dynamicUrl&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw3">String</span> previousUrl <span class="sy0">=</span> d.<span class="me1">getAttributeById</span><span class="br0">&#40;</span><span class="st0">&quot;previousUrl&quot;</span><span class="br0">&#41;</span>.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        SiteDirectory dynamicDir <span class="sy0">=</span> <span class="kw1">new</span> SiteDirectory<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        <span class="kw1">if</span><span class="br0">&#40;</span> previousUrl <span class="sy0">!=</span> <span class="kw2">null</span> <span class="br0">&#41;</span>
        dynamicDir.<span class="me1">setFinalTreeUrl</span><span class="br0">&#40;</span> getServletContextPath<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> previousUrl <span class="sy0">+</span> requestDirectories<span class="br0">&#91;</span>currentDirectoryIndex<span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
        dynamicDir.<span class="me1">setId</span><span class="br0">&#40;</span> requestDirectories<span class="br0">&#91;</span>currentDirectoryIndex<span class="sy0">+</span><span class="nu0">1</span><span class="br0">&#93;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
        dynamicDir.<span class="me1">setDynamicPageId</span><span class="br0">&#40;</span><span class="st0">&quot;dynamic&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
        breadcrumb.<span class="me1">add</span><span class="br0">&#40;</span> dynamicDir <span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
        <span class="kw1">for</span><span class="br0">&#40;</span> <span class="kw4">int</span> i<span class="sy0">=</span>currentDirectoryIndex<span class="sy0">+</span><span class="nu0">2</span><span class="sy0">;</span> i<span class="sy0">&lt;</span>requestDirectories.<span class="me1">length</span><span class="sy0">;</span> i<span class="sy0">++</span><span class="br0">&#41;</span>
        <span class="br0">&#123;</span>
            SiteDirectory newDynamicDir <span class="sy0">=</span> <span class="kw1">new</span> SiteDirectory<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
&nbsp;
            <span class="kw1">if</span><span class="br0">&#40;</span> requestDirectories<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;.html&quot;</span><span class="br0">&#41;</span> <span class="sy0">&lt;=</span> <span class="sy0">-</span><span class="nu0">1</span> <span class="br0">&#41;</span>
            <span class="br0">&#123;</span>
                newDynamicDir.<span class="me1">setId</span><span class="br0">&#40;</span> requestDirectories<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
                newDynamicDir.<span class="me1">setFinalTreeUrl</span><span class="br0">&#40;</span> getServletContextPath<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> e.<span class="me1">getValue</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;/&quot;</span> <span class="sy0">+</span> requestDirectories<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
                newDynamicDir.<span class="me1">setDynamicPageId</span><span class="br0">&#40;</span><span class="st0">&quot;dynamic&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Directories: &quot;</span> <span class="sy0">+</span>requestDirectories<span class="br0">&#91;</span>i<span class="br0">&#93;</span> <span class="br0">&#41;</span><span class="sy0">;</span>
                breadcrumb.<span class="me1">add</span><span class="br0">&#40;</span> newDynamicDir <span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
&nbsp;
            <span class="co1">// This is a page, add a site page to the breadcrumb.</span>
            <span class="kw1">if</span><span class="br0">&#40;</span> requestDirectories<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">indexOf</span><span class="br0">&#40;</span><span class="st0">&quot;.html&quot;</span><span class="br0">&#41;</span> <span class="sy0">&gt;=</span> <span class="nu0">0</span> <span class="br0">&#41;</span>
            <span class="br0">&#123;</span>
                SitePage p <span class="sy0">=</span> <span class="kw1">new</span> SitePage<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                p.<span class="me1">setId</span><span class="br0">&#40;</span>requestDirectories<span class="br0">&#91;</span>i<span class="br0">&#93;</span>.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;.html&quot;</span><span class="br0">&#41;</span><span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="sy0">;</span>
                breadcrumb.<span class="me1">add</span><span class="br0">&#40;</span>p<span class="br0">&#41;</span><span class="sy0">;</span>
            <span class="br0">&#125;</span>
&nbsp;
        <span class="br0">&#125;</span>
&nbsp;
        logger.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;Index: &quot;</span> <span class="sy0">+</span> currentDirectoryIndex <span class="br0">&#41;</span><span class="sy0">;</span>
    <span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div></div></div></div></div></div></div>


</div>
<p>If anyone wants the source let me know =)</p>
<p>Austin</p>
]]></content:encoded>
			<wfw:commentRss>http://austinkottke.com/news/2011/01/28/j2ee-filter-that-modifies-the-a-stripes-request-for-velocity-rendering/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>JAR like use in Flash? Use mxmlc -load-externs</title>
		<link>http://austinkottke.com/news/2011/01/27/jar-like-use-in-flash-use-mxmlc-load-externs/</link>
		<comments>http://austinkottke.com/news/2011/01/27/jar-like-use-in-flash-use-mxmlc-load-externs/#comments</comments>
		<pubDate>Thu, 27 Jan 2011 17:35:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://ianimation.net/news/?p=46</guid>
		<description><![CDATA[For the last few years I&#8217;ve been developing in flex. One of the very nice features is RSLs to save...]]></description>
			<content:encoded><![CDATA[<p>For the last few years I&#8217;ve been developing in flex. One of the very nice features is RSLs to save on file space, but no matter how much optimization work you end up with a huge SWF right? Which is why developers end up using flash for web development. </p>
<p>How many times have you wanted to use the RPC components but ended up scrapping them because they bloat your SWFs? I&#8217;ve had to resort to custom AS3 soap libraries, or even have had to hack an existing AS3 web service implementation because it wasn&#8217;t compatible with ALL SOAP specs, as in each server has little nuances which can potentially break an AS3 implementation. The joys =)</p>
<p>Ive been doing a lot of flash dev recently, and one option which I think a lot of flash developers miss over is the fact that they compile assets within assets that are shared across multiple SWF files. E.g. you have the Pure MVC framework or cairngorm classes compiled into 5 swfs, when really, all you need to load in a single shell SWF and all future SWF files can reference the classes normally WITHOUT compiling in the entire framework.</p>
<p>So how do you do this? How do you make your other SWFs not compile the entire framework such as ui components and buttons and flash?</p>
<p>Well, instead of doing all the runtime instantiation and non strong typing &#8211; you know like var myClass:* &#8211; which is prone to errors, use mxmlc -load-externs.</p>
<p>So the steps are as follows:</p>
<ol>
<li>Create main loader SWF that uses the majority of the framework, ui components etc.</li>
<li>Generate link-report XML using ant:  &lt;mxmlc &#8230; link-report=&#8221;shell-link-report.xml&#8221;</li>
<li>In your ant build file, when compiling all sub-module swfs, compile all module swfs using load-externs=shell-link-report.xml.</li>
</ol>
<p>By doing these very simple steps you can reduce legacy swf projects by half sometimes simply because when using the Flash IDE it does not natively create this for you.</p>
]]></content:encoded>
			<wfw:commentRss>http://austinkottke.com/news/2011/01/27/jar-like-use-in-flash-use-mxmlc-load-externs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tutorial: Build Twitter with Groovy Grails in 90 Minutes</title>
		<link>http://austinkottke.com/news/2011/01/17/tutorial-build-twitter-with-groovy-grails-in-90-minutes/</link>
		<comments>http://austinkottke.com/news/2011/01/17/tutorial-build-twitter-with-groovy-grails-in-90-minutes/#comments</comments>
		<pubDate>Tue, 18 Jan 2011 05:51:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://ianimation.net/news/?p=37</guid>
		<description><![CDATA[I found an awesome video that came out last month from one of the Spring Source engineers on building an...]]></description>
			<content:encoded><![CDATA[<p>I found an awesome video that came out last month from one of the Spring Source engineers on building an entire application in Grails.</p>
<p>I think if anything this video shows the true simplicity of grails. It outlines security, ajax, authentication, jdbc, validation and how fast it is to develop with grails. You see how robust and quick to develop a data-base driven twitter clone. </p>
<p><iframe width="480" height="295" src="http://www.youtube.com/embed/8d1hp8n1stA?fs=1" frameborder="0"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://austinkottke.com/news/2011/01/17/tutorial-build-twitter-with-groovy-grails-in-90-minutes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Grails &#8211; Making flex/java developers happy</title>
		<link>http://austinkottke.com/news/2011/01/13/grails-making-flexjava-developers-happy/</link>
		<comments>http://austinkottke.com/news/2011/01/13/grails-making-flexjava-developers-happy/#comments</comments>
		<pubDate>Fri, 14 Jan 2011 00:34:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[flex]]></category>
		<category><![CDATA[grails]]></category>
		<category><![CDATA[html]]></category>

		<guid isPermaLink="false">http://ianimation.net/news/?p=35</guid>
		<description><![CDATA[I come from a myriad of development backgrounds, actually started doing C/8086 assembly back in the day. Went into playstation...]]></description>
			<content:encoded><![CDATA[<p>I come from a myriad of development backgrounds, actually started doing C/8086 assembly back in the day. Went into playstation development, and then moved onto flash, qt c++, win 32, java, and ajax.</p>
<p>I developed heavily in java for the last few years and stumbled upon rails &#8211; couldn&#8217;t stand the syntax although I loved the power and the scaffolding. I then discovered grails and man this is like a new world. The power of ruby on rails but in a java-like syntax. </p>
<p>The key problems I see in web development are:</p>
<p>1. Properly planning the development project<br />2. Allocating enough time to do the project without shortcutting it<br />3. Implementing the project in the time allotted<br />4. Getting management to work with the clients to properly allocate enough time/money to spend on the lifecycle without shortcutting the features</p>
<p>I think projects that are heavily ajax/html or flex projects can be GREATLY simplified by using grails as it writes a lot of the code for you and can really make some of the back-end development which we never want to do a breeze and very integrated.</p>
<p>The problem with writing entity beans in java is that the annotations and amount of code written pales in comparison to a grails entity bean and how simple it is to add validation, etc.</p>
<p>I plan to do some more examples as I get more and more familiar with the grails code base. </p>
<p>Check it out: http://www.grails.org/</p>
]]></content:encoded>
			<wfw:commentRss>http://austinkottke.com/news/2011/01/13/grails-making-flexjava-developers-happy/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

