<?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>Andy Gibson &#187; JEE</title>
	<atom:link href="http://www.andygibson.net/blog/tag/jee/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.andygibson.net/blog</link>
	<description>Open Source Projects &#38; Technical Writings</description>
	<lastBuildDate>Fri, 30 Jul 2010 02:42:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>FlutterCode.com released</title>
		<link>http://www.andygibson.net/blog/news/fluttercode-com-released/</link>
		<comments>http://www.andygibson.net/blog/news/fluttercode-com-released/#comments</comments>
		<pubDate>Tue, 29 Jun 2010 02:48:18 +0000</pubDate>
		<dc:creator>Andy Gibson</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Blog]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[Geek]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Podcast]]></category>

		<guid isPermaLink="false">http://www.andygibson.net/blog/?p=919</guid>
		<description><![CDATA[I&#8217;ve been fairly quiet over the last couple of months as I&#8217;ve been working on a few items, working on a new site and working on getting two new Open Source projects final and out the door. 
I&#8217;ve renamed Spigot to DataValve, and moved it to the new site FlutterCode.com which will also host my [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been fairly quiet over the last couple of months as I&#8217;ve been working on a few items, working on a <a href="http://www.fluttercode.com">new site</a> and working on getting two new Open Source projects final and out the door. </p>
<p>I&#8217;ve renamed Spigot to <a href="http://www.fluttercode.com/projects/datavalve">DataValve</a>, and moved it to the new site FlutterCode.com which will also host my other project called <a href="http://www.fluttercode.com/projects/knappsack">Knappsack</a> which is a set of Maven archetypes for Java EE 6.</p>
<p>The new site will be home to most of my tutorials, articles and other writings, as well as possibly some screencasts and even podcasts. It will in essence be a pure java development site. This blog will go a bit quieter and contain less development stuff, although most opinion will get put out here instead of over there. I&#8217;ll also be copying some of my tutorials over there from this blog.</p>
<p>I&#8217;m aiming to create a fairly cohesive tutorial site, aided in part by the Maven Archetypes which will give me a firm base onto which I can build tutorials without having to start from scratch, but one archetype is a sandbox Java EE 6 app with project configuration, a demo model and some test data. The sandbox app will let developers create a new skeleton java EE 6 application they can play with. Building on that, there is a sandbox-demo application which as an archetype that creates a full working demo CRUD application using Java EE 6 so developers can see how all the different pieces of Java EE 6 go together. It includes features such as conversations, JPA CRUD, page parameters, CDI injection and events.</p>
<p>Again, I have to say it, but  <a href="http://www.andygibson.net/blog/index.php/2009/07/12/open-source-is-hard/">Open Source is Hard</a>. In the past couple of months, I have been working on a whole new site, getting 2 projects ready to roll with documentation and site content to boot as well as working a job, and having some kind of life.</p>
<p>Now it&#8217;s out, I can start to focus a little more on getting some more Java EE 6 tutorials and articles out.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andygibson.net/blog/news/fluttercode-com-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Guide to Spigot For Seam Developers</title>
		<link>http://www.andygibson.net/blog/article/spigot-for-seam-developers/</link>
		<comments>http://www.andygibson.net/blog/article/spigot-for-seam-developers/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 17:00:57 +0000</pubDate>
		<dc:creator>Andy Gibson</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Project Kenai]]></category>
		<category><![CDATA[Seam]]></category>
		<category><![CDATA[Spigot]]></category>
		<category><![CDATA[Weld]]></category>
		<category><![CDATA[Wicket]]></category>

		<guid isPermaLink="false">http://www.andygibson.net/blog/?p=874</guid>
		<description><![CDATA[Note : Spigot has been renamed to DataValve.
(Edit : I renamed this post so it doesn&#8217;t seem like Spigot is just for Seam, Spigot can be used with different frameworks or without any at all. However, I wrote this post since Spigot is so familiar to the Seam EntityQuery that it should be easy for [...]]]></description>
			<content:encoded><![CDATA[<p><b>Note</b> : Spigot has been renamed to <a href="http://www.fluttercode.com/projects/datavalve/">DataValve</a>.</p>
<p>(<small><b>Edit </b>: I renamed this post so it doesn&#8217;t seem like Spigot is just for Seam, Spigot can be used with different frameworks or without any at all. However, I wrote this post since Spigot is so familiar to the Seam EntityQuery that it should be easy for Seam users to get the idea</small>)</p>
<p>Seam developers should become familiar with <a href="http://kenai.com/projects/spigot/">Spigot</a> concepts fairly quickly since they are very similar to those found in the Seam <code>EntityQuery</code> which was one of the main inspirations for the framework. If you imagine taking the entity query class and splitting it in two, one part to keep hold of state and the other to actually fetch the data. The stateful part is the <code>Paginator</code> that keeps track of what the current ordering of the data is, what is the current page and how big the pages are. The stateless part takes the Ejbql and the pagination information and returns a subset of the data. Now imaging that the data provider has the JPA pieces taken out and replaced with an abstract <code>fetchResults</code> method. This method is implemented in subclasses for specific data providers for text files, sql queries, jpa queries, native jpa queries, xml files, comma delimited or just an in memory dataset.<br />
<span id="more-874"></span><br />
I also abstracted the concepts of parameterization and parameter resolution so you can have parameters on data providers that are no t query based and your parameters can be resolved using different mechanisms such as EL, reflection, a map, or using custom parameter resolution.<br />
So really, for Seam developers, its like a Seam <code>EntityQuery</code> that doesn&#8217;t just use JPA, but uses any kind of data source you want but still returns just a list of objects.</p>
<p>Spigot works nicely with CDI and there is even a demo of it in the distribution that uses JSF and was generated using the Weld maven archetypes. Also, there is a Seam Jpa Dataset Adapter that you can use as a direct replacement for the <code>EntityQuery</code> which will adapt the entity query calls to the underlying data provider calls so you can have a seam-less transition if you want to switch over. This is still a little in-progress, but works. The one area that isn&#8217;t implemented is the sorting, which may not be possible, but I still need to add in the methods to the adapter even if they don&#8217;t do anything. The other issue is of course the configuration of the query from components.xml using the Seam Framework tags. However, you can define the query using regular component xml tags to define the Ejbql, restrictions and page sizes.</p>
<p>Two things to note if you start using Spigot in place of the entity query. All rows are returned by default, and you need to specify both a select statement and a count statement. I separated those two out so you can put join fetch phrases in the select statement without it breaking the count statement. There is an <code>init</code> method that you can use to set both of these statements for a class type.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andygibson.net/blog/article/spigot-for-seam-developers/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Spigot 0.9.CR1 released</title>
		<link>http://www.andygibson.net/blog/news/spigot-0-9-cr1-released/</link>
		<comments>http://www.andygibson.net/blog/news/spigot-0-9-cr1-released/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 13:07:55 +0000</pubDate>
		<dc:creator>Andy Gibson</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[Personal]]></category>
		<category><![CDATA[Seam]]></category>
		<category><![CDATA[Spigot]]></category>
		<category><![CDATA[Weld]]></category>
		<category><![CDATA[Wicket]]></category>

		<guid isPermaLink="false">http://www.andygibson.net/blog/?p=861</guid>
		<description><![CDATA[Note : Spigot has been renamed to DataValve and is hosted over on FlutterCode.com.
It&#8217;s been a while since I&#8217;ve posted anything new as I&#8217;ve been busy with a new Open Source software project called Spigot. It&#8217;s a java library that sits between your application code and your data sources (Hibernate, JPA, JDBC or any arbitrary [...]]]></description>
			<content:encoded><![CDATA[<p><b>Note</b> : Spigot has been renamed to <a href="http://www.fluttercode.com/projects/datavalve/">DataValve</a> and is hosted over on <a href="http://www.fluttercode.com">FlutterCode.com</a>.</p>
<p>It&#8217;s been a while since I&#8217;ve posted anything new as I&#8217;ve been busy with a new Open Source software project called Spigot. It&#8217;s a java library that sits between your application code and your data sources (Hibernate, JPA, JDBC or any arbitrary source of data) and helps with things like pagination and sorting using a common interface so you can switch out data providers and use alternatives. </p>
<p>For query language data providers, Spigot also facilitates excluding restrictions from WHERE clauses when parameters are resolved to null. Parameters are handled using parameter resolvers so there is more than one way to parameterize the query including EL expressions, reflection or a value map on the data provider.</p>
<p>Spigot also provides a few other add-ins like converting any dataset into an in-memory dataset that can itself be paginated and sorted and shared across an application (such as commonly used data in a web application). The <code>IndexedDataProviderCache</code> can give you random access into a dataset with caching and look ahead loading. This lets you hook a dataset with thousands of rows up to a Swing JTable with an instant response and a very small memory footprint since it doesn&#8217;t need to load all the objects at once as the provider will load the records as needed and cache the results. This is demonstrated in the Swing Demo in the download. There are also demos for Wicket and CDI with JSF.</p>
<p>You can ready about why I created Spigot in the <a href="http://spigot.kenai.com/docs/html/pr01.html">documentation</a></p>
<p>Spigot is currently hosted on <a href="http://www.projectkenai.com/projects/spigot/">Project Kenai</a>, where you can download the release, view documentation online or read about <a href="http://kenai.com/projects/spigot/pages/10WaysSpigotHelpsDevelopers">10 ways Spigot helps developers</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andygibson.net/blog/news/spigot-0-9-cr1-released/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Weld 1.0.1-CR2 is available</title>
		<link>http://www.andygibson.net/blog/news/weld-1-0-1-cr2-is-available/</link>
		<comments>http://www.andygibson.net/blog/news/weld-1-0-1-cr2-is-available/#comments</comments>
		<pubDate>Sun, 14 Feb 2010 17:28:54 +0000</pubDate>
		<dc:creator>Andy Gibson</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JSF]]></category>

		<guid isPermaLink="false">http://www.andygibson.net/blog/?p=830</guid>
		<description><![CDATA[Dan Allen posted that the latest CR version of Weld is available. This should contain a number of bug fixes from the initial release of Weld, including the two problems I had with the request scope being available in EJB timeouts and problems with the ability to proxy stateless beans. This last bug was for [...]]]></description>
			<content:encoded><![CDATA[<p>Dan Allen <a href="http://in.relation.to/14291.lace">posted</a> that the latest CR version of Weld is available. This should contain a number of bug fixes from the initial release of Weld, including the two problems I had with the request scope being available in EJB timeouts and problems with the ability to proxy stateless beans. This last bug was for me rather crucial since there was no easy way to implement DAO (just data management) type components with transactional annotations that could be injected into business logic beans. Without that, you end up having to write your own transaction handling code. </p>
<p>Also in the comments of the announcement, Max Anderson notes that the nightly builds of JBoss Tools 3.1 now supports CDI auto completion and JSF 2.0. I had a very quick look at it yesterday and it looks promising. I also tried it out with the latest JBoss 6 snapshot and am very pleased to say that the redeployment times on JBoss 6 are much faster and more in line with the performance on  Glassfish which is something I have raved about. </p>
<p>I&#8217;ll be looking at it some more and probably write up a couple of tutorial posts. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.andygibson.net/blog/news/weld-1-0-1-cr2-is-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Started with JSF 2.0 and CDI part 3 &#8211; Events</title>
		<link>http://www.andygibson.net/blog/tutorial/getting-started-with-jsf-2-0-and-cdi-part-3/</link>
		<comments>http://www.andygibson.net/blog/tutorial/getting-started-with-jsf-2-0-and-cdi-part-3/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 13:26:45 +0000</pubDate>
		<dc:creator>Andy Gibson</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Articles]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[Weld]]></category>

		<guid isPermaLink="false">http://www.andygibson.net/blog/?p=728</guid>
		<description><![CDATA[Last time we looked more in depth at CDI and how we can define beans and inject them into other beans. This time we are going to look at how we can use events to decouple the handling of actions in the system.

Read Part 1
Read Part 2
Read Part 3
As a refresher, in our last part, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.andygibson.net/blog/index.php/2009/12/22/getting-started-with-cdi-part-2-injection/">Last time</a> we looked more in depth at CDI and how we can define beans and inject them into other beans. This time we are going to look at how we can use events to decouple the handling of actions in the system.<br />
<span id="more-728"></span><br />
Read <a href="http://www.andygibson.net/blog/tutorial/getting-started-with-jsf-2-0-and-cdi-in-jee-6-part-1/">Part 1</a><br />
Read <a href="http://www.andygibson.net/blog/tutorial/getting-started-with-cdi-part-2-injection/">Part 2</a><br />
Read <a href="http://www.andygibson.net/blog/tutorial/getting-started-with-jsf-2-0-and-cdi-part-3/">Part 3</a></p>
<p>As a refresher, in our last part, we had an application that obtained a list of items, validated them and took a specific action when an invalid item was found. Lets say in the future we want to expand our system to handle all sorts of things happening when we find an invalid item. This could range from an email being sent, changes made to other data (i.e. an order canceled) or storing a list of rejections in a file or database table. To completely decouple the implementation we can use events. Events are raised by the event producer and subscribed to by event observers. Like most of CDI, event production and subscription is type safe and allows qualifiers to determine which events observers will observe.
</p>
<p>
Luckily we don&#8217;t have to change our application much to implement this, we just provide an implementation of the <code>ItemErrorHandler</code> that raises the event when it handles the item. We will inject an instance of the Item error handler called <code>EventErrorHandler</code> and create a <code>@Notify</code> qualifier to select it for injection.
</p>
<pre class="brush: java;">
@Retention(RetentionPolicy.RUNTIME)
@Target({FIELD,METHOD,PARAMETER,TYPE})
@Qualifier
public @interface Notify {}
</pre>
<pre class="brush: java;">
@Notify
public class EventItemHandler implements ItemErrorHandler {

    @Inject
    private Event&amp;lt;Item&amp;gt; itemEvent;

    public void handleItem(Item item) {
        System.out.println(&quot;Firing Event&quot;);
        itemEvent.fire(item);
    }
}
</pre>
<p>In this item handler, we inject an instance of an Event where the event payload will be an <code>Item</code>. The event payload is the state data passed from the event producer to the event observer which in this case passes the rejected Item. When the invalid item is handled, we fire the event and pass in the invalid item we received. This event based item handler is injected the same as any other item handler would be so we can swap it in and out whenever we need to and also can substitute it during testing.  We created a <code>@Notify</code> qualifier annotation to identify this error handler for injection and can use it in our item processor by adding it to the injection point.</p>
<pre class="brush: java;">
    @Inject
    @Notify
    private ItemErrorHandler itemErrorHandler;
</pre>
<p>If we deploy this now, we will see that when the item processor hits invalid items, the event based item error handler fires the event. Currently though we don&#8217;t have anything observing the event. We can fix this by creating an observer method which is the only thing needed to observe an event. We can still re-use our existing item processors by adding an event observer method to the implementations which just calls the error handler method. For example, to make our <code>FileErrorReporter</code> respond to the event, we add the following observer event.</p>
<pre class="brush: java;">
public class FileErrorReporter implements ItemErrorHandler,Serializable {

    public void eventFired(@Observes Item item) {
        handleItem(item);
    }
    ....
    ....
</pre>
<p>If you run the application now, you will see that the events are fired on the invalid objects, and the item information is being saved when this event is fired. You will also note that the lifecycle events are being observed. </p>
<pre class="brush: plain;">
INFO: Firing Event
INFO: Creating file error reporter
INFO: Saving eedemo.Item@1f84b46 [Value=34, Limit=7] to file
INFO: Closing file error reporter
INFO: Firing Event
INFO: Creating file error reporter
INFO: Saving eedemo.Item@2656da [Value=89, Limit=32] to file
INFO: Closing file error reporter
</pre>
<p>Note that the file error reporter bean is created each time the event is raised which may or may not be what we want. In this case, we don&#8217;t want to create the bean new each time since we don&#8217;t want to open and close the file for each item. We still want to open the file at the start of the process, and then close it once the process it completed. In this case, we need to consider the scope of the <code>FileErrorReporter</code> bean which doesn&#8217;t have a scope defined. When no scope is defined, CDI defaults it to the default pseudo dependent scope. What this means in practice is that the bean is created and destroyed over a very short space of time, typically over a method call. In our case here, the bean is created and destroyed for the duration of the event being fired. To fix this, we need to lengthen the scope of the bean by manually adding a scope annotation. We will make this bean <code>@RequestScoped</code> so once the bean is created the first time the event is fired, it will remain created for the duration of the request. Also, for any injection points that this bean is qualified to be injected to, the same bean instance will be injected. Here is the log when we make our scope change to the bean. Note that the bean is still only created when the event is fired. </p>
<pre class="brush: plain;">
INFO: Firing Event
INFO: Creating file error reporter
INFO: Saving eedemo.Item@1380c08 [Value=34, Limit=7] to file
INFO: Firing Event
INFO: Saving eedemo.Item@1b44f96 [Value=89, Limit=32] to file
INFO: Closing file error reporter
</pre>
<p>Let&#8217;s take the events example a little further. Right now we are observing any event for an item but chances are, there may be different types of events in the system for the items. We want to be specific in which observers subscribe to which events. Luckily CDI provides for this in a similar manner to how we determine suitable beans for injection points by using typing and qualifiers. </p>
<p>First, lets create a problem for ourselves by firing events off for each item we validate by adding the following code to the item processor.</p>
<pre class="brush: java;">
    @Inject
    private Event&amp;lt;Item&amp;gt; processorEvent;

    public void execute() {
        List&amp;lt;Item&amp;gt; items = itemDao.fetchItems();
        for (Item item : items) {
            processorEvent.fire(item);
            if (!itemValidator.isValid(item)) {
                itemErrorHandler.handleItem(item);
            }
        }
    }
</pre>
<p>This will fire an event for each item we process, but we don&#8217;t want the invalid item handler to subscribe to each of those events. If we do, we will see output like the following : </p>
<pre class="brush: plain;">
INFO: Creating eedemo.EventItemHandler_$$_javassist_748
INFO: Creating file error reporter
INFO: Saving eedemo.Item@6d0baf [Value=34, Limit=7] to file
INFO: Creating eedemo.EventItemHandler
INFO: Firing Event
INFO: Saving eedemo.Item@6d0baf [Value=34, Limit=7] to file
INFO: Saving eedemo.Item@1087300 [Value=4, Limit=37] to file
INFO: Saving eedemo.Item@11674c9 [Value=24, Limit=19] to file
INFO: Saving eedemo.Item@de163a [Value=89, Limit=32] to file
INFO: Firing Event
INFO: Saving eedemo.Item@de163a [Value=89, Limit=32] to file
INFO: Closing file error reporter
</pre>
<p>For each item, the file item handler observer is being called for each item because we aren&#8217;t distinguishing the kind of events fired when the item is processed and the kind of event fired when an invalid item is found. To differentiate between them we will create an <code>@Invalidate</code> qualifier to qualify the event for invalid items. This annotation will be placed on the event injection point and also on the observation point method. </p>
<pre class="brush: java;">
@Notify
@RequestScoped
public class EventItemHandler implements ItemErrorHandler {

    @Inject @Invalidated
    private Event&amp;lt;Item&amp;gt; itemEvent;

    public void handleItem(Item item) {
        System.out.println(&quot;Firing Event&quot;);
        itemEvent.fire(item);
    }
}
</pre>
<pre class="brush: java;">
@Save
@RequestScoped
public class FileErrorReporter implements ItemErrorHandler,Serializable {

    public void eventFired(@Observes @Invalidated Item item) {
        handleItem(item);
    }

    ....

}
</pre>
<p>If you run the code now, you will see that we no longer call the file save handler for each item, even though we are firing the event for each item.</p>
<pre class="brush: plain;">
INFO: Firing Event
INFO: Creating file error reporter
INFO: Saving eedemo.Item@1e3aa22 [Value=34, Limit=7] to file
INFO: Firing Event
INFO: Saving eedemo.Item@172940f [Value=89, Limit=32] to file
INFO: Closing file error reporter
</pre>
<p>You can add an event observer to the item processor just to see the events are still being raised and can be observed.</p>
<pre class="brush: java;">
@Named(&quot;itemProcessor&quot;)
@RequestScoped
public class ItemProcessor {

    ....

    public void observeItemEvent(@Observes Item item) {
        System.out.println(&quot;Item event observed for item &quot;+item);
    }
}
</pre>
<p>This will print a message whenever an event is fired so you can see that there is a difference between the two event subscribers and also that the more general version of the observer sees all events related to the item.</p>
<p>Events are a great way to decouple parts of the system in a modular fashion as you can add pieces that will subscribe to events with the event producer unaware of the observer as opposed to the even producer having to call the observer manually when events are not used. For example, if someone updates an order status, you could add events to email the sales rep, or notify an account manager if a tech support issue is open for more than a week. These kinds of rules can be implemented without events, but events make it easier to decouple the business logic. Additionally, there is no compile or build time dependency and you can just add modules to your application and they will automatically start observing and producing events. Additionally, observers and producers know nothing about each other, nor do they require any configuration for them to do so.</p>
<h4>Scheduling the Processing</h4>
<p>One last tidbit before we move on to creating CDI driven JSF apps is that for now we are running our code from a button in a JSF page but typically this is something that would get fired off on a regular basis. With the power of the EJB 3.1 scheduler we can do just that in a new class with few lines of code. We&#8217;ll create a new stateless EJB into which  we&#8217;ll inject our <code>ItemProcessor</code> and add a method to call the <code>execute()</code> method which will be called at a scheduled time.</p>
<pre class="brush: java;">
@Stateless
public class ScheduledProcessor {

    @Inject
    private ItemProcessor itemProcessor;

    @Schedule(hour=&quot;07&quot;,minute = &quot;00&quot;)
    public void execute() {
        System.out.println(&quot;executing scheduled job!&quot;);
        itemProcessor.execute();
    }
}
</pre>
<p>This makes use of the new EJB 3.1 <code>@Schedule</code> annotation and will schedule this method to be called every morning at 7am. You could make it on the hour every hour, or you could use the EJB timer service to implement your own timeout. We inject the same <code>ItemProcessor</code> implementation we have been using all along and call the <code>execute()</code> method. That is a pretty powerful transformation letting us re-use our existing code and easily incorporating EJB services with POJO managed beans into an EJB needing only a few lines of code.</p>
<p><small><b>Note</b> : If you actually implement this and run it, it won&#8217;t work because of a Weld 1.0 bug whereby the request scope isn&#8217;t active during calls to EJB timeouts (see <a href="https://jira.jboss.org/jira/browse/WELD-15">here</a> for details) so you&#8217;ll have to wait until Weld 1.01 which should be out fairly soon.</small></p>
]]></content:encoded>
			<wfw:commentRss>http://www.andygibson.net/blog/tutorial/getting-started-with-jsf-2-0-and-cdi-part-3/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Understanding Nested Conversations</title>
		<link>http://www.andygibson.net/blog/article/understanding-nested-conversations/</link>
		<comments>http://www.andygibson.net/blog/article/understanding-nested-conversations/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 03:04:53 +0000</pubDate>
		<dc:creator>Andy Gibson</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[Seam]]></category>

		<guid isPermaLink="false">http://www.andygibson.net/blog/?p=778</guid>
		<description><![CDATA[I had a bit of epiphany on the subject of nested conversations the other day when I was thinking about them and thought I&#8217;d share. I think nested conversations have been a little misunderstood with people unsure of how to use them, myself included, but I think I have found the best way to think [...]]]></description>
			<content:encoded><![CDATA[<p>I had a bit of epiphany on the subject of nested conversations the other day when I was thinking about them and thought I&#8217;d share. I think nested conversations have been a little misunderstood with people unsure of how to use them, myself included, but I think I have found the best way to think of them.<br />
<span id="more-778"></span><br />
In summary, nested conversations do for regular conversations what conversations do for session scope. With session scope, you cannot have mutliple instances of a named variable, you have to put each variable instance in its own conversation where it will be unique. However, if you want to have multiple instances of a named variable within the conversation, again, you cannot and you have the same problem you have with the session scope, that variables must be unique. Therefore  you have to have each variable in its own nested conversation under the main conversation the same way we had the top level conversation under the session scope.</p>
<p>In some weird web app which lets you pick a person and then put costumes on them, you might have a main page where you select the person, and then in separate browser windows you can pick different outfits for that person. You put the selected person value in a different conversation so the value of <code>#{selectedPerson}</code> is local to the conversation allowing multiple selected people in different browser windows. This overcomes the limitations of the session which allows only one value for <code>#{selectedPerson}</code></p>
<p> However, if you had that conversation open in multiple windows or tabs so you can compare different costumes on that person, there would only be one value of <code>#{selectedCostume}</code> for the conversation shared between all windows. As you select a costume in one window, it would affect all the other windows as they share the variable in that conversation. Using nested conversations would allow the conversation to have different values for the selected costume under the same parent conversation with the same selected person.</p>
<p>Taking it further you could select the person in the top level conversation, select the costume in the nested conversation, and then you could have multiple windows open with further nested conversation letting you pick different shoes to go with that costume. Also, if you change the person in the top level conversation, it will change the selected person for all windows using that conversation or any of its nested conversations.</p>
<p>I&#8217;m not sure there is a great need for nested conversations, I&#8217;ve never really used them or found the need and I don&#8217;t think users open that many browser windows or tabs to create different logic paths within a conversation. I think it is acceptable to limit the data isolation to a single conversation level.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andygibson.net/blog/article/understanding-nested-conversations/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Getting Started with CDI part 2 &#8211; Injection</title>
		<link>http://www.andygibson.net/blog/tutorial/getting-started-with-cdi-part-2-injection/</link>
		<comments>http://www.andygibson.net/blog/tutorial/getting-started-with-cdi-part-2-injection/#comments</comments>
		<pubDate>Tue, 22 Dec 2009 13:45:20 +0000</pubDate>
		<dc:creator>Andy Gibson</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Netbeans]]></category>
		<category><![CDATA[Weld]]></category>

		<guid isPermaLink="false">http://www.andygibson.net/blog/?p=706</guid>
		<description><![CDATA[In  part 1, we looked at creating a JEE 6 application with Netbeans using JSF and CDI running on Glassfish. Now we&#8217;ll take a closer look at using CDI for managing dependencies in a Java EE 6 environment.

Read Part 1
Read Part 2
Read Part 3
Last Time
Last time we looked at setting up the development environment [...]]]></description>
			<content:encoded><![CDATA[<p>In <a href="http://www.andygibson.net/blog/index.php/tutorial/getting-started-with-jsf-2-0-and-cdi-in-jee-6-part-1/"> part 1</a>, we looked at creating a JEE 6 application with Netbeans using JSF and CDI running on Glassfish. Now we&#8217;ll take a closer look at using CDI for managing dependencies in a Java EE 6 environment.<br />
<span id="more-706"></span><br />
Read <a href="http://www.andygibson.net/blog/tutorial/getting-started-with-jsf-2-0-and-cdi-in-jee-6-part-1/">Part 1</a><br />
Read <a href="http://www.andygibson.net/blog/tutorial/getting-started-with-cdi-part-2-injection/">Part 2</a><br />
Read <a href="http://www.andygibson.net/blog/tutorial/getting-started-with-jsf-2-0-and-cdi-part-3/">Part 3</a></p>
<h1>Last Time</h1>
<p>Last time we looked at setting up the development environment and creating our EE6 application in Netbeans and deploying it to Glassfish v3. This time, we&#8217;ll skip straight to writing code which can be put into either a new Netbeans project using the previous tutorial, or you can use the existing project and just add the new code.</p>
<h1>The &#8216;I&#8217; in CDI</h1>
<p>CDI is an API for injecting contexts and dependencies  which is the part we&#8217;ll turn our attention to now. In Seam and Spring dependencies worked mostly by naming beans and binding them to their injection points by their name. So far we have only referenced a managed bean by name from the JSF page when we defined the name for the bean using the <code>@Named</code> annotation. The primary role of the <code>@Named</code> annotation is to define the bean for the purpose of resolving EL statements within the application, usually through the JSF EL resolvers. Injection <i>could</i> be performed by using names, but this was not how injection in CDI was meant to work since CDI gives us a much richer way to express injection points and the beans to be injected into them.</p>
<p>Let&#8217;s look at an example which is somewhat contrived. We have a dao that returns a list of objects that need validating, and for invalid ones, we take a certain action.  Here&#8217;s the definition for the item.</p>
<pre class="brush: java;">
package eedemo;

public class Item {

    private int value;
    private int limit;

    @Override
    public String toString() {
        return super.toString() + String.format(&quot; [Value=%d, Limit=%d]&quot;, value,limit);
    }

    /*
    getters and setters omitted
    */
}
</pre>
<p>The <code>ItemDao</code> interface defines how we get the list of item objects. In this test application we anticipate using multiple implementations so we will code to interfaces. </p>
<pre class="brush: java;">
public interface ItemDao {

    List&lt;Item&gt; fetchItems();

}
</pre>
<p>The <code>ItemProcessor</code> is our main class that we will inject our beans into and execute the process from. For now, we will start with the Dao and look at how we will inject it into our processor bean.</p>
<pre class="brush: java;">
import java.util.List;
import javax.inject.Named;
import javax.enterprise.context.RequestScoped;

@Named(&quot;itemProcessor&quot;)
@RequestScoped
public class ItemProcessor {

    private ItemDao itemDao;

    public void execute() {
      List&lt;Item&gt;  items = itemDao.fetchItems();
      for (Item item : items) {
          System.out.println(&quot;Found item &quot;+item);
      }
    }
}
</pre>
<p>We&#8217;ll start with a simple Dao that just creates a list of items and returns a fixed list of items.</p>
<pre class="brush: java;">
public class DefaultItemDao implements ItemDao {

    public List&lt;Item&gt; fetchItems() {
        List&lt;Item&gt; results = new ArrayList&lt;Item&gt;();
        results.add(new Item(34, 7));
        results.add(new Item(4, 37));
        results.add(new Item(24, 19));
        results.add(new Item(89, 32));
        return results;
    }
}
</pre>
<p>In order to inject the <code>DefaultItemDao</code> into our <code>ItemProcessor</code> we add the <code>javax.inject.Inject</code> annotation to the <code>ItemDao</code> field to indicate that this field is an injection point.</p>
<pre class="brush: java;">
@Named(&quot;itemProcessor&quot;)
@RequestScoped
public class ItemProcessor {

    @Inject
    private ItemDao itemDao;

    ...
}
</pre>
<p>Finally, we need some way to call the <code>execute()</code< method on the <code>ItemProcessor</code>. We can run this in a SE environment, but for now we&#8217;ll keep it in a JSF page. We&#8217;ll add a new page with a button to call the execute method called <code>process.xhtml</code>.</p>
<pre class="brush: xml;">
&lt;?xml version='1.0' encoding='UTF-8' ?&gt;
&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;
      xmlns:h=&quot;http://java.sun.com/jsf/html&quot;&gt;
    &lt;h:head&gt;
        &lt;title&gt;Item Processor&lt;/title&gt;
    &lt;/h:head&gt;
    &lt;h:body&gt;
        &lt;h:form&gt;
        &lt;h:commandButton action=&quot;#{itemProcessor.execute}&quot; value=&quot;Execute&quot;/&gt;&lt;br/&gt;
        &lt;/h:form&gt;
    &lt;/h:body&gt;
&lt;/html&gt;
</pre>
<p>If you open up the page at <a href="http://localhost:8080/ee6demo/faces/process.xhtml">http://localhost:8080/ee6demo/faces/process.xhtml</a> you will see just a button that when clicked lists the items from our default Dao implementation in the console.</p>
<pre class="brush: plain;">
INFO: Found item eedemo.Item@23cbc6 [Value=34, Limit=7]
INFO: Found item eedemo.Item@a40279 [Value=4, Limit=37]
INFO: Found item eedemo.Item@19e6292 [Value=24, Limit=19]
INFO: Found item eedemo.Item@1597bc4 [Value=89, Limit=32]
</pre>
<p>We created a class which implements the <code>ItemDao</code> interface and when the application was deployed our managed beans in the module were processed by the CDI implementation (again because of the <code>beans.xml</code> file in the module. Our <code>Inject</code> annotation specifies that we want to inject a managed bean into that field and the only thing we know about the bean to inject is that it must implement <code>ItemDao</code> or some subtype of that interface. In this case, the <code>DefaultItemDao</code> class fits the bill perfectly.</p>
<p>Let&#8217;s say we add another Dao class to our application which also implements the <code>ItemDao</code> interface, now the choice isn&#8217;t so clear as to which bean we want to inject.</p>
<pre class="brush: java;">
public class AnotherItemDao implements ItemDao {

    public List&lt;Item&gt; fetchItems() {
        List&lt;Item&gt; results = new ArrayList&lt;Item&gt;();
        results.add(new Item(99, 9));
        return results;
    }

}
</pre>
<p>We now have two classes the implement this interface and predictably, Weld gives us an ambiguous dependency error meaning that it cannot determine what bean to use for that injection point. Most, if not all of the errors that can occur with regards to CDI injection in Weld are reported at deployment time, even down to whether beans are missing a Serializable implementation.</p>
<pre class="brush: plain;">
Caused by: org.jboss.weld.DeploymentException: Injection point has ambiguous dependencies.
Injection point: field eedemo.ItemProcessor.itemDao; Qualifiers: [@javax.enterprise.inject.Default()]; 

Possible dependencies: [eedemo.AnotherItemDao, eedemo.DefaultItemDao]
</pre>
<p>We could make our <code>itemDao</code> field in the item processor a type that matches one of the implementation types (<code>AnotherItemDao</code> or  <code>DefaultItemDao</code>) since it would then match one and only one class type. However, then we would lose the benefits of coding to an interface and find it harder to change implementations without changing the field type. A better solution is to instead look at CDI Qualifiers.</p>
<h1>Qualifiers</h1>
<p>A CDI qualifier is an annotation that can be applied at the class level to indicate the kind of bean the class is, and also at the field level (among other places) to indicate what kind of bean needs to be injected at that point.</p>
<p>When CDI inspects an injection point to find a suitable bean to inject it takes not only the class type into account, but also any qualifiers. Without knowing it, we have already used one qualifier which is the default qualifier called <code>@Any</code>. Let&#8217;s create a <code>@Demo</code> qualifier which we can apply to our <code>DefaultItemDao</code> implementation and also to the injection point.</p>
<pre class="brush: java;">
package eedemo.qualifier;

import static java.lang.annotation.ElementType.TYPE;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.PARAMETER;
import static java.lang.annotation.ElementType.METHOD;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.inject.Qualifier;

@Retention(RetentionPolicy.RUNTIME)
@Target({FIELD,METHOD,PARAMETER,TYPE})
@Qualifier
public @interface Demo {

}
</pre>
<p>First, we&#8217;ll add this qualifier to our default dao implementation at the class level.</p>
<pre class="brush: java;">
@Demo
public class DefaultItemDao implements SomeDao {

    public List&lt;Item&gt; fetchItems() {
..
..
</pre>
<p>If you save and deploy this file now, you may notice that we don&#8217;t have any errors, and if you go to the web page and click the execute button, you can see that in the console, it displays the list of items from the <code>AnotherItemDao</code> dao (remember we annotated the <code>DefaultItemDao</code> implementation but not the injection point). By adding the <code>Demo</code> qualifier to the default dao implementation, we made the other implementation a more suitable match for the injection point as it matched on type and on qualifiers and the <code>DefaultItemDao</code> has a qualifier that is not on the injection point making it less suitable.</p>
<p>If we add the <code>Demo</code> annotation to the injection point and deploy it, when we click our button we use the default implementation again. This is because we are matching based on type and qualifiers and the <code>DefaultItemDao</code> is the only bean with both the correct type and the <code>Demo</code> annotation.</p>
<h1>Alternative Injection Methods</h1>
<p>There are multiple ways to define an injection point on the injected class. So far we have annotated the fields that will reference the injected object. You do not need to provide getters and setters for field injection. If we wish to create immutable managed beans with final fields, we can use injection in the constructor by annotating the constructor with the <code>Inject</code> annotation. We can then apply any annotations to constructor parameters to qualify beans for injection (of course, each parameter has a type that can assist in qualifying beans for injection). A bean may only have one constructor with injection points defined, but it may implement more than one constructor.</p>
<pre class="brush: java;">
@Named(&quot;itemProcessor&quot;)
@RequestScoped
public class ItemProcessor {

    private final ItemDao itemDao;

    @Inject
    public ItemProcessor(@Demo ItemDao itemDao) {
        this.itemDao = itemDao;
    }
}
</pre>
<p>We can also call an inialization method which can be passed the beans to be injected.</p>
<pre class="brush: java;">
@Named(&quot;itemProcessor&quot;)
@RequestScoped
public class ItemProcessor {

    private ItemDao itemDao;

    @Inject
    public void setItemDao(@Demo ItemDao itemDao) {
        this.itemDao = itemDao;
    }
}
</pre>
<p>While in the above case we used the setter method for initialization we can create any method and use it for initialization with as many beans as we want in the method call. We can also have multiple initialization methods in a bean. </p>
<pre class="brush: java;">
    @Inject
    public void initBeans(@Demo ItemDao itemDao,@SomeQualifier SomeType someBean) {
        this.itemDao = itemDao;
        this.bean = someBean;
    }
</pre>
<p>The same rules apply to bean matching regardless of how the injection point is defined, it will try and find the best match based on type and qualifiers and will fail on deployment if there are multiple matching beans or no matching beans for an injection point.</p>
<p>Let&#8217;s look at the other aspects of our application, we get a list of items, iterate through them and test each one and if it fails that test, we pass it on to an error handler. We&#8217;ll create an <code>ItemValidator</code> interface to determines whether an item is valid or not.</p>
<pre class="brush: java;">
public interface ItemValidator {
    boolean isValid(Item item);
}
</pre>
<p>We&#8217;ll expand our <code>ItemProcessor</code> class to incorporate the new feature.</p>
<pre class="brush: java;">
@Named(&quot;itemProcessor&quot;)
@RequestScoped
public class ItemProcessor {

    @Inject @Demo
    private ItemDao itemDao;

    @Inject
    private ItemValidator itemValidator;

    public void execute() {
      List&lt;Item&gt;  items = itemDao.fetchItems();
      for (Item item : items) {
          System.out.println(&quot;Item = &quot;+item+&quot; valid = &quot;+itemValidator.isValid(item));
      }
    }
}
</pre>
<p>Our first implementation will be <code>DefaultItemValidator</code> which will simply test the limit against the value.</p>
<pre class="brush: java;">
public class DefaultItemValidator implements ItemValidator {

    public boolean isValid(Item item) {
        return item.getValue() &lt; item.getLimit();
    }
}
</pre>
<p>If we save our changes, go to our web page and click our button, in the console you will see that our items are being validated and the only valid item is where the value is less than the limit.</p>
<pre class="brush: plain;">
INFO: Item = eedemo.Item@25dd89 [Value=34, Limit=7] valid = false
INFO: Item = eedemo.Item@1f37ca2 [Value=4, Limit=37] valid = true
INFO: Item = eedemo.Item@7b8d67 [Value=24, Limit=19] valid = false
INFO: Item = eedemo.Item@18075da [Value=89, Limit=32] valid = false
</pre>
<p>Now lets consider the scenario where we have a deployment to a different site that is more relaxed and considers an item invalid only if the value is more than twice the limit. We may want to have another bean that implements the validator interface for that logic.</p>
<pre class="brush: java;">
public class RelaxedItemValidator implements ItemValidator {

    public boolean isValid(Item item) {
        return item.getValue() &lt; (item.getLimit() * 2);
    }
}
</pre>
<p>Now we have an ambiguous dependency problem since we have two classes implementing the same interface. The only difference is based on deployment so for most deployments, we want to use the default, but for one deployment, we want to use the relaxed implementation. CDI offers the use of the <code>Alternative</code> annotation which lets you package multiple beans that match an injection point without ambiguity errors, and the bean to use is defined in the <code>beans.xml</code>. This means you can deploy both implementations in the same module with the only difference being the beans.xml definition which can change over different deployments. </p>
<pre class="brush: java;">

@Alternative
public class DefaultItemValidator implements ItemValidator {

    public boolean isValid(Item item) {
        return item.getValue() &lt; item.getLimit();
    }
}
</pre>
<p>and</p>
<pre class="brush: java;">
@Alternative
public class RelaxedItemValidator implements ItemValidator {

    public boolean isValid(Item item) {
        return item.getValue() &lt; (item.getLimit() * 2);
    }
}
</pre>
<p>If we deploy our application now, we will get an unsatisfied dependency error since we defined the two matching beans as alternative but we didn&#8217;t enable either of them in the <code>beans.xml</code> file.</p>
<pre class="brush: xml;">
&lt;beans
    xmlns=&quot;http://java.sun.com/xml/ns/javaee&quot;
    xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
    xsi:schemaLocation=&quot;

http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/beans_1_0.xsd&quot;&gt;

    &lt;alternatives&gt;
        &lt;class&gt;eedemo.RelaxedItemValidator&lt;/class&gt;
    &lt;/alternatives&gt;
&lt;/beans&gt;
</pre>
<p>This tells CDI that for this deployment we want to use the <code>RelaxedItemValidator</code>. You can think of the alternative annotation as effectively disabling the bean making it unavailable for injection, but allowing the implementation to be packaged with the other beans. Adding it as an alternative in the <code>beans.xml</code> file effectively enables the bean making it available for injection. By moving this type of metadata to the <code>beans.xml</code> file, we can bundle different versions of the file with different deployments.</p>
<h1>Handling Invalid Items</h1>
<p>Continuing the example, invalid items are sent to the <code>ItemErrorHandler</code> as they are discovered.</p>
<pre name="code" class="java">
public interface ItemErrorHandler {
    void handleItem(Item item);
}
</pre>
<p>Let&#8217;s start by implementing a fake handler that saves the item details to a file. We want to open the file before we start handling items, leave it open for the duration of the process as we add content to the file, and then close the file when we are done with our processing. We could manually add <code>initProcess()</code> and <code>finishProcess()</code> methods to the error reporter bean, but then we couldn&#8217;t code to the interface since the caller would need to know about those class specific methods. We could add those same methods to the <code>ItemErrorReporter</code> interface but then we would have to unnecessarily implement those methods in every class that implements that interface. Instead, we can use some of the lifecycle annotations from the Managed Bean spec to call methods on the bean at certain points in the bean lifecycle. A <code>PostConstruct</code> annotated method is called when the bean has been constructed and any dependencies the bean has have been injected. Likewise, a <code>PreDestroy</code> annotated method is called just before the bean is disposed of by the container.</p>
<pre class="brush: java;">
public class FileErrorReporter implements ItemErrorHandler {

    @PostConstruct
    public void init() {
        System.out.println(&quot;Creating file error reporter&quot;);
    }

 @PreDestroy
    public void release() {
        System.out.println(&quot;Closing file error reporter&quot;);
    }

    public void handleItem(Item item) {
        System.out.println(&quot;Saving &quot;+item+&quot; to file&quot;);
    }
}
</pre>
<p>Our final change is to add the item error handling into our <code>ItemProcessor</code> bean.</p>
<pre class="brush: java;">
@Named(&quot;itemProcessor&quot;)
@RequestScoped
public class ItemProcessor {

    @Inject @Demo
    private ItemDao itemDao;

    @Inject
    private ItemValidator itemValidator;

    @Inject
    private ItemErrorHandler itemErrorHandler;

    public void execute() {
      List&lt;Item&gt;  items = itemDao.fetchItems();
      for (Item item : items) {
          if (!itemValidator.isValid(item)) {
              itemErrorHandler.handleItem(item);
          }
      }
    }
}
</pre>
<p>When we run this from our browser we see the following in the console ;</p>
<pre class="brush: plain;">
INFO: Creating file error reporter
INFO: Saving eedemo.Item@d8b01e [Value=34, Limit=7] to file
INFO: Saving eedemo.Item@12a5e8 [Value=89, Limit=32] to file
INFO: Closing file error reporter
</pre>
<h1>Next Time</h1>
<p>Different application deployments might use different rules for handling invalid items. such as rejecting the item, to sending notifications to individuals or just flagging them or listing them in an output file. In addition, we may want to do a combination of these (reject an order, send email to the sales rep, and list it in a file).<br />
One great way to handle this kind of multi-faceted problem is using events which we&#8217;ll look at next time.</p>
<p>Click to view <a href="http://www.andygibson.net/blog/tutorial/getting-started-with-jsf-2-0-and-cdi-part-3/">getting started with jsf 2.0 and CDI part 3</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.andygibson.net/blog/tutorial/getting-started-with-cdi-part-2-injection/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Getting Started with JSF 2.0 and CDI in JEE 6 part 1</title>
		<link>http://www.andygibson.net/blog/tutorial/getting-started-with-jsf-2-0-and-cdi-in-jee-6-part-1/</link>
		<comments>http://www.andygibson.net/blog/tutorial/getting-started-with-jsf-2-0-and-cdi-in-jee-6-part-1/#comments</comments>
		<pubDate>Wed, 16 Dec 2009 14:20:03 +0000</pubDate>
		<dc:creator>Andy Gibson</dc:creator>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Netbeans]]></category>
		<category><![CDATA[Weld]]></category>

		<guid isPermaLink="false">http://www.andygibson.net/blog/?p=647</guid>
		<description><![CDATA[Here&#8217;s a quick tutorial on how easy it is to get started with JSF 2.0 and JSR 299, Java Contexts and Dependency Inject (CDI) using the latest release of Netbeans 6.8.

Read Part 1
Read Part 2
Read Part 3
Getting Netbeans and JEE6
First download the latest version of Netbeans (at the time of writing 6.8 has just been [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a quick tutorial on how easy it is to get started with JSF 2.0 and JSR 299, Java Contexts and Dependency Inject (CDI) using the latest release of Netbeans 6.8.<br />
<span id="more-647"></span><br />
Read <a href="http://www.andygibson.net/blog/tutorial/getting-started-with-jsf-2-0-and-cdi-in-jee-6-part-1/">Part 1</a><br />
Read <a href="http://www.andygibson.net/blog/tutorial/getting-started-with-cdi-part-2-injection/">Part 2</a><br />
Read <a href="http://www.andygibson.net/blog/tutorial/getting-started-with-jsf-2-0-and-cdi-part-3/">Part 3</a></p>
<h1>Getting Netbeans and JEE6</h1>
<p>First download the latest version of Netbeans (at the time of writing 6.8 has just been released). Make sure the download version you choose includes Glassfish V3 and java web and EE. Once downloaded, install it and get it up and running and we can start writing the application.</p>
<h1>Starting the Project</h1>
<p>Once Netbeans is up and running, start a new web project by clicking New Project and select the Java Web category and select a Web Application project and click next.</p>
<p>Give the new project a name (I called mine ee6demo) and a directory and click next. On the server settings, Glassfish v3 should already be selected so select next. In this tab, make sure Java Server Faces is selected and stick with the defaults in the lower panel that appears when you select it.</p>
<p>You can now click finish and Netbeans will create the project and open it up for you in the IDE. On the left you can see the project explorer and in the main tab you can see a file called index.html. Without doing anything, open the Run menu in the main menu and select &#8220;Run Main Project&#8221;. After a moment of activity and console logging a web browser window should open up with the message &#8220;Hello From Facelets&#8221; which is exactly what we can see in the index.xhtml file. So far, we haven&#8217;t done anything and we already have a working web application shell.</p>
<p>Just take a moment and look at the tabs on the left hand side, you should see Project,Files, and Services. Click on the services tab and expand the Servers node and you should see the Glassfish server we are using with a little green arrow on it indicating that the server is running. For now, we don&#8217;t need this because we aren&#8217;t actually going to deploy to the server again, no restarts and no manual deployments, so go back to the projects tab on the left.</p>
<h1>Adding some code</h1>
<p>In the projects tab, expand the &#8220;Source Packages&#8221; node and right click and select New->Java Class. Give the class the name <code>MessageServerBean</code> and a package name (I used <code>eedemo</code>). We annotate the class with the <code>javax.inject.Named</code> annotation and a single method to return a string.</p>
<pre class="brush: java;">
package eedemo;

import javax.inject.Named;

@Named
public class MessageServerBean {

    public String getMessage() {
        return &quot;Hello World!&quot;;
    }
}
</pre>
<p>This a managed bean as defined by CDI which in Glassfish v3 is implemented using Weld from JBoss. One thing we need to do now is tell the server that this project is a module containing CDI beans. We add a file called <code>beans.xml</code> to the project in the WEB-INF folder. Right click on the WEB-INF folder in the project manager in the ee6Demo/Web Pages/folder and select New->XML Document. In the file name editor, just call it <code>beans</code>, <b>not</b> <code>beans.xml</code> as the IDE will add the xml extension for you and if you add the xml extension, the file will be called <code>beans.xml.xml</code> (I&#8217;ve often tripped myself up with that one!). Open the beans.xml file in the editor, and select all the text and delete it so it is an empty file.  You could alternatively just put <code><beans></beans></code>. (<b>Note</b> This file can be used to specify bean related information in xml so you aren&#8217;t limited to annotations)</p>
<p>The last change is to edit the <code>index.xhtml</code> and replace the &#8220;Hello From Facelets&#8221; with our own text.</p>
<pre class="brush: xml;">
        Message is : #{messageServerBean.message}&lt;br/&gt;
        Message Server Bean is : #{messageServerBean}
</pre>
<p>Save it and go to your browser and refresh the page (<code><a href="http://localhost:8080/ee6demo/">http://localhost:8080/ee6demo/</a></code>). </p>
<p>Message is : Hello World!<br />
Message Server Bean is : eedemo.MessageServerBean@xxxxxxx </p>
<p>You should now see the message from the bean displayed on the page. Now go back into your message bean and change the message to something else (I used <code>Hello From Weld!</code>), save the file and then refresh the browser. Your new message appears automatically since your application code has been hot deployed automatically by Netbeans . If you don&#8217;t see your changes just give it a second and refresh again.</p>
<p>From the second line in our page you can see that the class name is <code>eedemo.MessageServerBean</code> and the bean is just a pojo. Even though this is JEE, there is no complex class hierarchy wrapped in layers of transactions, interceptors and all that &#8216;Heavy&#8217; stuff you keep hearing about. </p>
<h1>What&#8217;s going on?</h1>
<p>When the application is deployed, the presence of a <code>beans.xml</code> file signals that this module contains CDI managed beans so the classes on the path are scanned for CDI annotations. Our bean was annotated with the <code>@Named</code> annotation and so this class was registered with Weld (under that name) (<b>edit</b> in a CDI module, all beans are registered with Weld, the named annotation is just used to match beans to injection points). When our JSF page was rendered, JSF tried to resolve the value of <code>messageServerBean</code> in the page using the registered expression resolvers in JSF. One of these is the Weld EL Resolver which has the MessageServerBean class registered under the name <code>messageServerBean</code>. We could have specified a name with the annotation, but since we didn&#8217;t it was registered under the default name of the class name with a lower case first name. The Weld resolver returns an instance of this bean in response to the request from JSF. Bean naming is only needed when using EL expressions and should not be used as the default mechanism for injection. CDI provides type safe injection by class type and stereotypes or qualifiers as we&#8217;ll see later.</p>
<h1>Upgrading to an EJB</h1>
<p>As we are using a JEE stack, we can easily deploy our bean as an EJB with some small changes thanks to EJB 3.1. Just open up the <code>MessageServerBean</code> and add the <code>javax.ejb.Stateless</code> annotation at the class level. Again, just save the file and go to your browser and refresh (no manual deploying, just save the file), and you should see something like :</p>
<p>Message is : Hello From Weld!<br />
Message Server Bean is : eedemo.__EJB31_Generated__MessageServerBean__Intf____Bean__@xxxxxxx </p>
<p>Amazingly, we turned our pojo bean into a fully featured EJB with just one annotation, we saved it, and refreshed our page and our changes appeared, we don&#8217;t have to create any weird project configurations, local interfaces or arcane deployment descriptors.  </p>
<h1>Different EJB types</h1>
<p>You can also try using the <code>@Stateful</code> annotation (don&#8217;t forget to implement the <code>java.io.Serializable</code> interface in the bean as it needs to be able to passivate (<b>edit</b> This isn&#8217;t necessary for it to be an EJB, but it is necessary if you want it to be session or conversation scoped)). Alternatively, you could try the new <code>@Singleton</code> annotation for singleton instances. If you do, you may notice that there is a <code>javax.ejb.Singleton</code> and <code>javax.inject.Singleton</code>. Why two Singleton annotations? A single annotation in CDI lets you define a singleton instance outside of EJB in case you are using CDI in a non-EJB environment. An EJB singleton will have all the features of an EJB such as transaction management so you have the choice depending on your needs and whether the environment is EJB or not.</p>
<p>In this first part, we have created a new JSF 2.0 application, made it CDI enabled and added a managed bean which we then referenced from the web page. In part 2, we&#8217;ll start looking at creating more complex beans and injecting them into and with other beans.</p>
<p>Click to view <a href="http://www.andygibson.net/blog/index.php/2009/12/22/getting-started-with-cdi-part-2-injection/">Part 2</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.andygibson.net/blog/tutorial/getting-started-with-jsf-2-0-and-cdi-in-jee-6-part-1/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Java EE 6 Is Here</title>
		<link>http://www.andygibson.net/blog/news/java-ee-6-is-here/</link>
		<comments>http://www.andygibson.net/blog/news/java-ee-6-is-here/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 00:13:19 +0000</pubDate>
		<dc:creator>Andy Gibson</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[Glassfish]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[JPA]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[Netbeans]]></category>

		<guid isPermaLink="false">http://www.andygibson.net/blog/?p=689</guid>
		<description><![CDATA[Like Christmas come early, Sun announced the release of JEE 6. This release sees continued improvement in the JEE stack with the inclusion of JSR 299, Java Contexts and Dependency Injection (CDI), and EJB 3.1 as well as JSF 2.0, and JPA 2.0. JSF especially has seen changes as a result of practical user feedback [...]]]></description>
			<content:encoded><![CDATA[<p>Like Christmas come early, Sun <a href="http://www.sun.com/aboutsun/pr/2009-12/sunflash.20091210.1.xml">announced</a> the release of JEE 6. This release sees continued improvement in the JEE stack with the inclusion of JSR 299, Java Contexts and Dependency Injection (CDI), and EJB 3.1 as well as JSF 2.0, and JPA 2.0. JSF especially has seen changes as a result of practical user feedback and community add-ons such as Seam and JSF Ajax frameworks which have contributed back to the JCP.</p>
<p>Glassfish v3 which implements the full JEE 6 stack has also been released, with JBoss&#8217; Weld as the CDI implementation. Netbeans 6.8 has also been released with full JEE 6 project support including maven support for enterprise applications. Also of note is the hot deploy function of Glassfish which can deploy your app while maintaining session information.</p>
<p>Personally, I&#8217;m pleased. JEE 6 has really improved things for the java standards, and CDI has filled some gaps that previously required different additional pieces to completely fill. The ghosts of EJB 2.1 should now be permanently laid to rest, but should serve as a stark reminder. Having good frameworks to build standards based solutions is always good for the community.</p>
<p>I&#8217;ll try and get some tutorials on developing with CDI and JSF 2.0 with Netbeans and Glassfish out soon.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andygibson.net/blog/news/java-ee-6-is-here/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Seam is Dead, Long live Seam</title>
		<link>http://www.andygibson.net/blog/article/seam-is-dead-long-live-seam/</link>
		<comments>http://www.andygibson.net/blog/article/seam-is-dead-long-live-seam/#comments</comments>
		<pubDate>Thu, 03 Dec 2009 13:39:30 +0000</pubDate>
		<dc:creator>Andy Gibson</dc:creator>
				<category><![CDATA[Articles]]></category>
		<category><![CDATA[CDI]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[Seam]]></category>

		<guid isPermaLink="false">http://www.andygibson.net/blog/?p=637</guid>
		<description><![CDATA[With Weld 1.0, the reference implementation of JSR 299 &#8211; Java Contexts and Dependency Injection now released, attention at JBoss has no doubt turned to Seam 3 which is going to be built on top of Weld. Red Hat and JBoss are committed to returning innovations back the JCP as is the case with Seam [...]]]></description>
			<content:encoded><![CDATA[<p>With Weld 1.0, the reference implementation of JSR 299 &#8211; Java Contexts and Dependency Injection now released, attention at JBoss has no doubt turned to Seam 3 which is going to be built on top of Weld. Red Hat and JBoss are committed to returning innovations back the JCP as is the case with Seam which not only resulted in JSR 299, but has also influenced a number of other JSRs especially JSF 2. With JSR 299 standardizing the Seam &#8217;style&#8217; of development it also brings about a some fundamental game changes for Seam 3 (hence the title) as much of the strength of Seam becomes part of the JEE standards.<br />
<span id="more-637"></span><br />
One problem I have with Seam is the all-or-nothing level of intrusion it has. I&#8217;m either working on a Seam app, or I&#8217;m not, and I pretty much have to commit to it at the start of the project. One thing Spring had going for it was you didn&#8217;t need to commit to it initially. You could start your web app, and then just add in a little bit of Spring at a time. You could continue adding Spring until it is littered all the way through your code.</p>
<p>Developers can be finnicky at times, and find topics such as heavy app servers and framework lock-in (even to the standards) to be more of an issue than they should be. On this level, Seam really lost out since it was based on standards, ran on an app server (although it ran in many environments), and there was a degree of lock-in as a Seam project, not much more than any other framework based project.</p>
<p>However, Seam itself is an excellent framework and it certainly helped make JSF 1.2 a more usuable framework. Most of those holes are now patched permanently with JSF 2.0 which logically would mean that JSF 2.0 is up to par with JSF 1.2 plus Seam. Well, not quite, although JSF has come a long way I think the one reason Seam soothed a lot of pains was not just down to the fact that it made JSF 1.2 usable. It was also because of the additional functionality it provided above and beyond the average web framework. First was the conversation scope which not only provided a more versatile scope than request and session scope, but also laid the foundation for resolving other problems. With conversation scope we are able to easily handle multiple browser windows/tabs, including independent page flows within those tabs as well as providing Workspace management. Second, it was a full stack solution with a (softly) predefined set of libraries providing different pieces of the stack. No more piecing together different technologies and getting it to work properly, you got everything in one bundle to create stateful rich web applications.</p>
<p>There are probably interesting times ahead for Seam with the evolution of JEE 6 and the release of CDI. EJB 3.1 continues the trend of making EJBs easier than ever, JSF 2.0 makes it a more pleasant experience (now with AJAX), and Weld now provides us not only with a standards based, contextual dependency injection framework, and also makes conversational applications possible out of the box. Many of the great things Seam offered is now available in JEE 6 as part of a standard stack. This is an exciting prospect for developers and makes the JEE 6 stack far more attractive, but doesn&#8217;t it also reduce the need for Seam?</p>
<p>JEE 6 isn&#8217;t simply Seam standardized, nor is it even Seam lite. There are still a number of larger features in Seam not available in JEE and rightfully so since there are a number of functions which are too specific to be standardized. This particularly applies to the features that span across multiple technologies that fit into neither the CDI, JPA, or JSF libraries. Interestingly, the Seam name would also still be suitable as a framework used to stitched them all together which was originally the concept for Seam. JSR 299 offers not only a firm base onto which you can implement those features, but allows implementing them as expansion plugins to the CDI framework through which most of Seam 3 will be implemented.</p>
<p>My hope is that Seam 3 will consist of a set of fairly independent plugins that can be added to applications in the form of CDI / JSF plugins so there is less lock-in and more of a sense of adding Seam where it is needed. This way we don&#8217;t need to start with a Seam application from the start, we can start with a standard plain old JEE 6 web application using EJB, CDI, JSF, JPA and add the Seam features as needed. Another benefit here is that when we add Seam components in such a manner, we are not adding framework code, we are adding features that works on top of our existing framework since the base code for such features is already in the JEE stack. This has worked well in the past on various different platforms, specifically in Java with JSF and the different component libraries available for it.  I think this softer approach to integration will make it more appealing in the long run, . While JEE 6 may have lower barriers to entry for this functionality, JBoss have shown they are able to compete in such environments, for example on the JSF front they have previously competed with different stateful and conversational frameworks.</p>
<p>Overall, things are looking very interesting for the future of JEE 6, and its progress has sparked a resurgent interest from developers. JSR 299 fills an important gap in JEE giving developers a powerful and feature filled standard web stack which can be extended easily. While it may remove some of the need for Seam, it also offers more opportunities for Seam to integrate with the new stack effortlessly and build on it with more features.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.andygibson.net/blog/article/seam-is-dead-long-live-seam/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
