<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CEUBRX46eip7ImA9WhRbE0U.&quot;"><id>tag:blogger.com,1999:blog-1588390580596352744</id><updated>2012-02-04T20:04:14.012+01:00</updated><category term="Design Pattern" /><category term="SOLR" /><category term="RFC 3588" /><category term="Z3950" /><category term="TDD" /><category term="Object Oriented Programming" /><category term="If-Less" /><category term="Java" /><category term="Apache QPID" /><category term="BATH Profile 2.0" /><category term="diameter" /><title>Captain Gazza's Log...</title><subtitle type="html">I'm a principal software engineer and I'm currently working for @Cult as Technical Director.
Prior to that, I worked in Milan and Rome as Software architect for Orga Systems (Telco domain) and IBM.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://andreagazzarini.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://andreagazzarini.blogspot.com/" /><author><name>Andrea Gazzarini</name><uri>http://www.blogger.com/profile/11441190939598229208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_2N3Ud_TeXNQ/Sg0UiV0RrLI/AAAAAAAAAEc/SOvnHAwyH5E/S220/avatar.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/AndreaGazzarinisWeblog" /><feedburner:info uri="andreagazzarinisweblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CEUBRX45eSp7ImA9WhRbE0U.&quot;"><id>tag:blogger.com,1999:blog-1588390580596352744.post-9096349273607306902</id><published>2011-03-14T07:31:00.001+01:00</published><updated>2012-02-04T20:04:14.021+01:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-04T20:04:14.021+01:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SOLR" /><category scheme="http://www.blogger.com/atom/ns#" term="Z3950" /><category scheme="http://www.blogger.com/atom/ns#" term="BATH Profile 2.0" /><title>SOLR: implementing an "Exact Match" BATH profile compliant field</title><content type="html">&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;
If you want to expose a Z3950 interface for your IR probably sooner or later you will meet the BATH profile, which is basically a set of rules that promotes standards behaviours between Z3950 servers.&lt;br /&gt;
Aims of those specification is to determine a list of searches (fields, attributes) that should be supported by a Z3950 server endpoint.&lt;br /&gt;
I won't discuss in this article about how to set up a Z3950 endpoint using SOLR behind the scenes because there are a lot of places where you can find such information.&lt;br /&gt;
Instead, I will write down a brief note about the so-called "Exact Match" search, which is one of the most interesting part of the story...&lt;br /&gt;
Just to directly go to the problem. The following are the specification of the "Exact Match" search:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Position&lt;/strong&gt;: first in field&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Truncation&lt;/strong&gt;: do not truncate&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Completeness&lt;/strong&gt;: complete field&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Structure&lt;/strong&gt;: phrase&lt;/li&gt;
&lt;/ul&gt;
This is a pretty simple scenario with a little issue / question (that after this reading could be still open because what are you reading is just my interpretation of the story, not the absolute truth). In general the definition is quite clear: &lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;you (as server endpoint) must search within the given index assuming that the match should be done keeping in mind that the user entered terms (i.e. search string) must be considered as a starting value (first in field). &lt;/li&gt;
&lt;li&gt;the user entered terms are supposed to be "complete words" (do no truncate)&lt;/li&gt;
&lt;li&gt;what the user entered is a complete field (e.g a complete title or author name)&lt;/li&gt;
&lt;/ol&gt;
So if in our index there's a document with &lt;span style="color: #000099;"&gt;&lt;em&gt;Alessandro Manzoni&lt;/em&gt;&lt;/span&gt; as author, an exact match query will find this document only and only if user entered values are &lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;em&gt;Alessandro Manzoni, alessandro manzoni&lt;/em&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt; &lt;/span&gt;(assuming a minimal text analysis is done with lowercasing)&lt;br /&gt;
for example the following queries won't match that document: &lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;em&gt;manzoni alessandro, Manzoni alessandro&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;
because proximity search is not mentioned in the specification (ok, it's useful in real life but that's another story)&lt;br /&gt;
Another type of text analysis that, in my opinion, could be applied without violating the specification, is removing intra-word delimiters. Lets do an example. If I have&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;em&gt;Manzoni, Alessandro.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;
It's hard to imagine that a user will be able to do an exact match query by tiping exactly what is written in the index. Instead I think should be better (both at index and query time) remove the intra-word delimiters (including trailing punctuation) and make life easier...in this way these queries:&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;em&gt;manzoni alessandro, manzoni,alessandro., manzoni alessandro..,manzoni.alessandro,&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;
will find this document. So what are the appropriate manipulation that a SOLR field needs in order to accomodate that "Exact Match" requirement?&lt;br /&gt;
If I should strictly adhere to bath requirements, my field should be a simple string like this:&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&amp;lt;field name&lt;/span&gt;=&lt;span style="color: #660000;"&gt;"author"&lt;/span&gt; &lt;span style="color: #000099;"&gt;type&lt;/span&gt;=&lt;span style="color: #660000;"&gt;"string"&lt;/span&gt; &lt;span style="color: #000099;"&gt;indexed&lt;/span&gt;=&lt;span style="color: #660000;"&gt;"true"&lt;/span&gt;&lt;span style="color: #000099;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;but referring to the last example, only a search for &lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;em&gt;Manzoni, Alessandro. &lt;/em&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;(with exact punctuation)&lt;/span&gt;&lt;br /&gt;
will match the corresponding document, and that's not exactly what we want.&lt;br /&gt;
Another approach would be to assign a solr.TextField type to our field. On top of that lowercase and tokenizer filter will do the remaining part. Let's take another example. This time the author is&lt;br /&gt;
&lt;span style="color: #000099;"&gt;Contessa Serbelloni Mazzanti Viendalmare&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;Following the mentioned approach this input value will be transformed in this way:&lt;/span&gt;&lt;br /&gt;
&lt;div dir="ltr"&gt;
&lt;span style="color: #660000; font-size: small;"&gt;&lt;em&gt;Contessa Serbelloni Mazzanti Viendalmare&lt;/em&gt;&lt;/span&gt;&lt;span style="color: #660000; font-size: small;"&gt; &lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;(original)&lt;/span&gt;&lt;/div&gt;
&lt;span style="color: #660000; font-size: small;"&gt;&lt;em&gt;contessa serbelloni mazzanti viendalmare&lt;/em&gt;&lt;/span&gt;&lt;span style="color: #660000; font-size: small;"&gt; &lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;(lowercase)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #660000; font-size: small;"&gt;&lt;em&gt;contessa, serbelloni, mazzanti, viendalmare &lt;/em&gt;&lt;/span&gt;&lt;span style="color: black; font-size: small;"&gt;(word tokenizer)&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;If a user enter the following query&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #000099;"&gt;"&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;em&gt;contessa Serbelloni MAZZANTI viendalmare&lt;/em&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;"&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;a match will be found. Now, the reason why this is not sufficient for our bath profile compliant can be found in the specification of the "Exact Match" search&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li dir="ltr"&gt;&lt;strong&gt;Position&lt;/strong&gt;: &lt;u&gt;first in field&lt;/u&gt;&lt;/li&gt;
&lt;li dir="ltr"&gt;&lt;strong&gt;Truncation&lt;/strong&gt;: do not truncate&lt;/li&gt;
&lt;li dir="ltr"&gt;&lt;strong&gt;Completeness&lt;/strong&gt;: &lt;u&gt;complete field&lt;/u&gt;&lt;/li&gt;
&lt;li dir="ltr"&gt;&lt;strong&gt;Structure&lt;/strong&gt;: &lt;u&gt;phrase&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;
First in field means that, in order to match a document, the indexed field must contains user entered terms (with the given order because is a "phrase" search) in the first position. In addition, complete field means that what the user entered is supposed to be the complete value of the target field. So, the indexing approach followed above will violate these two preconditions. How? Here it is: if the user enter the following:&lt;br /&gt;
&lt;span style="color: #000099;"&gt;"&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;em&gt;MAZZANTI viendalmare&lt;/em&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;"&lt;/span&gt;&lt;br /&gt;
a match with the same document will still be found because terms are in the target indexed field with the given order. But they aren't at the start of the field and they don't represent the whole literal value. So, even if a little bit better, this approach don't work.&lt;br /&gt;
&lt;br /&gt;
Briefly, here what I did in order to satisty the "Exact Match" requirement. Both at index and query time, starting with &lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;em&gt;&lt;br /&gt;&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;em&gt;Contessa Serbèlloni, Mazzànti Viendalmarè.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h2&gt;

&lt;span style="color: black; font-size: small;"&gt;a) Keyword Tokenizer&lt;/span&gt;&lt;/h2&gt;
&lt;span style="color: black;"&gt;At this time I don't want to tokenize my input value so this filter basically does nothing, leaving the value as is (treating the whole string as a single token).&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;


&lt;span style="color: black; font-size: small;"&gt;b) Lowercase&lt;/span&gt;&lt;/h2&gt;
&lt;span style="color: black;"&gt;As mentioned above, this is the first filter that we will apply. That will result in the following transformation:&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;em&gt;contessa serbèlloni, mazzànti viendalmarè.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;


&lt;span style="color: black; font-size: small;"&gt;c) Diacritics replacement&lt;/span&gt;&lt;/h2&gt;
&lt;span style="color: black;"&gt;Another important normalization that we will apply is a diacritic replacement, both at index and query time. This will ensure that a value like:&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;em&gt;àndréà gàzzarìnì &lt;/em&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;it will be replaced with &lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;em&gt;andrea gazzarini. &lt;/em&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;In our example:&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;em&gt;contessa serbelloni, mazzanti viendalmare.&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;
&lt;h2&gt;


&lt;span style="color: black; font-size: small;"&gt;d) Intra-word delimiter removal&lt;/span&gt;&lt;/h2&gt;
&lt;span style="color: black;"&gt;As briefly mentioned above, this latter filter will remove the intra-world delimiter, including spaces. Note,because this is the important thing, that after applying this filter, I'm not splitting the original input value in several tokens: the tokens is always 1 and will be:&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;em&gt;contessaserbellonimazzantiviendalmare&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;That's all. As last note remember that the described chain should be applied both at index and query time. So running some examples will find that the requirements is fully satisfied.&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style="color: black;"&gt;Searching &lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;em&gt;Contessa serbelloni mazzanti viendalmare&lt;/em&gt;&lt;/span&gt;&lt;span style="color: black;"&gt; will produce 1 result;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style="color: black;"&gt;Searching &lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;em&gt;serbelloni mazzanti &lt;/em&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;will produce no result;&lt;/span&gt;&lt;/li&gt;
&lt;li dir="ltr"&gt;&lt;span style="color: black;"&gt;Searching &lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;em&gt;Contessa serbelloni mazzanti &lt;/em&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;will produce no result;&lt;/span&gt;&lt;/li&gt;
&lt;li dir="ltr"&gt;&lt;span style="color: black;"&gt;Searching &lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;em&gt;Contessa serbel loni maz zanti vien dal mare&lt;/em&gt;&lt;/span&gt;&lt;span style="color: black;"&gt; will produce 1 result; ok, this could be intended as a violation and I agree with you...I'm thinking about that...in the meantime lets say that this "bug" is very useful because (the searcher) you couldn't know how the author name is exactly written;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span style="color: black;"&gt;Your comments will be very appreciated and of course, if you have some suggestions, enhancements, give me a shout.&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: black;"&gt;&lt;em&gt;Gazza&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;
&lt;img height="1" src="https://blogger.googleusercontent.com/tracker/1588390580596352744-9096349273607306902?l=andreagazzarini.blogspot.com" width="1" /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588390580596352744-9096349273607306902?l=andreagazzarini.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/SfpA9JnpYc51Xl5ce9Br9CIY0vo/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SfpA9JnpYc51Xl5ce9Br9CIY0vo/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/SfpA9JnpYc51Xl5ce9Br9CIY0vo/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/SfpA9JnpYc51Xl5ce9Br9CIY0vo/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AndreaGazzarinisWeblog/~4/00XtsCN6Nbc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andreagazzarini.blogspot.com/feeds/9096349273607306902/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588390580596352744&amp;postID=9096349273607306902" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/9096349273607306902?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/9096349273607306902?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AndreaGazzarinisWeblog/~3/00XtsCN6Nbc/solr-implementing-match-bath-profile.html" title="SOLR: implementing an &amp;quot;Exact Match&amp;quot; BATH profile compliant field" /><author><name>Andrea Gazzarini</name><uri>http://www.blogger.com/profile/11441190939598229208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_2N3Ud_TeXNQ/Sg0UiV0RrLI/AAAAAAAAAEc/SOvnHAwyH5E/S220/avatar.jpg" /></author><thr:total>1</thr:total><feedburner:origLink>http://andreagazzarini.blogspot.com/2011/03/solr-implementing-match-bath-profile.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IDR3s6fSp7ImA9WhdWFk4.&quot;"><id>tag:blogger.com,1999:blog-1588390580596352744.post-4617913489167688456</id><published>2009-12-25T08:13:00.000+01:00</published><updated>2011-09-10T08:19:36.515+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-10T08:19:36.515+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="RFC 3588" /><category scheme="http://www.blogger.com/atom/ns#" term="diameter" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>Implementing a Diameter Peer State Machine using Test Driven Development (Part 3).</title><content type="html">Just a brief riepilogue of what are the missing points :&lt;br /&gt;
&lt;br /&gt;
- When a peer is in "Closed" state and receives a START signal it must&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;take a I-Snd-Conn-Req action : &lt;span style="font-weight: bold;"&gt;this is currently a missing point;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;change its state to Wait-Conn-Ack : we did that in the last episode :)&lt;/li&gt;
&lt;/ol&gt;
- When a peer is in "Closed" state and receives a R-Conn-CER signal it must :&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;take the following 3 actions : R-Accept, Process-CER and R-Snd-CEA.&lt;/li&gt;
&lt;li&gt;change its state to R-Open.&lt;/li&gt;
&lt;/ol&gt;
So, concerning this episode, we are going to add the behaviour requested by the R-Conn-CER signal, leaving out for the moment all what is concerning actions. That means we will concentrate only on state transistion.&lt;br /&gt;
&lt;br /&gt;
Following the same approach we used  for the "Start" signal, we can write another test method :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #990000;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #660000;"&gt;public class&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #660000;"&gt; &lt;/span&gt;&lt;/span&gt;PeerStateMachineTestCase&lt;br /&gt;
{&lt;br /&gt;
&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #999999;"&gt;@Test&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;public &lt;/span&gt;void rConnCerSignal()&lt;br /&gt;
&lt;span style="color: white;"&gt;...&lt;/span&gt;{&lt;br /&gt;
&lt;span style="color: white;"&gt;......&lt;/span&gt;Peer peer = &lt;span style="color: #660000; font-weight: bold;"&gt;new&lt;/span&gt; Peer();&lt;br /&gt;
&lt;span style="color: white;"&gt;......&lt;/span&gt;peer.signal(PeerEventType.&lt;span style="color: #000099;"&gt;R_CONN_CER&lt;/span&gt;);&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #ffcccc;"&gt;......&lt;/span&gt;&lt;span style="font-style: italic;"&gt;assertTrue&lt;/span&gt;(peer.currentStateIs(peer.&lt;span style="color: #000099;"&gt;R_OPEN&lt;/span&gt;);&lt;br /&gt;
&lt;span style="color: white;"&gt;...&lt;/span&gt;}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
PeerEventType.R_CONN_CER is not giving any compiler warning because we already added it in the first part.&lt;br /&gt;
What is really missing(from a compiler perspective) is a R_OPEN member instance on Peer class:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;public class&lt;/span&gt; Peer&lt;br /&gt;
{&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;      &lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;final&lt;/span&gt; State &lt;span style="color: #000099;"&gt;CLOSED&lt;/span&gt; = &lt;span style="color: #660000; font-weight: bold;"&gt;new &lt;/span&gt;State(){};&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;      &lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;final&lt;/span&gt; State &lt;span style="color: #000099;"&gt;WAIT_CONN_ACK&lt;/span&gt; = &lt;span style="color: #660000; font-weight: bold;"&gt;new &lt;/span&gt;State(){};&lt;span style="color: #660000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;final&lt;/span&gt; State &lt;span style="color: #000099;"&gt;R_OPEN&lt;/span&gt; = &lt;span style="color: #660000; font-weight: bold;"&gt;new &lt;/span&gt;State(){};&lt;span style="color: #660000;"&gt;&lt;/span&gt;&lt;br /&gt;
...&lt;br /&gt;
...&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Now our test compiles fine but it gives us a red bar: after PeerEventType.&lt;span style="color: #000099;"&gt;R_CONN_CER &lt;span style="color: black;"&gt;signal&lt;/span&gt;&lt;/span&gt; has been received peer is not (as expected) in R_OPEN state but in WAIT_CONN_ACK :(&lt;br /&gt;
This is reasonable if we remember the Peer.signal(...) implementation we did last time :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;public&lt;/span&gt; void signal(PeerEventType type)&lt;br /&gt;
{&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;currentState&lt;/span&gt; = &lt;span style="color: #000099;"&gt;WAIT_CONN_ACK&lt;/span&gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
With the new R_CONN_CER signal this implementation is not working anymore so we need to rewrite the method in order to let the peer properly react to a given signal. The most obvious solution could be :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;public&lt;/span&gt; void signal(PeerEventType type)&lt;br /&gt;
{&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;if&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;(&lt;span style="color: #000099;"&gt;currentState&lt;/span&gt; == CLOSED)&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;if&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;(type == START)&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;{&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;currentState&lt;/span&gt; = &lt;span style="color: #000099;"&gt;WAIT_CONN_ACK&lt;/span&gt;;&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;else&lt;/span&gt; &lt;span style="color: #660000; font-weight: bold;"&gt;if&lt;/span&gt;&lt;span style="color: #660000;"&gt; &lt;span style="color: black;"&gt;(type&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;== R_CONN_CER)&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;{&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;currentState&lt;/span&gt; = &lt;span style="color: #000099;"&gt;R_OPEN;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000; font-weight: bold;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;} &lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Without any doubt it's working but&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;If you have a look at the state machine table defined on RFC 3588 you'll quickly realize that this approach will result in a looot of  "if / else if" statements;&lt;/li&gt;
&lt;li&gt;personally I believe that the transition state is something related with the state itself, while in the implementation above we made that part of the Peer logic.&lt;/li&gt;
&lt;/ol&gt;
In addition, each time a new state needs to be added you must :&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Add a new state member instance;&lt;/li&gt;
&lt;li&gt;Modify the signal method.&lt;/li&gt;
&lt;/ol&gt;
What I'm trying to suggest is the following : if&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;we already have something that tell us what is the current state;&lt;/li&gt;
&lt;li&gt;that thing is an object (an instance of State)&lt;/li&gt;
&lt;li&gt;obviously that object could have its own state and methods;&lt;/li&gt;
&lt;/ol&gt;
Why don't we put the state transition logic within the each State? With this approach we need to modify a little bit the State interface introduced in part one adding a new method and a new exception :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-style: italic;"&gt;(Interface State)&lt;/span&gt;&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;void &lt;/span&gt;&lt;/span&gt;signal(PeerEventType eventType) &lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;throws &lt;/span&gt;&lt;/span&gt;WrongEventException;&lt;br /&gt;
&lt;br /&gt;
Now each instance of State must implements this method which is supposed to&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Change the state of the hosting Peer instance (remember that our State instances are inner classes);&lt;/li&gt;
&lt;li&gt;Raise an exception if a wrong (not allowed) signal is received;&lt;/li&gt;
&lt;/ol&gt;
So for example, the inner CLOSED State instance will do something like that :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;final&lt;/span&gt; State &lt;span style="color: #000099;"&gt;CLOSED&lt;/span&gt; = &lt;span style="color: #660000; font-weight: bold;"&gt;new &lt;/span&gt;State()&lt;br /&gt;
&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;{&lt;br /&gt;
&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void &lt;/span&gt;&lt;/span&gt;signal(PeerEventType eventType) &lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;throws &lt;/span&gt;&lt;/span&gt;WrongEventException&lt;br /&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;switch&lt;/span&gt; (eventType)&lt;br /&gt;
&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;case&lt;/span&gt; &lt;span style="color: #000099;"&gt;START&lt;/span&gt; :&lt;br /&gt;
&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #000099; font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #000099;"&gt;currentState&lt;/span&gt; = &lt;span style="color: #000099;"&gt;WAIT_CONN_ACK&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;case&lt;/span&gt; &lt;span style="color: #000099;"&gt;R_CONN_CER&lt;/span&gt; :&lt;br /&gt;
&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #000099; font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #000099;"&gt;currentState&lt;/span&gt; = &lt;span style="color: #000099;"&gt;R_OPEN&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;default&lt;/span&gt; :&lt;br /&gt;
&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #000099;"&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;throw new &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;WrongEventException(&lt;span style="color: #000099;"&gt;"Some useful message"&lt;/span&gt;)&lt;span style="color: white;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #000099;"&gt;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;span style="color: black;"&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;span style="color: black;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;&lt;/span&gt;};&lt;br /&gt;
&lt;br /&gt;
Of course, in order to get things working as expected, we need to modify the Peer.signal method :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;public&lt;/span&gt; void signal(PeerEventType type) &lt;span style="color: #660000; font-weight: bold;"&gt;throws&lt;/span&gt; WrongEventTypeException&lt;br /&gt;
{&lt;br /&gt;
&lt;span style="color: white;"&gt;....&lt;/span&gt;&lt;span style="color: #000099;"&gt;currentState&lt;/span&gt;.signal(type);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Now our 2 test methods should correctly work.&lt;br /&gt;
&lt;br /&gt;
See you soon for the last part :)&lt;br /&gt;
&lt;br /&gt;
Ciao&lt;br /&gt;
Andrea&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588390580596352744-4617913489167688456?l=andreagazzarini.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/NCfqUIJzYTsX-DfLXHodIga87ws/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NCfqUIJzYTsX-DfLXHodIga87ws/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/NCfqUIJzYTsX-DfLXHodIga87ws/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/NCfqUIJzYTsX-DfLXHodIga87ws/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AndreaGazzarinisWeblog/~4/v40QiqteruI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andreagazzarini.blogspot.com/feeds/4617913489167688456/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588390580596352744&amp;postID=4617913489167688456" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/4617913489167688456?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/4617913489167688456?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AndreaGazzarinisWeblog/~3/v40QiqteruI/implementing-diameter-peer-state.html" title="Implementing a Diameter Peer State Machine using Test Driven Development (Part 3)." /><author><name>Andrea Gazzarini</name><uri>http://www.blogger.com/profile/11441190939598229208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_2N3Ud_TeXNQ/Sg0UiV0RrLI/AAAAAAAAAEc/SOvnHAwyH5E/S220/avatar.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andreagazzarini.blogspot.com/2009/11/implementing-diameter-peer-state.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IGRXs7eyp7ImA9WhdWFk4.&quot;"><id>tag:blogger.com,1999:blog-1588390580596352744.post-5724527386861711460</id><published>2009-10-23T17:58:00.006+02:00</published><updated>2011-09-10T08:18:44.503+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-10T08:18:44.503+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="RFC 3588" /><category scheme="http://www.blogger.com/atom/ns#" term="diameter" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>Implementing a Diameter Peer State Machine using Test Driven Development (Part 2).</title><content type="html">So, next step is to test what happens if (following the state machine picture on the previous post) a START signal is sent to our peer.&lt;br /&gt;
According with RFC 3588 specification, if a peer, that is in CLOSED state, successfully processes the START signal two things happen:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;the peer must take a "I-Snd-Conn-Req" action;&lt;/li&gt;
&lt;li&gt;a state transition occurs : the peer passes from CLOSED to WAIT-CONN_ACK state;&lt;/li&gt;
&lt;/ul&gt;
In this article we will take care about the second point.&lt;br /&gt;
Well, returning to our test case, we have to add another &lt;span style="color: #666666;"&gt;@Test&lt;/span&gt; method :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #990000;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #660000;"&gt;public class&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #660000;"&gt; &lt;/span&gt;&lt;/span&gt;PeerStateMachineTestCase&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #999999;"&gt;....@Test&lt;/span&gt;&lt;br /&gt;
....&lt;span style="color: #660000; font-weight: bold;"&gt;public &lt;/span&gt;void startSignal()&lt;br /&gt;
....{&lt;br /&gt;
.......Peer peer = &lt;span style="color: #660000; font-weight: bold;"&gt;new&lt;/span&gt; Peer();&lt;br /&gt;
.......peer.signal(PeerEventType.&lt;span style="color: #000099; font-style: italic;"&gt;START&lt;/span&gt;);&lt;br /&gt;
&lt;br /&gt;
.......&lt;span style="font-style: italic;"&gt;assertTrue&lt;/span&gt;(peer.currentStateIs(peer.&lt;span style="color: #000099;"&gt;WAIT_CONN_ACK&lt;/span&gt;);&lt;br /&gt;
....}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Obviously, this test method doesn't compile : we don't have a signal() method and a WAIT_CONN_ACK member variable on our Peer class.&lt;br /&gt;
So first of all we will insert the missing method :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;public void &lt;/span&gt;signal(PeerEventType eventType)&lt;br /&gt;
{&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
after that, Peer class needs a new State instance member :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;final&lt;/span&gt; State &lt;span style="color: #000099;"&gt;WAIT_CONN_ACK&lt;/span&gt; = &lt;span style="color: #660000; font-weight: bold;"&gt;new &lt;/span&gt;State(){};&lt;br /&gt;
&lt;br /&gt;
This is how our Peer class behaves :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;public class&lt;/span&gt; Peer&lt;br /&gt;
{&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;      &lt;/span&gt;&lt;span style="color: #660000;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;final&lt;/span&gt; State &lt;span style="color: #000099;"&gt;CLOSED&lt;/span&gt; = &lt;span style="color: #660000; font-weight: bold;"&gt;new &lt;/span&gt;State(){};&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;      &lt;/span&gt;&lt;span style="color: #660000;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;final&lt;/span&gt; State &lt;span style="color: #000099;"&gt;WAIT_CONN_ACK&lt;/span&gt; = &lt;span style="color: #660000; font-weight: bold;"&gt;new &lt;/span&gt;State(){};&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #660000;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;public void &lt;/span&gt;signal(PeerEventType eventType){}&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #660000;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;boolean &lt;/span&gt;currentStateIs(State state)&lt;br /&gt;
....{&lt;br /&gt;
&lt;span style="color: #660000;"&gt;........&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;return true&lt;/span&gt;;&lt;br /&gt;
....}&lt;br /&gt;
}&lt;br /&gt;
Now the test method (and the enclosing testcase) compiles fine. But after running, we get a red bar. Why? There is one explicit problem : transition state doesn't really happen on peer instance so the assertion fails. I mean, the peer is not on WAIT_CONN_ACK State. Actually is not in any state because the currentStateIs() method is returning &lt;span style="color: #660000; font-weight: bold;"&gt;true&lt;/span&gt; everytime :)&lt;br /&gt;
In order to see that all is properly working we need to introduce another peer member instance that represents the current state of the peer.&lt;br /&gt;
Well, considering that we already have a type for this new member (State class), we can insert (in Peer class):&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;private &lt;/span&gt;State &lt;span style="color: #333399;"&gt;currentState&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
With this new variable, I can rewrite the currentStateIs() method in the following way :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;boolean &lt;/span&gt;currentStateIs(State state)&lt;br /&gt;
{&lt;br /&gt;
&lt;span style="color: #660000;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;return &lt;/span&gt;&lt;span style="color: #000099;"&gt;currentState&lt;/span&gt; == state;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Introducing that change causes a failure in the first test we saw in part I. Well, in order to fix that we need to initialize the "currentState" member instance :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;private &lt;/span&gt;State &lt;span style="color: #000099;"&gt;currentState&lt;/span&gt; = &lt;span style="color: #000099;"&gt;CLOSED&lt;/span&gt;;&lt;br /&gt;
&lt;br /&gt;
Now the &lt;span style="color: #666666;"&gt;@Test&lt;/span&gt; initialState() is working while the &lt;span style="color: #999999;"&gt;@Test&lt;/span&gt; startSignal() is failing :(.&lt;br /&gt;
Why? because nothing on the peer instance is causing the required state transition  and the assertion on the currentStateIs() fails because the peer is still in CLOSED state.&lt;br /&gt;
Again, what is the minimum change / adjustment we would do in order to get things working? This is the failing test :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #990000;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="color: #660000;"&gt;public class&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #660000;"&gt; &lt;/span&gt;&lt;/span&gt;PeerStateMachineTestCase&lt;br /&gt;
{&lt;br /&gt;
....&lt;span style="color: #999999;"&gt;@Test&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #660000;"&gt;....&lt;/span&gt;&lt;span style="color: #660000; font-weight: bold;"&gt;public &lt;/span&gt;void startSignal()&lt;br /&gt;
...{&lt;br /&gt;
......Peer peer = &lt;span style="color: #660000; font-weight: bold;"&gt;new&lt;/span&gt; Peer();&lt;br /&gt;
......peer.signal(PeerEventType.&lt;span style="color: #000099;"&gt;START&lt;/span&gt;);&lt;br /&gt;
&lt;br /&gt;
......assertTrue(peer.currentStateIs(peer.&lt;span style="color: #000099;"&gt;WAIT_CONN_ACK&lt;/span&gt;);&lt;br /&gt;
...}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Yes, we can do the state transition in the signal() method :&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #660000; font-weight: bold;"&gt;public&lt;/span&gt; void signal(PeerEventType type)&lt;br /&gt;
{&lt;br /&gt;
&lt;span style="color: #000099;"&gt;....currentState&lt;/span&gt; = &lt;span style="color: #000099;"&gt;WAIT_CONN_ACK&lt;/span&gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
In this way, the test will succeed because after calling the signal() method the peer state is WAIT_CONN_ACK as required.&lt;br /&gt;
&lt;br /&gt;
See you soon for third episode :)&lt;br /&gt;
Bye&lt;br /&gt;
Andrea&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588390580596352744-5724527386861711460?l=andreagazzarini.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ldQGW5u3-AR-8E6uHH_nLbEm6KU/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ldQGW5u3-AR-8E6uHH_nLbEm6KU/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ldQGW5u3-AR-8E6uHH_nLbEm6KU/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ldQGW5u3-AR-8E6uHH_nLbEm6KU/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AndreaGazzarinisWeblog/~4/rqKo93th65g" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andreagazzarini.blogspot.com/feeds/5724527386861711460/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588390580596352744&amp;postID=5724527386861711460" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/5724527386861711460?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/5724527386861711460?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AndreaGazzarinisWeblog/~3/rqKo93th65g/implementing-diameter-peer-state.html" title="Implementing a Diameter Peer State Machine using Test Driven Development (Part 2)." /><author><name>Andrea Gazzarini</name><uri>http://www.blogger.com/profile/11441190939598229208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_2N3Ud_TeXNQ/Sg0UiV0RrLI/AAAAAAAAAEc/SOvnHAwyH5E/S220/avatar.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andreagazzarini.blogspot.com/2009/10/implementing-diameter-peer-state.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IEQngzfSp7ImA9WhdWFk4.&quot;"><id>tag:blogger.com,1999:blog-1588390580596352744.post-5086546529256184262</id><published>2009-05-30T19:57:00.008+02:00</published><updated>2011-09-10T08:18:23.685+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-10T08:18:23.685+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="RFC 3588" /><category scheme="http://www.blogger.com/atom/ns#" term="diameter" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>Implementing a Diameter Peer State Machine using Test Driven Development (Part 1).</title><content type="html">&lt;div&gt;
RFC3588 (Diameter Base Protocol), specifically par. 5.6, contains specification about a finite state machine that MUST be observed by all Diameter implementations.&lt;/div&gt;
&lt;div style="text-align: center;"&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
In this article we will see how to implement a peer state machine using Test Driven Development. Note that this is only the first part of the whole article. &lt;/div&gt;
&lt;div&gt;
The following is an extract (just the first entry) of the RFC table (you can found that on the previously mentioned paragraph) that illustrates the peer state machine : &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5342282171490064162" src="http://3.bp.blogspot.com/_2N3Ud_TeXNQ/SiOZVJGRVyI/AAAAAAAAAFI/JPzp9QjcXlo/s400/Immagine.bmp" style="cursor: hand; cursor: pointer; display: block; height: 79px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;I choose that entry because "Closed" is the peer initial state.  &lt;/div&gt;
&lt;div&gt;
As you can see when the peer is in that state it can receive only two kind of events:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
1) Start : A diameter application has signaled that a connection should be initiated with the peer;&lt;/div&gt;
&lt;div&gt;
2) R-Conn-CER : An acknowledgement is received stating that the transport connection has been established, and the associated Capability Exchange Request (CER) has arrived.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The first event must be associated with the following action on the peer : &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
1) I-Snd-Conn-Req (Initiator Sends Connection Request) : A transport connection is initiated with the peer;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
After the peer successfully processed the action its new state MUST be "Wait-Conn-Ack".&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The second event, R-Conn-CER, is firing the following actions on the peer :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
1) R-Accept : The incoming connection associated with the R-Conn-CER is accepted as the responder connection;&lt;/div&gt;
&lt;div&gt;
2) Process-CER : The CER associated with the R-Conn-CER is processed.&lt;/div&gt;
&lt;div&gt;
3) R-Snd-CEA (Receiver Sends CEA)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
After those three actions, the peer must be in "R-Open" state.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Well, of course if you have a look at the whole table there are a lot of states / actions / events but for simplicity we can assume that we are handling only with the "Closed" state. The whole article can be applied to other table entries.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
First implicit requirement is that we should have a Peer class, it must have an internal state and the initial value of that state should be "Closed". &lt;/div&gt;
&lt;div&gt;
So, for a first implementation of our test case I'd like to write something like this :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
package com.gazzax.diameter.peer;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public class&lt;/span&gt;&lt;/span&gt; PeerStateMachineTestCase&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #666666;"&gt;@Test&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;public &lt;/span&gt;&lt;/span&gt;void initialState()&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;{&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;Peer peer = &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;new &lt;/span&gt;&lt;/span&gt;Peer();&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;assertTrue(peer.currentStateIs(peer.CLOSED));&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Obviously, the test doesn't compile for several reasons; First of all, we need a Peer class :) So let's create it!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;package &lt;/span&gt;&lt;/span&gt;com.gazzax.diameter.peer;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public class&lt;/span&gt;&lt;/span&gt; Peer&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
One little step ahead! But it is not sufficient because the TestCase still doesn't compile :( There's no a currentStateIs(...) method on the Peer class!&lt;/div&gt;
&lt;div&gt;
Note that that method is accepting a parameter that represents a peer state. Peer's states are typed instance members of peer class and they have a default visibility. Why? Because in that way we can see / use them on our test case without breaking encapsulation (PeerStateMachineTestCase and Peer are in the same package even if they usually reside in different source folders) &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
NOTE : the current state of the peer &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;IS NOT&lt;/span&gt; exposed (it is a private member). You can only have an indirect / read-only access through the currentStateIs(...) method.&lt;/div&gt;
&lt;div&gt;
This is done because we don't want break enapsulation and therefore peer state invariants.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Anyway, the state machine table suggests that &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
- a peer, regardless its state, should be able to receive a signal;&lt;/div&gt;
&lt;div&gt;
- the concrete handling of that signal (fired actions and next state) depends on the current state of the peer; &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So, this suggests me that a peer state itself shuold be able to receive a signal. Here is the peer state interface:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;package &lt;/span&gt;&lt;/span&gt;com.gazzax.diameter.peer;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public interface&lt;/span&gt;&lt;/span&gt; State &lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;void &lt;/span&gt;&lt;/span&gt;signal(PeerEventType event) &lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;throws &lt;/span&gt;&lt;/span&gt;WrongEventException;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Where &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
- &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;PeerEventType &lt;/span&gt;is an enumeration of all defined event types; for the current example it will look like this :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;package &lt;/span&gt;&lt;/span&gt;com.gazzax.diameter.peer;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public enum&lt;/span&gt;&lt;/span&gt; PeerEventType&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #000099;"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;START&lt;/span&gt;&lt;/span&gt;,&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #000099;"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;R_CONN_CER&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
- &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;WrongEventException &lt;/span&gt;: that will be thrown when the received event type is violating the rules defined on the peer state machine table. I mean, when the peer will receive a wrong event according with its current state. I mean, when the current state of the peer doesn't recognize the received event type as valid.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
We left the TestCase with compilation errors. We need a currentStateIs(State peerState) method. Let's write it with a dummy implementation!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public class&lt;/span&gt;&lt;/span&gt; Peer&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private final&lt;/span&gt;&lt;/b&gt; State CLOSED; &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;boolean &lt;/span&gt;&lt;/span&gt;currentStateIs(State state)&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;{&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;return false&lt;/span&gt;&lt;/span&gt;; &lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/div&gt;
&lt;div&gt;
} &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now code should compile :) &lt;/div&gt;
&lt;div&gt;
Run again the test case and you will see the red bar! Bad? Absolutely not, that means "Progress"! Another little step ahead!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
What is the minimal thing / adjustment that we could do in order to get a green bar? &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public class&lt;/span&gt;&lt;/span&gt; Peer&lt;/div&gt;
&lt;div&gt;
{&lt;/div&gt;
&lt;div&gt;
&lt;b&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private final&lt;/span&gt;&lt;/b&gt; State CLOSED; &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;boolean &lt;/span&gt;&lt;/span&gt;currentStateIs(State state)&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;{&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;return true&lt;/span&gt;&lt;/span&gt;; &lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;}&lt;/div&gt;
&lt;div&gt;
} &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Run again the test and...et voilà! We got a green bar! Another little step ahead!&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588390580596352744-5086546529256184262?l=andreagazzarini.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1xR3Fn0cQVaJ0jBWJCzj60kQn9U/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1xR3Fn0cQVaJ0jBWJCzj60kQn9U/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1xR3Fn0cQVaJ0jBWJCzj60kQn9U/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1xR3Fn0cQVaJ0jBWJCzj60kQn9U/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AndreaGazzarinisWeblog/~4/FxxTtDX7tAQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andreagazzarini.blogspot.com/feeds/5086546529256184262/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588390580596352744&amp;postID=5086546529256184262" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/5086546529256184262?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/5086546529256184262?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AndreaGazzarinisWeblog/~3/FxxTtDX7tAQ/implementing-diameter-peer-state.html" title="Implementing a Diameter Peer State Machine using Test Driven Development (Part 1)." /><author><name>Andrea Gazzarini</name><uri>http://www.blogger.com/profile/11441190939598229208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_2N3Ud_TeXNQ/Sg0UiV0RrLI/AAAAAAAAAEc/SOvnHAwyH5E/S220/avatar.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_2N3Ud_TeXNQ/SiOZVJGRVyI/AAAAAAAAAFI/JPzp9QjcXlo/s72-c/Immagine.bmp" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://andreagazzarini.blogspot.com/2009/05/implementing-diameter-peer-state.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04BR3g9eyp7ImA9WhdWFk4.&quot;"><id>tag:blogger.com,1999:blog-1588390580596352744.post-1087323676899972222</id><published>2009-05-15T09:07:00.010+02:00</published><updated>2011-09-10T08:25:56.663+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-10T08:25:56.663+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Object Oriented Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="If-Less" /><category scheme="http://www.blogger.com/atom/ns#" term="Design Pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>Dependency Injection with EJB 2.x</title><content type="html">&lt;div&gt;
Very often, I see in an EJB 2.x environment message driven or session beans with the following code : &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt; onMessage(Message message) &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;Connection connection = &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;null&lt;/span&gt;&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;try&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Context ctx = new Context();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;DataSource datasource = (DataSource)ctx.lookup(&lt;span class="Apple-style-span" style="color: #3366ff;"&gt;"jdbc/ds"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Connection connetion = ....&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Do somethign with connection&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;catch&lt;/span&gt;&lt;/span&gt;(NamingException exception)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Do something&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;catch&lt;/span&gt;&lt;/span&gt;(SQLException exception)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Do something &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;finally &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;try &lt;/span&gt;&lt;/span&gt;{ connection.close(); } &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;catch&lt;/span&gt;&lt;/span&gt;(Exception ignore) {}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
...or (better) using a service locator : &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt; onMessage(Message message) &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Connection connection = &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;null&lt;/span&gt;&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;try&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;ServiceLocator serviceLocator = &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;new &lt;/span&gt;&lt;/span&gt;ServiceLocator();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;DataSource datasource = serviceLocator.getDataSource(&lt;span class="Apple-style-span" style="color: #3366ff;"&gt;"jdbc/ds"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Connection connetion = ....&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Do somethign with connection&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;catch&lt;/span&gt;&lt;/span&gt;(NamingException exception) &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Do something&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;catch&lt;/span&gt;&lt;/span&gt;(SQLException exception)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Do something &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;finally &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;try &lt;/span&gt;&lt;/span&gt;{ connection.close(); } &lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;catch&lt;/span&gt;&lt;/span&gt;(Exception ignore) {}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
What is the problem? That piece of code (doesn't matter if it belongs to a session or a message driven bean) should IMO contains only business logic; &lt;/div&gt;
&lt;div&gt;
I mean, the logic that should make sense, from a business point of view, of that EJB.&lt;/div&gt;
&lt;div&gt;
Now, again, what is the problem? JDBC Code? Why don't we use a Data Gateway (or in general a data access pattern)? &lt;/div&gt;
&lt;div&gt;
Yes, that's right, but that's not the point. &lt;/div&gt;
&lt;div&gt;
Let's make a strong precondition supposing that jdbc code is part of business logic. &lt;/div&gt;
&lt;div&gt;
What else?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Look at this line of code :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;catch&lt;/span&gt;&lt;/span&gt;(NamingException exception)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Do something&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This exception is thrown when some problem occurs with naming service. The funny thing is that we are looking up the resource (a datasource in this case) each time this method is called. What is the problem?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
There are at least three issues :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
1) Each call to Context.lookup(...) is theoretically a remote call. Here that call is done each time a message arrives. You may think that code could be optimized, looking up the resource the first time, but you must in any case catch the Naming Exception (even if the lookup isn't really executed)&lt;/div&gt;
&lt;div&gt;
2) What you need is the resource that is bound with the naming service under the name "jdbc/ds", not the naming service itself. Once you got it, you have all what you need in order to retrieve valid database connections. So you should use that lookup code once and only once.&lt;/div&gt;
&lt;div&gt;
3) NamingException is not a business excepiton...the corresponding "throwing" code it's not part of the business logic too, but the onMessage(), where only the business logic should be, must contain the try-catch statement in order to handle a scenario where a naming service occurs...&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;EACH TIME THE CODE IS EXECUTED!.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The usage of a service locator doesn't solve the problem completely : even if we cache the resource (on service locator), we will avoid the 1) &amp;amp; 2) but not the 3th issue. &lt;/div&gt;
&lt;div&gt;
In fact the signature of the getDatasource(...) method is throwing a NamingException and therefore the calling code must catch it everytime.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The ideal solution should:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
1) make a lookup call only once;&lt;/div&gt;
&lt;div&gt;
2) catch the naming exception only once (when the lookup call is executed)&lt;/div&gt;
&lt;div&gt;
3) in case of naming exception (naming service failure) the call should be repeated until the resource is available.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt; GxMessageDriven &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;implements &lt;/span&gt;&lt;/span&gt;MessageDrivenBean, MessageListener&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;private &lt;/span&gt;&lt;/span&gt;DataSource &lt;span class="Apple-style-span" style="color: #3333ff;"&gt;datasource&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt; onMessage()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Here we can use directly the datasource instance that &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt; &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt; &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// has been self-injected in ejbCreate() method at startup.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Connection connection = &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;null&lt;/span&gt;&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;try &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;connection = &lt;span class="Apple-style-span" style="color: #3333ff;"&gt;datasource&lt;/span&gt;.getConnection()&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;catch&lt;/span&gt;&lt;/span&gt;(SQLException exception)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;finally &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;try &lt;/span&gt;&lt;/span&gt;{ connection.close } &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;catch&lt;/span&gt;&lt;/span&gt;(Exception ignore){}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt; ejbCreate()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;try &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Using a service locator should be better&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Context ctx = &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;new &lt;/span&gt;&lt;/span&gt;InitialContext();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;datasource &lt;/span&gt;= (DataSource) ctx.lookup(&lt;span class="Apple-style-span" style="color: #3366ff;"&gt;"jdbc/ds"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;catch&lt;/span&gt;&lt;/span&gt;(NamingException exception)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// This ejb cannot be initialized because a needed resource cannot be retrieved &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
As you can see the lookup code (and the corresponding catch of the NamingException) is executed only once in the ejbCreate().&lt;/div&gt;
&lt;div&gt;
The first obvious consequence is that within onMessage() method the datasource member instance is used directly because it is already intialized.&lt;/div&gt;
&lt;div&gt;
There's only remaining open issue : what happens if the lookup fails in the ejbCreate? Basically that means the onMessage method will throw a NullPointerException and obviously we don't want that :) &lt;/div&gt;
&lt;div&gt;
If you are thinking about an if statement within the onMessage method  :  &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;if &lt;/span&gt;&lt;/span&gt;(&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;datasource &lt;/span&gt;!= null)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;....&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
That means probably you didn't read my previous post : &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;I hate if statements &lt;/span&gt;:) I think is better to equipe the ejb component with a state pattern in the following way :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;1) create a member instance which will represent the current state of the component: &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private &lt;/span&gt;&lt;/span&gt;MessageListener &lt;span class="Apple-style-span" style="color: #3333ff;"&gt;currentState&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;2) create one inner class which represents the WORKING state:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;final &lt;/span&gt;&lt;/span&gt;MessageListener WORKING = &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;new &lt;/span&gt;&lt;/span&gt;MessageListener()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt; onMessage()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Here we can use directly the datasource instance that &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;  &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// has been self-injected in ejbCreate() method at startup.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Connection connection = &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;null&lt;/span&gt;&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;try &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;connection = &lt;span class="Apple-style-span" style="color: #3333ff;"&gt;datasource&lt;/span&gt;.getConnection()&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;catch&lt;/span&gt;&lt;/span&gt;(SQLException exception)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;finally &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;try &lt;/span&gt;&lt;/span&gt;{ connection.close } &lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;catch&lt;/span&gt;&lt;/span&gt;(Exception ignore){}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;3) Create another inner class which represents the OFF state : &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;final &lt;/span&gt;&lt;/span&gt;MessageListener OFF = &lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;new &lt;/span&gt;&lt;/span&gt;MessageListener()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt; onMessage(Message message)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;try &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Context ctx = &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;new &lt;/span&gt;&lt;/span&gt;InitialContext();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;datasource = (DataSource) ctx.lookup("jdbc/ds");&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// State change : OFF --&amp;gt; WORKING&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;currentState &lt;/span&gt;= WORKING;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Process the message&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;currentState&lt;/span&gt;.onMessage(message);&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;catch&lt;/span&gt;&lt;/span&gt;(NamingException exception)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Don't change current state...resource is not yet available&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;  &lt;/span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;4) Update the memeber instance variable in order to set the OFF state as default state.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private &lt;/span&gt;&lt;/span&gt;MessageListener &lt;span class="Apple-style-span" style="color: #3333ff;"&gt;currentState &lt;/span&gt;= OFF;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
At this point, you should probably see that the ejbCreate is no longer useful because the check is made by the OFF state the first time the component raises up.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
So, the final code should look like this :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt; GxMessageDriven &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;implements &lt;/span&gt;&lt;/span&gt;MessageDrivenBean, MessageListener&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private final &lt;/span&gt;&lt;/span&gt;MessageListener OFF = &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;new &lt;/span&gt;&lt;/span&gt;MessageListener()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt; onMessage(Message message)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;try &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Context ctx = &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;new &lt;/span&gt;&lt;/span&gt;InitialContext();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;datasource &lt;/span&gt;= (DataSource) ctx.lookup(&lt;span class="Apple-style-span" style="color: #3366ff;"&gt;"jdbc/ds"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// State change : OFF --&amp;gt; WORKING &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;    &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;currentState = WORKING;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Process the message using the working state&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;currentState.onMessage(message);&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;catch&lt;/span&gt;&lt;/span&gt;(NamingException exception)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Don't change current state...resource is not yet available&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt; &lt;/span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private final&lt;/span&gt;&lt;/span&gt; MessageListener WORKING = &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;new &lt;/span&gt;&lt;/span&gt;MessageListener()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt; onMessage()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Here we can use directly the datasource instance that &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;   &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// has been self-injected in ejbCreate() method at startup.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Connection connection = &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;null&lt;/span&gt;&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;try &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;connection = &lt;span class="Apple-style-span" style="color: #3333ff;"&gt;datasource&lt;/span&gt;.getConnection()&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;catch&lt;/span&gt;&lt;/span&gt;(SQLException exception)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;//...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;finally &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;try &lt;/span&gt;&lt;/span&gt;{ connection.close } &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;catch&lt;/span&gt;&lt;/span&gt;(Exception ignore){}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private &lt;/span&gt;&lt;/span&gt;DataSource &lt;span class="Apple-style-span" style="color: #3333ff;"&gt;datasource&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private &lt;/span&gt;&lt;/span&gt;MessageListener &lt;span style="color: #3333ff;"&gt;currentState&lt;/span&gt;= OFF;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588390580596352744-1087323676899972222?l=andreagazzarini.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/5GOgDxEbncJxpdA01D6rL5JlfFE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5GOgDxEbncJxpdA01D6rL5JlfFE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/5GOgDxEbncJxpdA01D6rL5JlfFE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/5GOgDxEbncJxpdA01D6rL5JlfFE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AndreaGazzarinisWeblog/~4/GhU8LKRc5UQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andreagazzarini.blogspot.com/feeds/1087323676899972222/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588390580596352744&amp;postID=1087323676899972222" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/1087323676899972222?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/1087323676899972222?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AndreaGazzarinisWeblog/~3/GhU8LKRc5UQ/resource-dependency-injection-with-ejb.html" title="Dependency Injection with EJB 2.x" /><author><name>Andrea Gazzarini</name><uri>http://www.blogger.com/profile/11441190939598229208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_2N3Ud_TeXNQ/Sg0UiV0RrLI/AAAAAAAAAEc/SOvnHAwyH5E/S220/avatar.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andreagazzarini.blogspot.com/2009/05/resource-dependency-injection-with-ejb.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0MGRHs6cSp7ImA9WhdWFk4.&quot;"><id>tag:blogger.com,1999:blog-1588390580596352744.post-3005855166382742524</id><published>2009-02-13T09:21:00.009+01:00</published><updated>2011-09-10T08:17:05.519+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-10T08:17:05.519+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Apache QPID" /><title>Apache Qpid Committer!</title><content type="html">Hi all, it happened about two months ago...I became an Apache Committer for Qpid project &amp;nbsp;(http://qpid.apache.org)!&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial; font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;"Just a brief note, we have voted Andrea on as a committer,&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;all the accounts and details have&lt;br /&gt;been completed and he now has Karma! A warm welcome to the team Andrea."&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
YAHOOOO!!!&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Basically I developed (I'm still developing) a JMX / WS-DM adapter for Qpid broker in order to enable remote management using one of the mentioned technologies...I already knew JMX but WS-DM was (is still so :) ) completely unknown so at the end is a nice challenge :)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
If you are interested on that here you are some useful links :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
- Apache Qpid home page : &lt;a href="http://qpid.apache.org/"&gt;http://qpid.apache.org&lt;/a&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
- This is what I've done (really what I'm still doing...) : &amp;nbsp;&amp;nbsp;&lt;a href="http://qpid.apache.org/qman-qpid-management-bridge.html"&gt;http://qpid.apache.org/qman-qpid-management-bridge.html&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
...and last but not least...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="http://people.apache.org/list_G.html#agazzarini"&gt;http://people.apache.org/list_G.html#agazzarini&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Best regards,&lt;/div&gt;
&lt;div&gt;
Andrea&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588390580596352744-3005855166382742524?l=andreagazzarini.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZhQNC4ydIC7IYv4ZL-PAiGJ1aE0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZhQNC4ydIC7IYv4ZL-PAiGJ1aE0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZhQNC4ydIC7IYv4ZL-PAiGJ1aE0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZhQNC4ydIC7IYv4ZL-PAiGJ1aE0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AndreaGazzarinisWeblog/~4/Xp3c4UGIT5I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andreagazzarini.blogspot.com/feeds/3005855166382742524/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588390580596352744&amp;postID=3005855166382742524" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/3005855166382742524?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/3005855166382742524?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AndreaGazzarinisWeblog/~3/Xp3c4UGIT5I/apache-qpid-committer.html" title="Apache Qpid Committer!" /><author><name>Andrea Gazzarini</name><uri>http://www.blogger.com/profile/11441190939598229208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_2N3Ud_TeXNQ/Sg0UiV0RrLI/AAAAAAAAAEc/SOvnHAwyH5E/S220/avatar.jpg" /></author><thr:total>2</thr:total><feedburner:origLink>http://andreagazzarini.blogspot.com/2009/02/apache-qpid-committer.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04MR38zeSp7ImA9WhdWFk4.&quot;"><id>tag:blogger.com,1999:blog-1588390580596352744.post-9194614375040039758</id><published>2008-12-03T08:36:00.004+01:00</published><updated>2011-09-10T08:26:26.181+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-10T08:26:26.181+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Object Oriented Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="If-Less" /><category scheme="http://www.blogger.com/atom/ns#" term="Design Pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>IF-LESS code : State / Strategy Pattern</title><content type="html">&lt;div&gt;
We have a simple class that is looping on a given List&lt;string&gt;. Requirement are :&lt;/string&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
1) Service must preserve the first value of the list;&lt;/div&gt;
&lt;div&gt;
2) Each other element must be printed in uppercase&lt;/div&gt;
&lt;div&gt;
3) At the end of the loop the "Exit" string must be printed out;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The first version is the following :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public class&lt;/span&gt;&lt;/span&gt; Service {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;String &lt;span class="Apple-style-span" style="color: #3333ff;"&gt;theFirst&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;public void&lt;/span&gt;&lt;/span&gt; loop(List&lt;/span&gt;&lt;string&gt;&lt;span class="Apple-style-span"&gt; strings){&lt;/span&gt;&lt;/string&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;int &lt;/span&gt;&lt;/span&gt;index = 0;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;for &lt;/span&gt;&lt;/span&gt;(String string : strings) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;if &lt;/span&gt;&lt;/span&gt;(index == 0) {&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;theFirst = string;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;} &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;else &lt;/span&gt;&lt;/span&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;System.out.println(string.toUpperCase());&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;index++;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;System.out.println("&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;Exit"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Ok, brief and (moreless) clear; Let's try to modify a little bit that class; First, I'd introduce a compose method in order isolate what needs to be done&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
for middle iterations (uppercase printing) so I'll introduce :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private void&lt;/span&gt;&lt;/span&gt; uppercase(String value) {&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;System.out.println(value.toUppercase());&lt;/div&gt;
&lt;div&gt;
}&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Next, I don't like the explicit loop &amp;amp; condition logic. The tasks that need to be executed in the current example are very simple but let's try to imagine a more complicated task&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
(for initial and middle iteration) : the code should result complicated to understand...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&amp;nbsp;I'd prefer to isolate those tasks in a separate method / class.&lt;/div&gt;
&lt;div&gt;
So, in order to do that, let's introduce an Iteration interface that represents the task that needs to be executed on a given iteration.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="color: #33cc00;"&gt;// Determines what needs to be done on a given iteration&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;interface &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration &lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;void &lt;/span&gt;&lt;/span&gt;execute(String value);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
we have two concrete implementors; something like that:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;Iteration &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;firstIteration &lt;/span&gt;= &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;new &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration&lt;/span&gt;&lt;span class="Apple-style-span"&gt;() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt; execute(String value) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Store the value of the first element&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;Iteration &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;middleIteration &lt;/span&gt;= &lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;new &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration&lt;/span&gt;&lt;span class="Apple-style-span"&gt;() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;public void&lt;/span&gt;&lt;/span&gt; execute(String value) {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;uppercase&lt;/span&gt;(value);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Now, each task should be responsible to execute its logic and in addition should provide some mechanism to compute &amp;amp; execute the next iteration.&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
In order to do that we change a little the Iteration interface and the hosting class introducing a new Iterator member that is initialized on the loop() method.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;interface &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration &lt;/span&gt;&lt;span class="Apple-style-span"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;void &lt;/span&gt;&lt;/span&gt;execute();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;Iteration &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;firstIteration &lt;/span&gt;= &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;new &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration&lt;/span&gt;&lt;span class="Apple-style-span"&gt;() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public &lt;/span&gt;&lt;/span&gt;void execute() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// Store the value of the iterator.next() that is the first element of the list;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;Iteration &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;middleIteration &lt;/span&gt;= &lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;new &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration&lt;/span&gt;&lt;span class="Apple-style-span"&gt;() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt; execute() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;uppercase(&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;iterator&lt;/span&gt;.next());&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iterator&lt;/span&gt;&lt;string&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;iterator&lt;/span&gt;;&lt;/span&gt;&lt;/string&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;...&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;public void&lt;/span&gt;&lt;/span&gt; loop(List&lt;/span&gt;&lt;string&gt;&lt;span class="Apple-style-span"&gt; strings) {&lt;/span&gt;&lt;/string&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;iterator &lt;/span&gt;= strings.iterator();&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
At this point we need to maintain a reference to the current iteration. So let's introduce another instance member :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private &lt;/span&gt;&lt;/span&gt;Iteration &lt;span class="Apple-style-span" style="color: #3333ff;"&gt;currentIteration &lt;/span&gt;= &lt;span class="Apple-style-span" style="color: #3333ff;"&gt;firstIteration&lt;/span&gt;;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
The initial value of this currentIteration is obviously the previously declared inner class "firstIteration". After that the loop method should be changed in order to start the loop :&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt; loop(List&lt;/span&gt;&lt;string&gt;&lt;span class="Apple-style-span"&gt; strings) {&lt;/span&gt;&lt;/string&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;iterator &lt;/span&gt;= strings.iterator();&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;currentIteration&lt;/span&gt;.execute();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Next, we need a way to continue the execution of the loop. We can do that introducing another method :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt; nextIteration() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;currentIteration &lt;/span&gt;= (&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;iterator&lt;/span&gt;.hasNext()) ? &lt;span class="Apple-style-span" style="color: #3333ff;"&gt;middleIteration&lt;/span&gt;: &lt;span class="Apple-style-span" style="color: #3333ff;"&gt;noIteration&lt;/span&gt;;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;currentIteration&lt;/span&gt;.execute();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;div&gt;
ok, ok, I know...this is still a conditional logic but is not exaclty the same as the previous one...I'm not deal with indexes or temporary variables...just with the given collection...&lt;/div&gt;
&lt;div&gt;
As you can saw, we need another instance of Iteration inner interface for determine what needs to be done when the end of the loop is reached.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private final&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;noIteration &lt;/span&gt;= &lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;new &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration&lt;/span&gt;&lt;span class="Apple-style-span"&gt;() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;public void&lt;/span&gt;&lt;/span&gt; execute() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;System.out.println(&lt;span class="Apple-style-span" style="color: #3366ff;"&gt;"Exit"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
That's all! Do you think I'm paranoic? :)....mmmmmm...yes! Note that the code above is just an exercise and the benefits are not evident because&amp;nbsp;the starting class is very simple (I mean, the logic of the initial version of that class) but I can ensure you that they are more evident when those things are applied to a more&amp;nbsp;complicated scenario...&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
This is the final version of the IlLessService :&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;IfLessService {&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;String&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;theFirst&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;private &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;ListIterator&lt;string&gt;&lt;/string&gt;&lt;/span&gt;&lt;string&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-style-span" style="color: #3333ff;"&gt;iterator&lt;/span&gt;;&lt;/span&gt;&lt;/string&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;interface&lt;/span&gt;&lt;/span&gt; Iteration {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;void &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;execute();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// What needs to be done in the first iteration?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private final&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration &lt;span class="Apple-style-span"&gt;firstIteration&lt;/span&gt;= &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;new &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;execute() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;theFirst &lt;/span&gt;&lt;/span&gt;= &lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;iterator&lt;/span&gt;&lt;/span&gt;.next();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;executeNextIteration&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// And in the middle iteration(s)?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private final&lt;/span&gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;middleIteration &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;=&lt;/span&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;new &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt; execute() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;uppercase&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;(&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;iterator&lt;/span&gt;&lt;/span&gt;.next());&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;executeNextIteration&lt;/span&gt;();&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="white-space: pre;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;// And when the iteration will terminate?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;private final&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;noIteration &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;=&lt;/span&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;new &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;execute() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;System.out.println("Exit");&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;    &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;};&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;Iteration &lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;currentIteration &lt;/span&gt;&lt;/span&gt;= &lt;span class="Apple-style-span" style="color: #3333ff;"&gt;firstIteration&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;public void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;loop(List&lt;/span&gt;&lt;string&gt;&lt;span class="Apple-style-span"&gt; strings){&lt;/span&gt;&lt;/string&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;iterator &lt;/span&gt;&lt;/span&gt;= strings.listIterator();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;currentIteration&lt;/span&gt;&lt;/span&gt;.execute();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;private void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;uppercase(String aString) {&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;System.out.println(aString.toUpperCase());&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;private void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;executeNextIteration(){&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;currentIteration &lt;/span&gt;&lt;/span&gt;= (&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;iterator&lt;/span&gt;&lt;/span&gt;.hasNext()) ? &lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;middleIteration&lt;/span&gt;&lt;/span&gt;: &lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;noIteration&lt;/span&gt;&lt;/span&gt;;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt;  &lt;span class="Apple-tab-span" style="white-space: pre;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;currentIteration&lt;/span&gt;&lt;/span&gt;.execute();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span"&gt; &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="color: #33ccff;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
Regards,&lt;/div&gt;
&lt;div&gt;
Andrea&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588390580596352744-9194614375040039758?l=andreagazzarini.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/f5DUdD7K79ATz6G7ByNGOQhx6M4/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/f5DUdD7K79ATz6G7ByNGOQhx6M4/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/f5DUdD7K79ATz6G7ByNGOQhx6M4/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/f5DUdD7K79ATz6G7ByNGOQhx6M4/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AndreaGazzarinisWeblog/~4/lvEDSghgK-4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andreagazzarini.blogspot.com/feeds/9194614375040039758/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588390580596352744&amp;postID=9194614375040039758" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/9194614375040039758?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/9194614375040039758?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AndreaGazzarinisWeblog/~3/lvEDSghgK-4/if-less-code-state-strategy-pattern.html" title="IF-LESS code : State / Strategy Pattern" /><author><name>Andrea Gazzarini</name><uri>http://www.blogger.com/profile/11441190939598229208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_2N3Ud_TeXNQ/Sg0UiV0RrLI/AAAAAAAAAEc/SOvnHAwyH5E/S220/avatar.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://andreagazzarini.blogspot.com/2008/12/if-less-code-state-strategy-pattern.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04DQHY_fip7ImA9WhdWFk4.&quot;"><id>tag:blogger.com,1999:blog-1588390580596352744.post-5099441161890678990</id><published>2008-11-14T11:22:00.008+01:00</published><updated>2011-09-10T08:26:11.846+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-09-10T08:26:11.846+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Object Oriented Programming" /><category scheme="http://www.blogger.com/atom/ns#" term="If-Less" /><category scheme="http://www.blogger.com/atom/ns#" term="Design Pattern" /><category scheme="http://www.blogger.com/atom/ns#" term="Java" /><title>IF-LESS code : State Pattern</title><content type="html">&lt;span class="Apple-style-span" style="font-size: small;"&gt;Hi all, let's start with a post on this interesting topic (at least for me) with a simple example.&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;We have an interface named &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;IService &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;that represents a generic service. The interface offers three methods : &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;start&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;(), &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;stop&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;() and &lt;/span&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;isRunning&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;().&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public interface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; IService {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;void &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;start(); &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #33cc00;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;// Starts the service.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;void &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;stop(); /&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #33cc00;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;/ Stops the service.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;boolean &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;isRunning(); &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #33cc00;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;// Returns true if the service is running.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;While looking at the following implementation, I wasn't satisfied about the conditional statements on start() and stop() method :&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; ServiceImpl &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;implements &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;IService {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;private volatile&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;boolean &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;started&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;private &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Thread &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;thread&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public synchronized void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; start() {&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;if &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;(&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;started&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="color: red;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: black;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;return&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;started &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;= &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;thread &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;= ... &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;// Create your daemon implementation.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;thread&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;.setDaemon(&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;thread&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;.start();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public synchronized&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; void stop()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; { &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;if &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;(!&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;started&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;return&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;started &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;= &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;false&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;thread&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;.interrupt();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;try &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;{&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;thread&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;.join();&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;catch &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;(InterruptedException ignore) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public synchronized boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; isRunning() {&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;return &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;started&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;To be honest, what I don't like is :&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;- Maintaining the state of the service in a boolean member and therefore relying on that in order to know if the service is alive or not (the isRunning method)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;- Conditional logic used for checking everytime the (start &amp;amp; stop) methods are called if the service is alive or not. I think the service should know that without using a boolean member to remember! An example : if you are driving a car, how do you know that it's running? You know that because it's running and you're driving! ;-) and not because after turned it on you put a post-it on the dashboard with "RUNNING" written over!&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;I mean : it's the status itself that suggests you what's going on!&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;As result of that, I prefer this version of the service implementation:&lt;/span&gt;&lt;/div&gt;
&lt;div style="text-align: left;"&gt;
&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public class&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; IfLessService &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;implements &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;IService {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;private &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Thread &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;_watcher&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;* RUNNING STATE.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;private final&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; IService running = &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;new &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;IService() {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; isRunning()&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;return true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;// We are inside the running state and so...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; start() {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;// Nothing to do here...it is already started.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; stop() &amp;nbsp;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;_watcher&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;.interrupt();&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;try &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;_watcher&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;.join();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;catch &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;(InterruptedException ignore)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;state &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;= &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;notRunning&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; };&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; /**&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;* NOT RUNNING STATE.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;*/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;private final&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; IService notRunning = &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;new &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;IService() &amp;nbsp;{ &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; isRunning() &amp;nbsp;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;return false&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;// We are inside the not running state and so...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public synchronized void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; start() &amp;nbsp;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;_watcher&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; = &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;...&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;// Create your daemon implementation...&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;_watcher&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;.setDaemon(&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;true&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;_watcher&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;.start();&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; // ...and make a state change too...from NOT-RUNNING to RUNNING.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;state &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;= &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;running&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; stop() {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;// Nothing to do here...it is already stopped. &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;} &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; }; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;// Default initial state is stopped (not running).&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;private &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;IService &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;state &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;= &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;notRunning&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public synchronized void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; start() { &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;state&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;.start(); &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;// Current state delegation&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public synchronized void&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; stop() { &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;state&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;.stop(); &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;// Current state delegation&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;public boolean&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; isRunning() {&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;&lt;span class="Apple-style-span" style="color: #660000;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;return &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #3333ff;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;state&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;.isRunning();&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span"&gt;&lt;span class="Apple-style-span" style="color: #009900;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;// Current state delegation&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Now the service implementation is delegating the execution of the IService methods to the current internal state. Those states are themselves implementors of IService interface. We have two states : running and notRunning.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Note that the responsibility of &amp;nbsp;each state is not only to manage the "state" of the object at a specific moment but also to provide an eventual state transition: for example when the service is not running (state = notRunning), if you call the start() method there will be a state transition (state = running).&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Any comment would be very very appreciated...&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1588390580596352744-5099441161890678990?l=andreagazzarini.blogspot.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/HO6Dr7vIzJ0jUMO01zy179HmGQE/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HO6Dr7vIzJ0jUMO01zy179HmGQE/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/HO6Dr7vIzJ0jUMO01zy179HmGQE/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/HO6Dr7vIzJ0jUMO01zy179HmGQE/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/AndreaGazzarinisWeblog/~4/7O7YPz8hOUQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://andreagazzarini.blogspot.com/feeds/5099441161890678990/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=1588390580596352744&amp;postID=5099441161890678990" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/5099441161890678990?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/1588390580596352744/posts/default/5099441161890678990?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/AndreaGazzarinisWeblog/~3/7O7YPz8hOUQ/if-less-code-example-1.html" title="IF-LESS code : State Pattern" /><author><name>Andrea Gazzarini</name><uri>http://www.blogger.com/profile/11441190939598229208</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://2.bp.blogspot.com/_2N3Ud_TeXNQ/Sg0UiV0RrLI/AAAAAAAAAEc/SOvnHAwyH5E/S220/avatar.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://andreagazzarini.blogspot.com/2008/11/if-less-code-example-1.html</feedburner:origLink></entry></feed>

