<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type='text/xsl' href='http://psecheresse.spaces.live.com/mmm2008-07-24_12.50/rsspretty.aspx?rssquery=en-US;http%3a%2f%2fpsecheresse.spaces.live.com%2fblog%2ffeed.rss' version='1.0'?><rss version="2.0" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:msn="http://schemas.microsoft.com/msn/spaces/2005/rss" xmlns:live="http://schemas.microsoft.com/live/spaces/2006/rss" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:cf="http://www.microsoft.com/schemas/rss/core/2005" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Patrice Secheresse: Blog</title><description /><link>http://psecheresse.spaces.live.com/blog</link><language>en-US</language><pubDate>Sun, 05 Oct 2008 18:57:04 GMT</pubDate><lastBuildDate>Sun, 05 Oct 2008 18:57:04 GMT</lastBuildDate><generator>Microsoft Spaces v1.1</generator><docs>http://www.rssboard.org/rss-specification</docs><ttl>60</ttl><cf:parentRSS>http://psecheresse.spaces.live.com/feed.rss</cf:parentRSS><live:type>blog</live:type><live:identity><live:id>5271488616015715389</live:id><live:alias>psecheresse</live:alias></live:identity><image><title>Patrice Secheresse: Blog</title><url>http://byfiles.storage.live.com/y1pkyXzk47yOzd08m9Uu_-Ntbf4gAM2fyj7n4_Y2L9wAHCfT77NqKheUg</url><link>http://psecheresse.spaces.live.com/blog</link></image><cf:listinfo><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="typelabel" label="Type" /><cf:group ns="http://schemas.microsoft.com/live/spaces/2006/rss" element="tag" label="Tag" /><cf:group element="category" label="Category" /><cf:sort element="pubDate" label="Date" data-type="date" default="true" /><cf:sort element="title" label="Title" data-type="string" /><cf:sort ns="http://purl.org/rss/1.0/modules/slash/" element="comments" label="Comments" data-type="number" /></cf:listinfo><item><title>BeansBinding: validation error</title><link>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!266.entry</link><description>&lt;p&gt;To continue the previous blog, I will add some explanations about the &lt;strong&gt;validator&lt;/strong&gt;. &lt;p&gt;For example, I want to validate the age to ensure that it is between 0 and 150. All you need to do is to create a class that extends Validator and implements the method validate(). &lt;p&gt;Here the class AgeValidator: &lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4"&gt; &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; AgeValidator extends Validator&amp;lt;Integer&amp;gt; {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   2:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   3:&lt;/span&gt;     @Override&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; Result validate(Integer &lt;span style="color:#0000ff"&gt;value&lt;/span&gt;) {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   5:&lt;/span&gt;         &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;value&lt;/span&gt; &amp;lt; 0 || &lt;span style="color:#0000ff"&gt;value&lt;/span&gt; &amp;gt; 150) {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   6:&lt;/span&gt;             &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; Result(1, &lt;span style="color:#006080"&gt;&amp;quot;The age must be between 0 and 150. The value &amp;quot;&lt;/span&gt; + &lt;span style="color:#0000ff"&gt;value&lt;/span&gt; + &lt;span style="color:#006080"&gt;&amp;quot; is incorrect.&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   7:&lt;/span&gt;         }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   8:&lt;/span&gt;         &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   9:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  10:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The method returns a null value if the value is valid.
&lt;p&gt;If an error occurs, you create a result object with a code and/or a description. The code can be useful when you internationalise the application. It could be any object or null.
&lt;p&gt;To add the validator, you just have to set it in the binding: binding.setValidator(new AgeValidator());
&lt;p&gt;So, if you add these lines at the end of our previous run method:
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size=1&gt;text.setText(&amp;quot;151&amp;quot;); //incorrect value, print failure&lt;br&gt;text.setText(&amp;quot;-1&amp;quot;); //incorrect value, print failure &lt;/font&gt;&lt;/blockquote&gt;
&lt;p&gt;The result will be:
&lt;p&gt;&lt;font face="Courier New" color="#ff0000" size=1&gt;Failure VALIDATION_FAILED: org.jdesktop.beansbinding.Validator$Result [errorCode=1, description=The age must be between 0 and 150. The value 151 is incorrect.]&lt;br&gt;Failure VALIDATION_FAILED: org.jdesktop.beansbinding.Validator$Result [errorCode=1, description=The age must be between 0 and 150. The value -1 is incorrect.]&lt;/font&gt;
&lt;p&gt;You can notice that the type of error is now VALIDATION_FAILED instead of CONVERSION_FAILED.
&lt;p&gt;The validation occurs after the conversion. The idea is to work with the source object type to keep the validation independent of the &lt;u&gt;UI&lt;/u&gt;. However, this lead to 2 different systems: 
&lt;ul&gt;
&lt;li&gt;conversion error, based on a &lt;code&gt;&lt;strong&gt;&lt;font size=1&gt;RuntimeException&lt;/font&gt;&lt;/strong&gt;&lt;/code&gt; to indicate a problem with the conversion
&lt;li&gt;validation error, based on &lt;strong&gt;&lt;font face="Courier New" size=1&gt;Result&lt;/font&gt;&lt;/strong&gt; object to indicate an incorrect state of the resulting object after conversion&lt;/ul&gt;
&lt;p&gt;You have to check the failure and display the error depending of the type. Using an unified way to send a failure would have been simpler.
&lt;p&gt;The full code of the main class is:
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; Main {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   2:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   3:&lt;/span&gt;     Person person;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   4:&lt;/span&gt;     Text text;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   5:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; Main() {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   7:&lt;/span&gt;         person = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; Person(&lt;span style="color:#006080"&gt;&amp;quot;John&amp;quot;&lt;/span&gt;, 21);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   8:&lt;/span&gt;         text = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; Text();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   9:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  10:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  11:&lt;/span&gt;     &lt;span style="color:#008000"&gt;/**&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  12:&lt;/span&gt; &lt;span style="color:#008000"&gt;     * @param args the command line arguments&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  13:&lt;/span&gt; &lt;span style="color:#008000"&gt;     */&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  14:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; main(String[] args) {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  15:&lt;/span&gt;         Main test = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; Main();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  16:&lt;/span&gt;         test.run();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  17:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  18:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  19:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  20:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; run() {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  21:&lt;/span&gt;         Property ageProperty = BeanProperty.create(&lt;span style="color:#006080"&gt;&amp;quot;age&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  22:&lt;/span&gt;         Property textProperty = BeanProperty.create(&lt;span style="color:#006080"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  23:&lt;/span&gt;         &lt;span style="color:#008000"&gt;// bind the persone age to a text component&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  24:&lt;/span&gt;         Binding binding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  25:&lt;/span&gt;                 person, ageProperty, text, textProperty);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  26:&lt;/span&gt;         binding.setValidator(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; AgeValidator());&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  27:&lt;/span&gt;         binding.addBindingListener(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; AbstractBindingListener() {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  28:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  29:&lt;/span&gt;             @Override&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  30:&lt;/span&gt;             &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; syncFailed(Binding binding, SyncFailure failure) {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  31:&lt;/span&gt;                 System.err.println(&lt;span style="color:#006080"&gt;&amp;quot;Failure &amp;quot;&lt;/span&gt; + failure);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  32:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  33:&lt;/span&gt;         });&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  34:&lt;/span&gt;         binding.bind();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  35:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  36:&lt;/span&gt;         text.setText(&lt;span style="color:#006080"&gt;&amp;quot;22&amp;quot;&lt;/span&gt;); &lt;span style="color:#008000"&gt;// print value&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  37:&lt;/span&gt;         text.setText(&lt;span style="color:#006080"&gt;&amp;quot;22 and half&amp;quot;&lt;/span&gt;); &lt;span style="color:#008000"&gt;// incorrect value, print failure&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  38:&lt;/span&gt;         text.setText(&lt;span style="color:#006080"&gt;&amp;quot;151&amp;quot;&lt;/span&gt;); &lt;span style="color:#008000"&gt;//incorrect value, print failure&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  39:&lt;/span&gt;         text.setText(&lt;span style="color:#006080"&gt;&amp;quot;-1&amp;quot;&lt;/span&gt;); &lt;span style="color:#008000"&gt;//incorrect value, print failure&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  40:&lt;/span&gt;     }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5271488616015715389&amp;page=RSS%3a+BeansBinding%3a+validation+error&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=psecheresse.spaces.live.com&amp;amp;GT1=psecheresse"&gt;</description><category>Computers and Internet</category><comments>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!266.entry#comment</comments><guid isPermaLink="true">http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!266.entry</guid><pubDate>Mon, 25 Aug 2008 11:28:44 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!266/comments/feed.rss</wfw:commentRss><wfw:comment>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!266.entry#comment</wfw:comment><dcterms:modified>2008-08-25T11:28:44Z</dcterms:modified></item><item><title>BeansBinding: conversion error</title><link>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!265.entry</link><description>&lt;p&gt;  &lt;p&gt;For a long time I haven't posted anything on this blog. One reason is the finalization of the project &lt;strong&gt;VolunteerBase&lt;/strong&gt;. Since the installation, no news... &lt;p&gt;Another reason is my new job in &lt;strong&gt;OrderMate&lt;/strong&gt; since March. I am working on an advanced Point Of Sale software for restaurant, café and hospitality. Everything is written in Java, including the new back end which present a rich client interface based on Swing.  &lt;p&gt;The recent evolution uses the &lt;strong&gt;BeansBinding&lt;/strong&gt; library. An excellent blog &lt;a href="http://today.java.net/pub/a/2008/03/20/synchronizing-properties-with-beans-binding.html" target="_blank"&gt;here&lt;/a&gt; details the basic usage of this library and this &lt;a href="http://developers.sun.com/learning/javaoneonline/j1sessn.jsp?sessn=TS-6657&amp;amp;yr=2008&amp;amp;track=desktop" target="_blank"&gt;Java One Technical Session&lt;/a&gt; is a good introduction. &lt;p&gt;An important aspect is the mechanism to convert and validate a property and I will enlarge on it today. To illustrate a basic problem with conversion and validation, I use an integer property bind to a text component. I use the same kind Person class from the John O'Conner blog, with name and age property: &lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4"&gt; &lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; Person {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   2:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; String name;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; age;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   5:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; Person() {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   7:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   8:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   9:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; Person(String name, &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; age) {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  10:&lt;/span&gt;         &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.name = name;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  11:&lt;/span&gt;         &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.age = age;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  12:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  13:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  14:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; getAge() {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  15:&lt;/span&gt;         &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; age;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  16:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  17:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  18:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; setAge(&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; age) {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  19:&lt;/span&gt;         &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.age = age;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  20:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  21:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  22:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; String getName() {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  23:&lt;/span&gt;         &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; name;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  24:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  25:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  26:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; setName(String name) {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  27:&lt;/span&gt;         &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.name = name;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  28:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  29:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;The text component is a simple JavaBeans component with only one 'text' property and the property change support. The value is printed each time it is set. The idea is to emulate a JText component.
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; Text {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   2:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   3:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; PropertyChangeSupport propertySupport = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; PropertyChangeSupport(&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   4:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; String text;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   5:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; String getText() {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   7:&lt;/span&gt;         &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; text;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   8:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   9:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  10:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; setText(String text) {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  11:&lt;/span&gt;         String oldText = &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.text;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  12:&lt;/span&gt;         &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.text = text;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  13:&lt;/span&gt;         System.&lt;span style="color:#0000ff"&gt;out&lt;/span&gt;.println(&lt;span style="color:#006080"&gt;&amp;quot;Set text to &amp;quot;&lt;/span&gt; + text);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  14:&lt;/span&gt;         propertySupport.firePropertyChange(&lt;span style="color:#006080"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;, oldText, text);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  15:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  16:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  17:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; addPropertyChangeListener(PropertyChangeListener listener) {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  18:&lt;/span&gt;         propertySupport.addPropertyChangeListener(listener);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  19:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  20:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  21:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; removePropertyChangeListener(PropertyChangeListener listener) {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  22:&lt;/span&gt;         propertySupport.removePropertyChangeListener(listener);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  23:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  24:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;Now, I want to bind the age to the text and simulate the users entry by setting the value of the text.
&lt;p&gt;First, create the properties and bind them: the source is the bean from the data source, the target is generally a visual component. Be careful to respect this, a validator is designed to check that a target value is valid. For today, we won't use a validator:
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size=1&gt;Property ageProperty = BeanProperty.create(&amp;quot;age&amp;quot;);&lt;br&gt;Property textProperty = BeanProperty.create(&amp;quot;text&amp;quot;); &lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New" size=1&gt;Binding binding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE,&lt;br&gt;        person, ageProperty, text, textProperty); &lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New" size=1&gt;binding.bind(); &lt;/font&gt;&lt;/blockquote&gt;
&lt;p&gt;That's it, any modifications of the text property will go through a default converter and set the age property of the persone:
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size=1&gt;text.setText(&amp;quot;22&amp;quot;);&lt;/font&gt;&lt;/blockquote&gt;
&lt;p&gt;But what happens if the value is incorrect?
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size=1&gt;text.setText(&amp;quot;22 and half&amp;quot;);&lt;/font&gt;&lt;/blockquote&gt;
&lt;p&gt;The answer is... nothing. The default converter from String to integer uses Integer.parseInt((String)value) which throws a &lt;code&gt;NumberFormatException,&lt;/code&gt; as stated in the JavaDoc. The exception is caught and the conversion fails. Even creating a validator won't help, the converter is called &lt;strong&gt;&lt;font color="#000080"&gt;BEFORE&lt;/font&gt;&lt;/strong&gt; the validator and insulates the application from any Exception. There are three ways to find out what is wrong:
&lt;ul&gt;
&lt;li&gt;calling the method save() which return a SyncFailure if something is wrong, otherwise set the source value from the target value and set the target value with the new source value 
&lt;li&gt;calling the method getSourceValueForTarget() which return a ValueResult if something is wrong but does not modify the source nor the target 
&lt;li&gt;add a listener to know when the error occurs&lt;/ul&gt;
&lt;p&gt;The last solution offers the possibility to react to an incorrect value, for example, in a GUI it will disable the OK button and will set the text field in a different color. In this simple example, it will simply display the error with the added code below:
&lt;blockquote&gt;
&lt;p&gt;&lt;font face="Courier New" size=1&gt;binding.addBindingListener(new AbstractBindingListener() { &lt;/font&gt;
&lt;p&gt;&lt;font face="Courier New" size=1&gt;    @Override&lt;br&gt;    public void syncFailed(Binding binding, SyncFailure failure) {&lt;br&gt;        System.err.println(&amp;quot;Failure &amp;quot; + failure);&lt;br&gt;    }&lt;br&gt;}); &lt;/font&gt;&lt;/blockquote&gt;
&lt;p&gt;This code will print: 
&lt;p&gt;&lt;font color="#ff0000"&gt;Failure CONVERSION_FAILED: java.lang.NumberFormatException: For input string: &amp;quot;22 and half&amp;quot;&lt;/font&gt;
&lt;p&gt;The full code of the main class is here:
&lt;div style="border-right:gray 1px solid;padding-right:4px;border-top:gray 1px solid;padding-left:4px;font-size:8pt;padding-bottom:4px;margin:20px 0px 10px;overflow:auto;border-left:gray 1px solid;width:97.5%;cursor:text;line-height:12pt;padding-top:4px;border-bottom:gray 1px solid;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4"&gt;
&lt;div style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   1:&lt;/span&gt; &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; Main {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   2:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   3:&lt;/span&gt;     Person person;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   4:&lt;/span&gt;     Text text;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   5:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   6:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; Main() {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   7:&lt;/span&gt;         person = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; Person(&lt;span style="color:#006080"&gt;&amp;quot;John&amp;quot;&lt;/span&gt;, 21);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   8:&lt;/span&gt;         text = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; Text();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;   9:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  10:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  11:&lt;/span&gt;     &lt;span style="color:#008000"&gt;/**&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  12:&lt;/span&gt; &lt;span style="color:#008000"&gt;     * @param args the command line arguments&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  13:&lt;/span&gt; &lt;span style="color:#008000"&gt;     */&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  14:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; main(String[] args) {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  15:&lt;/span&gt;         Main test = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; Main();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  16:&lt;/span&gt;         test.run();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  17:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  18:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  19:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  20:&lt;/span&gt;     &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; run() {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  21:&lt;/span&gt;         Property ageProperty = BeanProperty.create(&lt;span style="color:#006080"&gt;&amp;quot;age&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  22:&lt;/span&gt;         Property textProperty = BeanProperty.create(&lt;span style="color:#006080"&gt;&amp;quot;text&amp;quot;&lt;/span&gt;);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  23:&lt;/span&gt;         &lt;span style="color:#008000"&gt;// bind the persone age to a text component&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  24:&lt;/span&gt;         Binding binding = Bindings.createAutoBinding(UpdateStrategy.READ_WRITE,&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  25:&lt;/span&gt;                 person, ageProperty, text, textProperty);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  26:&lt;/span&gt;         binding.bind();&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  27:&lt;/span&gt;         binding.addBindingListener(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; AbstractBindingListener() {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  28:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  29:&lt;/span&gt;             @Override&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  30:&lt;/span&gt;             &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; syncFailed(Binding binding, SyncFailure failure) {&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  31:&lt;/span&gt;                 System.err.println(&lt;span style="color:#006080"&gt;&amp;quot;Failure &amp;quot;&lt;/span&gt; + failure);&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  32:&lt;/span&gt;             }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  33:&lt;/span&gt;         });&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  34:&lt;/span&gt;  &lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  35:&lt;/span&gt;         text.setText(&lt;span style="color:#006080"&gt;&amp;quot;22&amp;quot;&lt;/span&gt;); &lt;span style="color:#008000"&gt;// print value&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  36:&lt;/span&gt;         text.setText(&lt;span style="color:#006080"&gt;&amp;quot;22 and half&amp;quot;&lt;/span&gt;); &lt;span style="color:#008000"&gt;// incorrect value, print failure&lt;/span&gt;&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  37:&lt;/span&gt;     }&lt;/pre&gt;&lt;pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"&gt;&lt;span style="color:#606060"&gt;  38:&lt;/span&gt; }&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt; 
&lt;p&gt;This conclude this post, the next step will be adding a validator.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5271488616015715389&amp;page=RSS%3a+BeansBinding%3a+conversion+error&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=psecheresse.spaces.live.com&amp;amp;GT1=psecheresse"&gt;</description><category>Computer and Internet</category><comments>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!265.entry#comment</comments><guid isPermaLink="true">http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!265.entry</guid><pubDate>Thu, 21 Aug 2008 12:02:02 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!265/comments/feed.rss</wfw:commentRss><wfw:comment>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!265.entry#comment</wfw:comment><dcterms:modified>2008-08-25T10:08:20Z</dcterms:modified></item><item><title>Stable version of VolunteerBase</title><link>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!208.entry</link><description>&lt;p&gt;This version 0.6 of &lt;a href="http://sourceforge.net/projects/volunteerbase/" target="_blank"&gt;volunteerbase&lt;/a&gt; contains fixes and minor improvements, the project is now in a stable phase. The &lt;a href="http://volunteerbase.wiki.sourceforge.net/userguide" target="_blank"&gt;Wiki user guide&lt;/a&gt; has a comprehensive coverage of all the functions. The package has been upgraded to Tomcat 6.0 and the distribution can use Java 5.0 or 6.0.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5271488616015715389&amp;page=RSS%3a+Stable+version+of+VolunteerBase&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=psecheresse.spaces.live.com&amp;amp;GT1=psecheresse"&gt;</description><comments>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!208.entry#comment</comments><guid isPermaLink="true">http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!208.entry</guid><pubDate>Sat, 24 Nov 2007 00:50:59 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!208/comments/feed.rss</wfw:commentRss><wfw:comment>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!208.entry#comment</wfw:comment><dcterms:modified>2007-11-24T00:50:59Z</dcterms:modified></item><item><title>Volunteerbase project specifications completed</title><link>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!199.entry</link><description>&lt;p&gt;With the release 0.5, the project is now covering the initial specifications. The next big steps will be the functional tests, acceptance test and the documentation. The test by the new SPW Australia team should add some new ideas and further evolutions.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5271488616015715389&amp;page=RSS%3a+Volunteerbase+project+specifications+completed&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=psecheresse.spaces.live.com&amp;amp;GT1=psecheresse"&gt;</description><comments>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!199.entry#comment</comments><guid isPermaLink="true">http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!199.entry</guid><pubDate>Fri, 19 Oct 2007 09:33:40 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!199/comments/feed.rss</wfw:commentRss><wfw:comment>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!199.entry#comment</wfw:comment><dcterms:modified>2007-10-19T09:33:40Z</dcterms:modified></item><item><title>Release 0.4 of VolunteerBase project</title><link>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!194.entry</link><description>&lt;p&gt;After a long iteration, finally the &lt;a href="http://sourceforge.net/projects/volunteerbase/" target="_blank"&gt;0.4 is published&lt;/a&gt;. &lt;p&gt;The biggest challenge was to include a reporting capability without using heavy weight framework. After some issues with JPA and iReport, I have decided to choose a simpler and well known solution with Apache Fop. The idea of xsl-format looks good. It uses the css style and is able to generate many output (html, pdf, png, RTF etc...). It's really handful to separate the content of the presentation and it gives the possibility to customize easily the report. However it's not very efficient to create rapid report with complex structure. Associated with a lack of tools and the future css3, I not sure of the future of this product. &lt;p&gt;The release contains also a bunch of bug fixes. &lt;p&gt;The new function is the volunteer contribution management. The features are: &lt;ul&gt; &lt;li&gt;A schedule to define the payment plan for a year, depending of the month of selection &lt;li&gt;Book keeping of the volunteer contributions&lt;/ul&gt; &lt;p&gt;The next feature in 0.5 will be an individual report to give a situation of the volunteer contributions.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5271488616015715389&amp;page=RSS%3a+Release+0.4+of+VolunteerBase+project&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=psecheresse.spaces.live.com&amp;amp;GT1=psecheresse"&gt;</description><comments>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!194.entry#comment</comments><guid isPermaLink="true">http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!194.entry</guid><pubDate>Thu, 04 Oct 2007 09:13:19 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!194/comments/feed.rss</wfw:commentRss><wfw:comment>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!194.entry#comment</wfw:comment><dcterms:modified>2007-10-04T09:16:25Z</dcterms:modified></item><item><title>Volunteer Base release 0.3</title><link>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!188.entry</link><description>&lt;p&gt; &lt;p&gt;This release is mainly focused on usability improvements. The iterations will deliver alternatively new functions and defect fixes. The goal is to move from a prototype (release 0.1) to a production ready software with all the functions required in version 1.0. &lt;p&gt;This release includes work from Sean Melody, a new active and motivated contributor.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5271488616015715389&amp;page=RSS%3a+Volunteer+Base+release+0.3&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=psecheresse.spaces.live.com&amp;amp;GT1=psecheresse"&gt;</description><comments>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!188.entry#comment</comments><guid isPermaLink="true">http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!188.entry</guid><pubDate>Wed, 22 Aug 2007 11:23:41 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!188/comments/feed.rss</wfw:commentRss><wfw:comment>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!188.entry#comment</wfw:comment><dcterms:modified>2007-08-22T11:23:41Z</dcterms:modified></item><item><title>Programmatic Login from a Stand-Alone Client</title><link>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!178.entry</link><description>&lt;p&gt;This blog follow the previous one &amp;quot;Secured &lt;a href="http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!167.entry"&gt;EJB 3.0 Web Start Application Client&lt;/a&gt;&amp;quot;. &lt;p&gt;Now, we want to access the same EJB without Java Web Start and we want to provide a user/login programmatically. We can use a class provided with GlassFish : &lt;a href="http://docs.sun.com/app/docs/doc/819-3672/6n5sj2siv?a=view"&gt;ProgrammaticLogin&lt;/a&gt;. &lt;p&gt;I assume you have done and deployed the previous project. The client part of the previous Enterprise Application is not necessary, you can skip it if you have not already done the demo. We will create a totally independent project. &lt;h1&gt;Create the project&lt;/h1&gt; &lt;p&gt;Create a new project, select Java, Projects -&amp;gt; Java Application and click Next. Name the project ProgrammaticLogin and click finish. &lt;h3&gt;Add the libraries&lt;/h3&gt; &lt;p&gt;We need few libraries from Glassfish in order to run the project. Right click on Libraries -&amp;gt; Add JAR/Folder, &lt;a href="http://byfiles.storage.msn.com/y1p0IHhqNXFG-YoN2jZ7pJOJ1AmiDzMwn2PsZnHZiRSrOQamHg_wcZMTRIr1vbF1i40O3HLG9sRcEY"&gt;&lt;img style="border-width:0px" alt=image src="http://byfiles.storage.msn.com/y1p0IHhqNXFG-aWDTfeeyBv3Z_SLGD6REASXmiJnFAcMFG-ogrXFexCXwCzbr8FfEJKawVOopBbqlk" border=0 height=240 width=213&gt;&lt;/a&gt; and add the following jar files from the &amp;lt;GLASSFISH_INSTALL_DIR&amp;gt;/lib directory of your GlassFish serveur :  appserv-rt.jar, j2ee.jar, appserv-ext.jar, appserv-admin.jar. These jar contain all you need to run the client. &lt;p&gt;Right click again on Libraries -&amp;gt; Add Project and add the EJB project Login-ejb. &lt;p&gt;&lt;a href="http://byfiles.storage.msn.com/y1p0IHhqNXFG-ZX8fnH_1--XpT-_TaXIpvyVNhw5WGNKOWfNuMH339736s0dALMYnC1h7lN9hNhprw"&gt;&lt;img style="border-width:0px" alt=image src="http://byfiles.storage.msn.com/y1p0IHhqNXFG-YLbR8dvQoygF1DUrCuUFSogZ3pP9gLipAO0aGNOwb2sB5AWGJ6IiRZc9dPdH8SA8U" border=0 height=153 width=240&gt;&lt;/a&gt;  &lt;h3&gt;Login code&lt;/h3&gt; &lt;p&gt;You can now open the Main class and input the following code inside the main method: &lt;p&gt;&lt;strong&gt;ProgrammaticLogin pm = new ProgrammaticLogin();&lt;br&gt;pm.login(&amp;quot;demo&amp;quot;, &amp;quot;demo&amp;quot;); //user and password of a user mapped to admin role&lt;/strong&gt;  &lt;p&gt;InitialContext ctx;&lt;br&gt;try {&lt;br&gt;    ctx = new InitialContext();&lt;br&gt;    Object ref = ctx.lookup(&amp;quot;demo.CalculatorRemote&amp;quot;);&lt;br&gt;    CalculatorRemote calc = (CalculatorRemote) PortableRemoteObject.narrow(ref,CalculatorRemote.class);&lt;br&gt;    javax.swing.JOptionPane.showMessageDialog(null, &amp;quot;2 + 2 = &amp;quot; + calc.add(2, 2));&lt;br&gt;    javax.swing.JOptionPane.showMessageDialog(null, calc.hello(&amp;quot;Mr Demo&amp;quot;));&lt;br&gt;} catch (Exception ex) {&lt;br&gt;    ex.printStackTrace();&lt;br&gt;}  &lt;p&gt;Resolve the imports (Ctrl+Maj+F with NB 5, Ctrl+Maj+I with NB 6).  &lt;h3&gt;Run the demo&lt;/h3&gt; &lt;p&gt;Start the application server.  &lt;p&gt;Before running the client, we must set the configuration in order to obtain the correct login module. We must give the JAAS config file.  &lt;p&gt;Right click on the project, select Properties -&amp;gt; Run.  &lt;p&gt;In VM Options, add : -Djava.security.auth.login.config=D:/JavaServers/glassfish-v2-b53/lib/appclient/appclientlogin.conf  &lt;p&gt;Replace D:/JavaServers/glassfish-v2-b53/ by the directory of your GlassFish serveur. Note: don't forget the - at the beginning of -Djava.sec...&lt;a href="http://byfiles.storage.msn.com/y1p0IHhqNXFG-YWZEJy6OgFZtqXfUp2Cd1_gh1IwXglDo0tE05Tjt2YqNOLJqd7cvnLp6HTn2zm8v8"&gt;&lt;img style="border-width:0px" alt=image src="http://byfiles.storage.msn.com/y1p0IHhqNXFG-YUfQd1jXH2TGe223spHq0ScNTC2MegC92OZ1K8MuHTs7AGgngyFfAc1J-2Jv-P96U" border=0 height=111 width=240&gt;&lt;/a&gt;  &lt;p&gt;Click Run, you will see the 2 messages, including the message from restricted method hello(). &lt;h6&gt;Note&lt;/h6&gt; &lt;p&gt;The programmatic login can be used with Java Web Start. Just add the 2 lines in bold in the code to the previous demo and add the required libraries. &lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5271488616015715389&amp;page=RSS%3a+Programmatic+Login+from+a+Stand-Alone+Client&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=psecheresse.spaces.live.com&amp;amp;GT1=psecheresse"&gt;</description><category>Computers and Internet</category><comments>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!178.entry#comment</comments><guid isPermaLink="true">http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!178.entry</guid><pubDate>Wed, 08 Aug 2007 09:18:45 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!178/comments/feed.rss</wfw:commentRss><wfw:comment>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!178.entry#comment</wfw:comment><dcterms:modified>2008-03-11T20:27:17Z</dcterms:modified></item><item><title>Secured EJB 3.0 and Web Start Application Client</title><link>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!167.entry</link><description>&lt;p&gt;One option of the Glassfish Server is the ability to launch a desktop client application from the server with Java Web Start. Associated with NetBeans, it's easy to create a secured application easy to distribute.  &lt;p&gt;First, with NetBeans, ensure you have GlassFish server registered (see Tools -&amp;gt; Server Manager and add your server GlassFish or Sun Java System Application Server version 9  included in the JavaEE 5 SDK).  &lt;h1&gt;Create the project&lt;/h1&gt; &lt;p&gt;Create a new project, select Enterprise, Projects -&amp;gt; Enterprise Application and click Next.  &lt;p&gt;&lt;a href="http://by1.storage.msn.com/y1pjopwtmXN-Ftk7OKzfQys8dgl3GYDTu32vK1CfDPLTDCkd92ZHhaiIGqdmlLTzlj55JK2IusXsNX8Hy4acwinrQ"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=179 alt=image src="http://by1.storage.msn.com/y1pjopwtmXN-FsTp3YLkTD0WnBAzJzrhqwBY6nZ4AbqA3KQ_Y_WTGhoRpZz373xaDU5d_FQxuBj8u-MOeU4Mi_3zA" width=240 border=0&gt;&lt;/a&gt;  &lt;p&gt;In window 'Name and Location', fill in the project name with Login, your GlasFish server as Sun Java System Application Server, Java version as Java EE 5 and select Create EJB Module, deselect Create Web Application Module, select Create Application Client Module. Leave the default values for the module names and press Finish.  &lt;p&gt;&lt;a href="http://by1.storage.msn.com/y1pjopwtmXN-FuTDHadRZJSKfHSrpJe94UMWnKo6xbT76O5q3fNCpxJbuiM-qpZ7Khd7JVqSwbBfeowGcF4u5Y1jQ"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" alt=image src="http://by1.storage.msn.com/y1pjopwtmXN-Fu2MI5-pN-_Gvyue-gsoSBpuSM6EuXLSuu2sLy41ZXU2vtiiHi5XlF-aWq1Og0wY2OexzSPSRtWww" border=0&gt;&lt;/a&gt;  &lt;h1&gt;Create the EJB&lt;/h1&gt; &lt;p&gt;Right click on Login-ejb -&amp;gt; New -&amp;gt; Session Bean.  &lt;p&gt;Set the EJB name with Calculator, package with demo, check Remote and uncheck Local. Leave stateless checked.  &lt;h3&gt;Create method add&lt;/h3&gt; &lt;p&gt;In the CalculatorBean.java source, right click -&amp;gt; EJB Methods -&amp;gt; Add Business Method. Name the method 'add' with int as return type and 2 parameters a and b as int.  &lt;p&gt;&lt;a href="http://by1.storage.msn.com/y1pjopwtmXN-Fvl9zMjvUW3QZjMoML6rCifTvYAgnmip_898X4FLHrJTfmmwGyPwXdK_b_2kjux_XDjzl23qzfDyA"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=240 alt=image src="http://by1.storage.msn.com/y1pjopwtmXN-FvWKgeJiy4mDDQgyF5wTNn7zGL5ajMclSZ-O2TfKzR8xSdqG-pNp0_mzwrqjNMNwD8w58cgYA7f0A" width=145 border=0&gt;&lt;/a&gt;  &lt;p&gt;Replace return 0 by return a + b  &lt;h3&gt;Create the method hello&lt;/h3&gt; &lt;p&gt;Repeat the same process to add a business method hello with a String a return type and a String as parameter with 'name' as parameter name.  &lt;p&gt;&lt;a href="http://by1.storage.msn.com/y1pjopwtmXN-FtaqBXW71DT9Y4mQeTazmCTGiJ-mwp0kpUIniMlTMcS8a7ZCmychmVYmwWj0dfLzoM_YiRptdQH_g"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=240 alt=image src="http://by1.storage.msn.com/y1pjopwtmXN-Fu8LmhCS0R9yOD2EA7VQJ24g8VmyuNOV8QkXpA_nVoRhUKPRwd4KNq9TwT-65E9PJjsHqs1P3vFwQ" width=145 border=0&gt;&lt;/a&gt;  &lt;p&gt;Replace return null by return &amp;quot;Hello &amp;quot; + name;  &lt;h3&gt;Add security annotations&lt;/h3&gt; &lt;p&gt;Before @Stateless, add an annotation to declare the role admin. Insert the line :  &lt;p&gt;@DeclareRoles(&amp;quot;admin&amp;quot;)  &lt;p&gt;Before the method hello, add an annotation to restrict the access of the method to the role &amp;quot;admin&amp;quot;:  &lt;p&gt;@RolesAllowed(&amp;quot;admin&amp;quot;)  &lt;p&gt;The source of the EJB must look like this  &lt;p&gt;package demo;  &lt;p&gt;import javax.annotation.security.DeclareRoles;&lt;br&gt;import javax.annotation.security.RolesAllowed;&lt;br&gt;import javax.ejb.Stateless;  &lt;p&gt;/**&lt;br&gt; *&lt;br&gt; * @author PSe&lt;br&gt; */&lt;br&gt;@DeclareRoles(&amp;quot;admin&amp;quot;)&lt;br&gt;@Stateless&lt;br&gt;public class CalculatorBean implements CalculatorRemote {&lt;br&gt;    /** Creates a new instance of CalculatorBean */&lt;br&gt;    public CalculatorBean() {&lt;br&gt;    }  &lt;p&gt;    public int add(final int a, final int b) {&lt;br&gt;        return a + b;&lt;br&gt;    }  &lt;p&gt;    @RolesAllowed(&amp;quot;admin&amp;quot;)&lt;br&gt;    public String hello(final String name) {&lt;br&gt;        return &amp;quot;Hello &amp;quot; + name;&lt;br&gt;    }&lt;br&gt;}  &lt;h1&gt;Client code&lt;/h1&gt; &lt;p&gt;Open the project nodes Login-app-client -&amp;gt; Source Package, login and double click on Main.java.  &lt;p&gt;Right click in the source select Entreprise Resources -&amp;gt; Call Enterprise Bean and select CalculatorBean. Press OK. The line to reference the bean is automatically inserted:  &lt;p&gt;@EJB&lt;br&gt;private static CalculatorRemote calculatorBean;  &lt;p&gt;Add the lines below to call the methods:  &lt;p&gt;javax.swing.JOptionPane.showMessageDialog(null, &amp;quot;2 + 2 = &amp;quot; + calculatorBean.add(2, 2));&lt;br&gt;javax.swing.JOptionPane.showMessageDialog(null, calculatorBean.hello(&amp;quot;Mr admin&amp;quot;));  &lt;p&gt;Press Alt+Maj+F to resolve the import. The source must look like:  &lt;p&gt;package login;  &lt;p&gt;import demo.CalculatorRemote;&lt;br&gt;import java.rmi.RemoteException;&lt;br&gt;import javax.ejb.EJB;  &lt;p&gt;/**&lt;br&gt; *&lt;br&gt; * @author PSe&lt;br&gt; */&lt;br&gt;public class Main {&lt;br&gt;    @EJB&lt;br&gt;    private static CalculatorRemote calculatorBean;&lt;br&gt;    /** Creates a new instance of Main */&lt;br&gt;    public Main() {&lt;br&gt;    }&lt;br&gt;    /**&lt;br&gt;     * @param args the command line arguments&lt;br&gt;     */&lt;br&gt;    public static void main(String[] args) {&lt;br&gt;        javax.swing.JOptionPane.showMessageDialog(null, &amp;quot;2 + 2 = &amp;quot; + calculatorBean.add(2, 2));&lt;br&gt;        javax.swing.JOptionPane.showMessageDialog(null, calculatorBean.hello(&amp;quot;Mr admin&amp;quot;));&lt;br&gt;    }&lt;br&gt;}  &lt;h1&gt;Run the application&lt;/h1&gt; &lt;p&gt;Press the Run button &lt;a href="http://by1.storage.msn.com/y1pjopwtmXN-FtdUSjnvyRB3wp6lE2OVLiGS0QDBYl7MzSMLMbvLqnZKqcPEuF9xSji5Y1TO10KFuXFTsaCLq3WlQ"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" alt=image src="http://by1.storage.msn.com/y1pjopwtmXN-Fs36uWspmoLPzCXVc6hvgJ55OnGBjFrncSRogCHfWVzBuRFZu3TyxPWSTlBt9LeNvb6Vr6PxY62zg" border=0&gt;&lt;/a&gt; , the project is deployed and the client is launched. You will see the login window: &lt;a href="http://by1.storage.msn.com/y1pjopwtmXN-FsnqKg6RuWTncMp6Yb6fxat0GGF9KjjLsb9U9h5Gg4KUk90QJMguV5PdCleX9IZVRJFZ6hrIf37Ag"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=123 alt=image src="http://by1.storage.msn.com/y1pjopwtmXN-FsxJvKmaZV-yiuYhaHgJHeYAaSCX_wBr5xY2PJkTZ4ahPm-4GiR-hvNXoQ0h4GKh3m9yuIbU0XoOQ" width=240 border=0&gt;&lt;/a&gt;  &lt;p&gt;Enter any name and password, the application will fail because we need to create the users and map the role admin.  &lt;h1&gt;Create the users&lt;/h1&gt; &lt;p&gt;In the Runtime tab (service with NetBeans 6), open the Servers node and right click on Sun Java System Application Server and select View Admin Console: &lt;a href="http://by1.storage.msn.com/y1pjopwtmXN-FtNuKZKmDmDOOdiExpHYIcIA0VFl7zpoF8k-E8aeBClC3L8Dp-vV3rAQaNXUt6lvcA8MsddHGVBJg"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=227 alt=image src="http://by1.storage.msn.com/y1pjopwtmXN-FvZFeQeX4AhpKnxU2VuprhvcMVgUVvMtNsYLV0TB5-xvaoRcz6yc6_Kkprzx_1qsqdUunXkDP0ElA" width=240 border=0&gt;&lt;/a&gt;  &lt;p&gt;Your browser will open a window to log on the server. Put the admin name and password you give when installing the application server.  &lt;p&gt;&lt;a href="http://by1.storage.msn.com/y1pjopwtmXN-FtHf9iKnMnXvTZRDCoWHzGCDOnyUmd2Y3Of5xklDosghAl5_HoDVLIyOucaQHa6MhMKXH5qj1cLpA"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=150 alt=image src="http://by1.storage.msn.com/y1pjopwtmXN-FsS2P_q_Kev73F-kubR0i6_3JH5Pd0ZqFH3mGEbwvcoJddQjfcjbkNKKpKsrXY5hxHGzmOvJpzWAg" width=240 border=0&gt;&lt;/a&gt;  &lt;p&gt;Select Configuration -&amp;gt; Security -&amp;gt; Realms -&amp;gt; file and click Manage Users. Click New to create two user, one in the group user, the other in the group admin. In my example, the user demo is in the group admin and the user user is in the group user.  &lt;h1&gt;Roles mapping&lt;/h1&gt; &lt;p&gt;To map the roles, open in the project tab the Login project -&amp;gt; Configuration Files and double click on sun-application.xml. Click on Edit As XML and replace &amp;lt;sun-application/&amp;gt; by :  &lt;p&gt;&amp;lt;sun-application&amp;gt;&lt;br&gt;  &amp;lt;security-role-mapping&amp;gt;&lt;br&gt;    &amp;lt;role-name&amp;gt;user&amp;lt;/role-name&amp;gt;&lt;br&gt;    &amp;lt;group-name&amp;gt;user&amp;lt;/group-name&amp;gt;&lt;br&gt;  &amp;lt;/security-role-mapping&amp;gt;&lt;br&gt;  &amp;lt;security-role-mapping&amp;gt;&lt;br&gt;    &amp;lt;role-name&amp;gt;admin&amp;lt;/role-name&amp;gt;&lt;br&gt;    &amp;lt;group-name&amp;gt;admin&amp;lt;/group-name&amp;gt;&lt;br&gt;  &amp;lt;/security-role-mapping&amp;gt;&lt;br&gt;&amp;lt;/sun-application&amp;gt;  &lt;p&gt;Run again the application, enter the user demo and the password, you will see two windows:  &lt;p&gt;&lt;a href="http://by1.storage.msn.com/y1pjopwtmXN-FuFjXijL4CgeNnoprqoJ_xy48Tj0OhAgaVWIof7WsGecw-tpWFH3Ffcs794vpbEKwyf4UnOkONgRQ"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=114 alt=image src="http://by1.storage.msn.com/y1pjopwtmXN-Ft8LdEk7rRA-98iTkell_GI8Qwwz6loMqf9QpgMgOY9LDH5Y_X-Xp5RL2x4ufyxHZfsNL-TdKLyeg" width=240 border=0&gt;&lt;/a&gt;  &lt;p&gt;&lt;a href="http://by1.storage.msn.com/y1pjopwtmXN-FvDHj0A0ybxgP6cymua7jfYdF2EV-JIG89umeUP0sdDIGSUXQbnSaR0HWZt8YxlhIxnumMXBV265A"&gt;&lt;img style="border-top-width:0px;border-left-width:0px;border-bottom-width:0px;border-right-width:0px" height=114 alt=image src="http://by1.storage.msn.com/y1pjopwtmXN-FsH_duQvZB_8r0HSJ5WOZyAJq1OdNyzz-hS8R5HNae4ZFyvU4IR5ECmyDCEC49KkyDxksMBOnEt1A" width=240 border=0&gt;&lt;/a&gt;  &lt;p&gt;If you try again with a user outside the admin group, you will see only the first message and the application will throw an error.  &lt;p&gt;Note : with NetBeans 5.5.1, I must kill the Login process after the execution. To do this, select the Runtime tab, open the Processes node, right click on Login (Run) and select Terminate Process.  &lt;h1&gt;Java Web Start the application&lt;/h1&gt; &lt;p&gt;If you open the browser and use the address &lt;a href="http://localhost:8080/Login/Login-app-client"&gt;http://localhost:8080/Login/Login-app-client&lt;/a&gt;  &lt;p&gt;the application will start automatically.  &lt;p&gt;This conclude the demo and give a glimpse of the power of NetBeans and GlassFish. These products are easy to use, well designed, efficient and designed for enterprise solution.  Associated with the power of Java EE 5 annotations, you can construct a solution without headache.&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5271488616015715389&amp;page=RSS%3a+Secured+EJB+3.0+and+Web+Start+Application+Client&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=psecheresse.spaces.live.com&amp;amp;GT1=psecheresse"&gt;</description><category>Computers and Internet</category><comments>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!167.entry#comment</comments><guid isPermaLink="true">http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!167.entry</guid><pubDate>Sun, 05 Aug 2007 12:33:26 GMT</pubDate><slash:comments>5</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!167/comments/feed.rss</wfw:commentRss><wfw:comment>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!167.entry#comment</wfw:comment><dcterms:modified>2007-09-09T21:44:35Z</dcterms:modified></item><item><title>English vocabulary</title><link>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!128.entry</link><description>Thank you Sandy for your message to notify some mistakes but I can not respond as a result of your security setting which prevent it.&lt;br&gt;I must admit that my English is still weak
after seven months in Australia. Unfortunately, it could not be as good
as my computer skills and my native French (Sandy guess was right, I'm French). I
try to go ahead but sometimes errors happen, it is part of the learning
process. I know it's important to improve my English level so I am
student in night courses.&lt;br&gt;
Furthermore, I can't ask people to check my writing, I'm working alone
and my wife is also French. If you are ready to give me a hand, you are
welcome &lt;img src="http://shared.live.com/QGncRMHLLpIcOfCh--4aMA/emoticons/smile_regular.gif" title=Smile alt=Smile style="vertical-align:middle"&gt;&lt;br&gt;
Last point, I agree that  the missing 's' of adds was an ugly fault and
I can't argue about the plural of functionality but if you look up in
the Macquarie (Australia's national dictionary): &lt;b&gt;functionality &lt;/b&gt;1. the purpose designed to be fulfilled by a device, tool, machine, etc.&lt;b&gt; &lt;/b&gt;2. &lt;i&gt;Computers &lt;/i&gt;the range of functions which an application has. Not so ugly, isn't it?&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5271488616015715389&amp;page=RSS%3a+English+vocabulary&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=psecheresse.spaces.live.com&amp;amp;GT1=psecheresse"&gt;</description><comments>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!128.entry#comment</comments><guid isPermaLink="true">http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!128.entry</guid><pubDate>Sun, 29 Jul 2007 07:49:18 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!128/comments/feed.rss</wfw:commentRss><wfw:comment>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!128.entry#comment</wfw:comment><dcterms:modified>2007-07-29T08:16:12Z</dcterms:modified></item><item><title>Volunteerbase project release 0.2</title><link>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!123.entry</link><description>This version adds new functions to the product :&lt;br&gt;- new search filters and advanced search criterias&lt;br&gt;- export to merge mail / emailer to send e-mails&lt;br&gt;- reminder and actions to be completed&lt;br&gt;&lt;br&gt;It also includes some code improvements and minor bug fixes.&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5271488616015715389&amp;page=RSS%3a+Volunteerbase+project+release+0.2&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=psecheresse.spaces.live.com&amp;amp;GT1=psecheresse"&gt;</description><category>Computers and Internet</category><comments>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!123.entry#comment</comments><guid isPermaLink="true">http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!123.entry</guid><pubDate>Sat, 28 Jul 2007 22:45:23 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!123/comments/feed.rss</wfw:commentRss><wfw:comment>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!123.entry#comment</wfw:comment><dcterms:modified>2007-08-05T10:30:08Z</dcterms:modified></item><item><title>Release 0.1 of Volunteerbase</title><link>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!120.entry</link><description>The first release is ready. This is a typical front end system without any extra functionalities. It gives all you need to add, modify, delete, search any information, including documents. The next release is intended to add a mailer with merge capabilities, reminders, actions to be conducted, etc...&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5271488616015715389&amp;page=RSS%3a+Release+0.1+of+Volunteerbase&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=psecheresse.spaces.live.com&amp;amp;GT1=psecheresse"&gt;</description><category>Computers and Internet</category><comments>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!120.entry#comment</comments><guid isPermaLink="true">http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!120.entry</guid><pubDate>Sun, 08 Jul 2007 21:58:39 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!120/comments/feed.rss</wfw:commentRss><wfw:comment>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!120.entry#comment</wfw:comment><dcterms:modified>2007-07-08T21:58:39Z</dcterms:modified></item><item><title>Volunteer Base project hosted on SourceForge</title><link>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!114.entry</link><description>The volunteer project (about volunteering) wich I am developing is new hosted on SourceForge. Feel free to look the site &lt;a href="http://volunteerbase.sourceforge.net/"&gt;http://volunteerbase.sourceforge.net/&lt;br&gt;&lt;/a&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5271488616015715389&amp;page=RSS%3a+Volunteer+Base+project+hosted+on+SourceForge&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=psecheresse.spaces.live.com&amp;amp;GT1=psecheresse"&gt;</description><category>Computers and Internet</category><comments>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!114.entry#comment</comments><guid isPermaLink="true">http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!114.entry</guid><pubDate>Wed, 06 Jun 2007 11:53:03 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!114/comments/feed.rss</wfw:commentRss><wfw:comment>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!114.entry#comment</wfw:comment><dcterms:modified>2007-08-05T10:30:23Z</dcterms:modified></item><item><title>First blog</title><link>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!113.entry</link><description>Welcome to this blog.&lt;br&gt;&lt;br&gt;If you are looking for an exellent project manager or/and analyst programmer, I fit the bill.&lt;br&gt;If you are looking for a free lancer or volunteer for your Information System with latest technology, stop here, I can help you.&lt;br&gt;&lt;br&gt;&lt;br&gt;You can find some examples of my work on www.microcode.fr or www.habitersurlacote.com&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;img src="http://c.services.spaces.live.com/CollectionWebService/c.gif?cid=5271488616015715389&amp;page=RSS%3a+First+blog&amp;referrer=" width="1px" height="1px" border="0" alt=""&gt;&lt;img style="position:absolute" alt="" width="0px" height="0px" src="http://c.live.com/c.gif?NC=31263&amp;amp;NA=1149&amp;amp;PI=73329&amp;amp;RF=&amp;amp;DI=3919&amp;amp;PS=85545&amp;amp;TP=psecheresse.spaces.live.com&amp;amp;GT1=psecheresse"&gt;</description><category>Computers and Internet</category><comments>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!113.entry#comment</comments><guid isPermaLink="true">http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!113.entry</guid><pubDate>Sat, 17 Mar 2007 03:36:01 GMT</pubDate><slash:comments>0</slash:comments><msn:type>blogentry</msn:type><live:type>blogentry</live:type><live:typelabel>Blog entry</live:typelabel><wfw:commentRss>http://psecheresse.spaces.live.com/blog/cns!492816F77B21DC3D!113/comments/feed.rss</wfw:commentRss><wfw:comment>http://psecheresse.spaces.live.com/Blog/cns!492816F77B21DC3D!113.entry#comment</wfw:comment><dcterms:modified>2007-08-05T10:30:51Z</dcterms:modified></item></channel></rss>