<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>I.T. aware &#187; Java</title>
	<atom:link href="http://www.itaware.eu/category/anglais/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.itaware.eu</link>
	<description>Sébastien Letélié and Cyril Balit weblog</description>
	<lastBuildDate>Sun, 20 Nov 2011 20:12:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
<atom:link rel="hub" href="http://pubsubhubbub.appspot.com"/><atom:link rel="hub" href="http://superfeedr.com/hubbub"/>		<item>
		<title>Java BarCamp Paris 4th ed. : Cloud and DDD</title>
		<link>http://www.itaware.eu/2009/04/05/java-barcamp-paris-4th-ed-cloud-and-ddd/</link>
		<comments>http://www.itaware.eu/2009/04/05/java-barcamp-paris-4th-ed-cloud-and-ddd/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 19:20:31 +0000</pubDate>
		<dc:creator>Sébastien Letélié</dc:creator>
				<category><![CDATA[Anglais]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[cloud-computing]]></category>
		<category><![CDATA[ddd]]></category>
		<category><![CDATA[qi4j]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/?p=463</guid>
		<description><![CDATA[A big success! It was full of people in the great Google's office. 2 schedules / 4 rooms and a total of 7 sessions, I present the both where I participated : Cloud computing (definition, actors and amazon eclipse tool) and DDD (definition and qi4j) <a href="http://www.itaware.eu/2009/04/05/java-barcamp-paris-4th-ed-cloud-and-ddd/" target="_blank">[...]</a>]]></description>
			<content:encoded><![CDATA[<p>A big success! It was full of people in the great Google&#8217;s office. 2 schedules / 4 rooms and a total of 7 sessions, I present the both where I participated :</p>
<p><strong>Cloud computing </strong><br />
Not really a Java subject but it attract people. We tried to define the cloud computing and we fixed that there is 3 offers :</p>
<ul>
<li><strong>IAAS</strong> (Infrastructure as a Service): this is typical <a href="http://aws.amazon.com/" target="_blank">Amazon services</a> products, S3 for storage and EC2 for virtualized servers. Amazon offer very basic service now with a very powerful management tool in <a href="http://aws.amazon.com/eclipse/" target="_blank">Eclipse plug-in</a> (see the <a href="http://awsmedia.s3.amazonaws.com/videos/awsToolkit.html" target="_blank">demo</a>). There is also <a href="http://www.elastic-grid.com/" target="_blank">Elastic Grid</a> proposing to develop and deploy easily on the Amazon infrastructure, <a href="http://www.gogrid.com/index.php" target="_blank">GoGrid</a> an Amazon concurrent. I believe that the recent IBM / Sun merge will create new offerings.</li>
<li> <strong>SAAS</strong> (Software as a Service): we find a lot of solutions (often based on the previous offer), for example Amazon <a href="http://aws.amazon.com/simpledb/" target="_blank">SimpleDB</a>, Amazon <a href="http://aws.amazon.com/sqs/" target="_blank">SQS</a>, <a href="http://www.google.com/a" target="_blank">Google Apps</a>, Microsoft <a href="http://www.microsoft.com/azure/" target="_blank">Azure</a> Services <a href="http://www.cloudmq.com/" target="_blank">CloudMQ</a>, <a href="http://www.zumodrive.com/" target="_blank">ZumoDrive</a> &#8230; and I could continue like a long time&#8230;</li>
<li><strong>PAAS</strong> (Platform as a Service): is hosting the application on a common and scalable platform, it is typically <a href="http://appengine.google.com/" target="_blank">Google AppEngine</a>, it is possible to deploy all yours web application if you know Python. Microsoft probably has a deal in Azure (I should have a look) and Sun has just launched <a href="http://zembly.com/" target="_blank">Zembly</a>.</li>
</ul>
<p>A lot of discussion on what about offline, security, and where is java in the cloud. For me offline mode is really important in a world of increasingly nomad people. Cloud is primarily storage space allowing me to share my data between my devices, then an area of services, and finally deployment platform of my apps.<br />
Finished managing a backup that is never done, losed time finding  a way to share data and finally used USB key, now my data are in the cloud and synchronized on all my devices. I have set up Zumodrive in my company and it&#8217;s very cool, the documents are shared even outside the company and I don&#8217;t care about backup.<br />
Security is the most bigger difficulty for acceptance in the company, I hear the same remarks when talking about the payment on Internet ten years ago. All these services are secure and there is no zero risk.<br />
Java have his place in the cloud on client and server side. The multi platform aspect facilitates the developments on the client (eg: ZumoDrive client is in Java), I want to see more and more Java APIs &laquo;&nbsp;cloud-ready&nbsp;&raquo; facilitating the integration of service in code. Similarly on the server side I look forward to Google AppEngine in Java.<br />
Finally the advantage of cloud computing is primarily economic, smalls company are the first customers and have found lower cost and flexible capabilities.</p>
<p><strong>DDD (<a href="http://domaindrivendesign.org/" target="_blank">Domain Driven Design</a>)</strong><br />
I had little success at the last barcamp with this subject, this time it was proposed by others much more stronger than me and have made relevant arguments on the benefits of the concept. One of the important point raised we used talking too much technical and framework implementation than focus more on the reality, something that we tend to forget wanting to put our new framework in our code. I talked about <a href="http://www.qi4j.org/" target="_blank">Qi4j</a>, that is not pure DDD implementation, but is for me the best way to modelling reality. I want make a demo of my medical record implemented with Qi4j to really prove that this approach is relevant.<br />
Of course I&#8217;m convinced that a DDD refactoring of an existing code is difficult. DDD is a best practice and a new way of development vision. Have to follow for sure &#8230;</p>
<p>Thank you again to the organizers. It is always a good opportunity to exchange. And i hope Google will open their doors as often as possible;)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2009/04/05/java-barcamp-paris-4th-ed-cloud-and-ddd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaCamp II : DB and ESB</title>
		<link>http://www.itaware.eu/2008/12/20/javacamp-ii-db-and-esb/</link>
		<comments>http://www.itaware.eu/2008/12/20/javacamp-ii-db-and-esb/#comments</comments>
		<pubDate>Sat, 20 Dec 2008 21:01:29 +0000</pubDate>
		<dc:creator>Sébastien Letélié</dc:creator>
				<category><![CDATA[Anglais]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Barcamp]]></category>
		<category><![CDATA[devoxx]]></category>
		<category><![CDATA[EAI]]></category>
		<category><![CDATA[ESB]]></category>
		<category><![CDATA[ETL]]></category>
		<category><![CDATA[MQ]]></category>
		<category><![CDATA[Mule]]></category>
		<category><![CDATA[Spring Integration]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/?p=398</guid>
		<description><![CDATA[The second edition of Octo&#8216;s Barcamp Java was great. This event format is really interesting because it allows having the opinions of others, learn through their experience and meet interesting people. Two of my proposals were adopted: RDF+OWL and database. The subject RDF+OWL has not really been interested and has finished in the more generally [...]]]></description>
			<content:encoded><![CDATA[<p>The second edition of <a href="http://www.octo.com/" target="_blank">Octo</a>&#8216;s <a href="http://barcamp.org/JavaCampParis2" target="_blank">Barcamp Java</a> was great. This event format is really interesting because it allows having the opinions of others, learn through their experience and meet interesting people.<br />
Two of my proposals were adopted: <a href="http://en.wikipedia.org/wiki/Resource_Description_Framework" target="_blank">RDF</a>+<a href="http://en.wikipedia.org/wiki/Web_Ontology_Language" target="_blank">OWL</a> and database.<br />
The subject RDF+OWL has not really been interested and has finished in the more generally REST subject. In addition the <a href="http://en.wikipedia.org/wiki/Representational_state_transfer" target="_blank">REST</a> session took place during the session on the database so I have not participated. I re-suggest it next time, with another title these acronyms were not always known.<br />
What database for what need ? it was the question on which I wanted to talked about. 8 votes have allowed this matter to be debated in a room. But finally 4 responded to the call. The exchange has not been less interesting. This will be the subject of my next post.<br />
I then followed the subject on Spring Integration and Mule, which was also the opportunity to speak more generally of integration. I just give you a list of tools mentioned (I make comments on what I know):</p>
<ul>
<li><a href="http://www.springsource.org/spring-integration" target="_blank">Spring integration</a> : Version 1.0 have been released, this framework is the implementation of the design pattern book <a href="http://www.eaipatterns.com/" target="_blank">EAI Pattern</a>.</li>
<li><a href="http://www.jitterbit.com/" target="_blank">JitterBit</a> : an open source EAI with advanced management tool, the GUI is attractive but I have not had time yet to really test the product</li>
<li><a href="https://www.openadaptor.org/" target="_blank">OpenAdaptor</a> : First opensource EAI developed by a <a href="http://www.dresdnerkleinwort.com" target="_blank">german</a> team. I personally used to develop an EAI dedicated to health which actually interconnects the SAMU of the Champagne-Ardennes region (3 to 4 messages per minute it&#8217;s still reasonable). The product is stable and multi-source design, pipe, sink is well thought out. There is a lot of connectors but not always reusable, it is better to re-develop your own when you have specific features. I used the original version 1.7.2, there was no version 2 but a complete refactoring that is now version 3. An article by the author was published recently in <a href="http://java.sys-con.com/node/535350" target="_blank">JDJ</a>.</li>
<li><a href="http://mule.mulesource.org/display/MULE/Home" target="_blank">Mule</a> : a lightweight ESB now well known, I have not had the opportunity to implement it, but before the arrival of Spring Integration it was one that interested me most. <a href="http://www.touilleur-express.fr" target="_blank">Nicolas</a> has implemented it and has even made a quickie at DEVOXX08.</li>
<li><a href="https://open-esb.dev.java.net/" target="_blank">OpenESB</a> : implementation of the Sun <a href="http://jcp.org/en/jsr/detail?id=208" target="_blank">JBI</a> specification (JSR-208) dedicated to integration</li>
<li><a href="http://www.jboss.org/jbossesb/" target="_blank">JBoss ESB</a> : ESB by JBoss</li>
<li><a href="http://synapse.apache.org/" target="_blank">Apache Synapse</a> : lightweight ESB of Apache Foundation</li>
<li><a href="http://servicemix.apache.org/home.html" target="_blank">Apache serviceMix</a> : ESB, JBI implementation</li>
<li><a href="http://activemq.apache.org/camel/" target="_blank">Apache CAMEL</a> : implementation of EAI pattern (idem Spring integration)</li>
<li><a href="http://cxf.apache.org/" target="_blank">Apache CXF</a> : implementation of JAX-WS.</li>
<li><a href="http://ws.apache.org/axis2/" target="_blank">Axis2</a> : same but with asynchronous mode and REST. I started working on web services with version 1 of this framework and realize practical training works with it. The architecture allows flexible configuration based on a chain between the request and response. It is simple to use to make an <a href="http://fr.wikipedia.org/wiki/Extract_Transform_Load" target="_blank">ETL</a>. Version 2 provides asynchronous, more performance and <a href="http://wso2.org/library/291" target="_blank">AXIOM</a> to manage attachments (easier to use than <a href="http://www.w3.org/TR/SOAP-attachments" target="_blank">SwA</a>)</li>
<li><a href="http://jira.amqp.org/confluence/display/AMQP/Advanced+Message+Queuing+Protocol" target="_blank">APMQ</a> : the new specification to standarize messaging tools (initiated by JBoss), it is only the beginning but we have to follow</li>
<li><a href="http://activemq.apache.org/" target="_blank">ActiveMQ</a> : the open source open source MQ, <a href="http://julien.dubois.free.fr/" target="_blank">Julien Dubois</a> has some experience on the subject and tells us that we must be wary of some bugged versions (5.0 for example). The tool is not mature and often encounter problems because developers believe they can integrate easily in their application. Apparently this is not as simple as a single jar to add.</li>
<li><a href="https://mq.dev.java.net/" target="_blank">OpenMQ</a> : the Sun open source MQ, I could follow the session at the DEVOXX08, it was very broad but Sun show that the project is well supported and adopted by their clients. If I switch to open source (currently i use WebSphere MQ) i think i choose this one.</li>
<li><a href="http://www-01.ibm.com/software/integration/wmq/" target="_blank">WebSphere MQ</a> : the historical MQ from IBM that I use now. Robust, mature but hard to configure. Even if IBM provide RCP application for configuration it remains complex. I added the <a href="http://www-01.ibm.com/software/integration/wmqe/" target="_blank">MQ Everyplace</a> module to deploy on mobile handsets, configuration is even more complex. Once it is ready it works well.</li>
</ul>
<p>Thanks to <a href="http://blog.octo.com/index.php/2008/12/18/210-retours-sur-le-javacampparis-ii" target="_blank">Luc Bizeul</a> who organize this event and also for the cocktail at the end. I&#8217;m waiting for the next <img src='http://www.itaware.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/12/20/javacamp-ii-db-and-esb/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>RIA : inside or outside the browser ?</title>
		<link>http://www.itaware.eu/2008/11/05/ria-inside-or-outside-the-browser/</link>
		<comments>http://www.itaware.eu/2008/11/05/ria-inside-or-outside-the-browser/#comments</comments>
		<pubDate>Wed, 05 Nov 2008 17:12:21 +0000</pubDate>
		<dc:creator>Sébastien Letélié</dc:creator>
				<category><![CDATA[.NET,WPF,WCF,Silverlight]]></category>
		<category><![CDATA[Anglais]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RIA-RDA-RWA]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[rda]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[rwa]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/?p=351</guid>
		<description><![CDATA[The <a href="http://www.parisjug.org/"  target="_blank">Paris JUG</a> this time was devoted to <a href="http://code.google.com/webtoolkit/" target="_blank">GWT</a> and implementation of <a href="http://www.restlet.org/" target="_blank">Restlet</a> for GWT. Two presentations greatly performed by <a href="http://blog.dgirard.eu" target="_blank">Didier Girard</a> and Jerome Louvel. I was impressed by the number of participants, thinking that GWT was already in the soul. Bravo to Didier continue to promote this technology and Jerome to put the concept of REST.
Still, I am astonished at the vision that people have of the RIA. For many I have the impression that RIA means rich web application. <a href="http://www.itaware.eu/2008/11/05/ria-inside-or-outside-the-browser/" target="_blank">[...]</a>]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://www.parisjug.org/"  target="_blank">Paris JUG</a> this time was devoted to <a href="http://code.google.com/webtoolkit/" target="_blank">GWT</a> and implementation of <a href="http://www.restlet.org/" target="_blank">Restlet</a> for GWT. Two presentations greatly performed by <a href="http://blog.dgirard.eu" target="_blank">Didier Girard</a> and Jerome Louvel. I was impressed by the number of participants, thinking that GWT was already in the soul. Bravo to Didier continue to promote this technology and Jerome to put the concept of REST.<br />
Still, I am astonished at the vision that people have of the RIA. For many I have the impression that RIA means rich web application. But the notion of &laquo;&nbsp;rich&nbsp;&raquo; is simply a reconsideration of the user experience and this does not necessarily by the browser. GWT, Ajax, AppletFX, Flex or Silverlight do not have the monopoly of RIA simply because they run in a browser.<br />
Javascript enabled to overcome the limitations of HTML in the browser and gave a new dimension to Web applications. The browser now becomes a runtime JavaScript and uses HTML as graphics library. Like Java with Swing, C# with WPF or Silverlight, AS3 with Flash and Flex.<br />
iTunes is probably one of the first RIA and this is not a web application. As I said already we must differentiate <a href="http://www.itaware.eu/2007/03/28/ria-desktop-or-web" target="_blank">Rich Web Application and Rich Desktop Application</a>. A RWA runs in the browser, a RDA runs in an OS.<br />
There are advantages and disadvantages in both approaches but the distribution and maintenance which have long been the strengths of Web applications are no longer true today.<br />
As you do more surprised to have your Windows automatically updated it is now also possible for an RDA to be maintained and transmitted via the Web. Java Web Start is a good example and Adobe AIR knows how to do too. But i herer what you say : to run Java or Air, you have to respectively install the JVM and runtime AIR. Yes it&#8217;s true like you do it recently when you installed Chrome or previously installed Firefox. The difference is that Windows come with its own browser and when you buy a PC with Windows you have it. At one time you install a runtime and except if you are terribly lazy person you aren&#8217;t obliged to be use Windows/IE only.<br />
Where we must be vigilant with a RDA is to not go back to the old client/server model. The RDA must remain a UI layer and not shipping business that must always be server side.&lt;br /&gt; Apple had already experimented this with <a href="http://www.webobjects.com" target="_blank">WebObjects</a> Java Client and continues today to offer similar APIs for Cocoa and now IPhone SDK.<br />
To the slogan &laquo;&nbsp;the browser is the platform&nbsp;&raquo; I answer &laquo;&nbsp;the browser is a platform&nbsp;&raquo;. Future architectures should not be dependent on UI layer because it must be developed in the best technology to meet the objectives of application and customer needs by focusing on ergonomics and performance.<br />
Our application <a href="http://www.resurgences.com" target="_blank">ResUrgences</a> is in web for 8 years now in a sector (health) where applications are often client/server. Now the extension from the emergency department to the mobile emergency department (say SMUR in France) forces us to reconsider the web architecture because using a web application on a Tablet PC offline, although not impossible, is not appropriate. Especially when you have to interconnect with monitoring and electro-cardiogram equipment.<br />
So what choice between RWA and RDA ? The first step is to think RIA, so to have a SOA server side architecture and services accessible through various formats via various protocols. At this point different criteria have to be focus on: ergonomics, performance, accessibility, environment (OS and hardware), openness, security, compatibility with existing &#8230; So there is no obvious answer. I&#8217;m looking for a long time on a table that defines what technology for what needs and now I think it&#8217;s impossible.<br />
What should be considered is :</p>
<ul>
<li> access to local resources (files, applications, USB, serial, Bluetooth) is an argument to look to the RDA. Although this can be remedied with an applet and increasingly with <a href="http://gears.google.com/" target="_blank">Gears</a> (but it&#8217;s a <a href="http://www.itaware.eu/2007/07/15/interaction-between-web-and-desktop-application/" target="_blank">RWA/RDA mix</a>, why not is what I do) and that the Flash plugin already allows access to the camera.</li>
<li> the concept of &laquo;&nbsp;push&nbsp;&raquo; to send data to a client from the server is now possible with RWA (<a href="http://en.wikipedia.org/wiki/Comet_(programming)" target="_blank">Comet</a>, reverse Ajax) and soon <a href="http://www.itaware.eu/2008/11/03/push-push-push-on-the-browser/" target="_blank">standarize</a> in <a href="http://www.w3.org/html/wg/html5/" target="_blank">HTML 5</a> (<a href="http://www.w3.org/html/wg/html5/#the-web-socket-protocol" target="_blank">WebSocket</a>).</li>
<li> exchanges via asynchronous <a href="http://en.wikipedia.org/wiki/Message_Oriented_Middleware" target="_blank">MOM</a> with queues client side cannot yet be in RWA. Gears should propose an API and LifeCycle Data Service does not really do it because the queue is server side.</li>
<li> uniformity of application with a single platform deployment independent of the OS is probably the most powerful argument for the SI to choose a RWA</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/11/05/ria-inside-or-outside-the-browser/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Terracota presentation</title>
		<link>http://www.itaware.eu/2008/10/05/terracota-presentation/</link>
		<comments>http://www.itaware.eu/2008/10/05/terracota-presentation/#comments</comments>
		<pubDate>Sun, 05 Oct 2008 13:23:18 +0000</pubDate>
		<dc:creator>Sébastien Letélié</dc:creator>
				<category><![CDATA[Anglais]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[cluster]]></category>
		<category><![CDATA[JVM]]></category>
		<category><![CDATA[NAM]]></category>
		<category><![CDATA[NAS]]></category>
		<category><![CDATA[serialization]]></category>
		<category><![CDATA[WebObjects]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/?p=297</guid>
		<description><![CDATA[It was a pleasure to show <a href="http://www.terracotta.org" target="_blank">Terracota</a> presentation by its creator <a href="http://blog .terracottatech.com" target="_blank">Ari Zilka</a>, organized by the very innovative company <a href="http://www.zenika.com" target="_blank">Zenika</a>.
Terracota is a JVM cluster, it allows to synchronize JVM, based on the principle of <a href="http://fr.wikipedia.org/wiki/Network_attached_storage" target="_blank">NAS</a> but for memory: NAM for Network Attached Memory.<a href="http://www.itaware.eu/2008/10/05/terracota-presentation/#more-297" target="_blank">[...]</a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://www.terracotta.org/web/download/thumbnails/14155789/fig_201_1_v7.png" alt="" width="200" height="168" /> It was a pleasure to show <a href="http://www.terracotta.org" target="_blank">Terracota</a> presentation by its creator <a href="http://blog .terracottatech.com" target="_blank">Ari Zilka</a>, organized by the very innovative company <a href="http://www.zenika.com" target="_blank">Zenika</a>.<br />
Terracota is a JVM cluster, it allows to synchronize JVM, based on the principle of <a href="http://fr.wikipedia.org/wiki/Network_attached_storage" target="_blank">NAS</a> but for memory: NAM for Network Attached Memory. <span id="more-297"></span>Forget serialization session, finished storage state of objects in database, Terracotta allows you to focused on the essentials and reduce dependency with the database. The example showed how to better manage the principle of registering on a web site with email confirmation. The classic method is to store basic identification data with a status and change that status when the email is received. With Terracotta this data remains in memory and is shared by all JVMs, it is stored on database only upon receipt of the email. In addition Terracotta stored on disk the memory status, used to manage a server crash.<br />
For my part, although I am interested in this tool since its creation and i&#8217;ve <a href="http://www.itaware.eu/2006/12/04/terracotta-en-open-source/" target="_blank">mentioned</a> on this blog when it become open source, I have not implemented yet. Even working on <a href="http://www.apple.com/webobjects/" target="_blank">WebObjects</a> the advantage is obvious, in fact Apple had thought it <a href="http://developer.apple.com/documentation/LegacyTechnologies/WebObjects/WebObjects_5/DeployingWebObjects/Introduction/index.html" target="_blank ">deployment solution</a> for this framework with one JVM launched for each WebObjects application instance. The whole managed by a simple and handy tool: <a href="http://developer.apple.com/documentation/LegacyTechnologies/WebObjects/WebObjects_5/DeployingWebObjects/Administration/index.html" target="_blank">Monitor</a>. The Apple Store is still deployed with this solution. This approach is due to <a href="http://en.wikipedia.org/wiki/Enterprise_Objects_Framework" target="_blank">EOF</a> (ORM from NeXT) that has only one flaw: it is not multithread. So for individual instance of application know the status of each other on enterprise objects they use in common, each database access (change, create, delete) is stored in a table that is read by other applications to synchronize their objects. With Terracotta you simply implement the DSO (Distributed Shared Objects) concept on the graph object to share and that&#8217;s it. To go even further and be more generic i should implement this on the EOF cache layer like it was done with <a href="http://ehcache.sourceforge.net/">EHCache</a> and <a href="http://www.hibernate.org/">Hibernate</a>. I have to take a serious look on it, this will be a next news with a good example of implementation of Terracotta.</p>
<p>Note that this is the first of a (hopefully) long series of Zenika event, so thanks again and see you next time &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/10/05/terracota-presentation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>BIRT DESIGNER-Hide/Show a component</title>
		<link>http://www.itaware.eu/2008/10/01/birt-designer-hideshow-a-component/</link>
		<comments>http://www.itaware.eu/2008/10/01/birt-designer-hideshow-a-component/#comments</comments>
		<pubDate>Wed, 01 Oct 2008 21:48:08 +0000</pubDate>
		<dc:creator>Cyril Balit</dc:creator>
				<category><![CDATA[Anglais]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[birt]]></category>
		<category><![CDATA[birt designer]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/?p=287</guid>
		<description><![CDATA[On a project using BIRT I was confronted with this problem. I generate complex reports using components and datasets defined in a library. I wish to show a component only if the bound dataset contains data. The operation is simple but I looked for the most generic solution. Indeed the component will be used in [...]]]></description>
			<content:encoded><![CDATA[<p>On a project using <a href="http://www.eclipse.org/birt/phoenix/" target="_blank">BIRT</a> I was confronted with this problem. I generate complex reports using components and datasets defined in a library. I wish to show a component only if the bound dataset contains data.<br />
The operation is simple but I looked for the most generic solution. Indeed the component will be used in some reports and the update operations have to be the simplest as possible.<br />
<span id="more-287"></span>First of all it is necessary to distinguish two situations:</p>
<ol>
<li>Dataset that contain only one set of data (characteristics of a customer for example)</li>
<li>Dataset multi-lines (customers list)</li>
</ol>
<p>I used Birt Designer to configure the various elements.</p>
<ol>
<li><strong>Dataset with one record</strong></li>
</ol>
<p>You have to add to the dataset a column which will represents the visible status of the bound component. Edit the dataset properties and create a <strong>computed columns</strong> by clicking on <strong>new </strong></p>
<p><a href="http://www.itaware.eu/wp-content/uploads/2008/09/birt01.bmp"><img class="size-medium wp-image-274 alignnone" title="birt01" src="http://www.itaware.eu/wp-content/uploads/2008/09/birt01.bmp" alt="" /></a></p>
<p>Then you have to set:</p>
<ul>
<li>The name of the column (isVisible for example)</li>
<li>Its type: boolean</li>
</ul>
<p><a href="http://www.itaware.eu/wp-content/uploads/2008/09/birt02.bmp"><img class="aligncenter size-medium wp-image-275" title="birt02" src="http://www.itaware.eu/wp-content/uploads/2008/09/birt02.bmp" alt="" /></a></p>
<p>Then you have to  build the expression allowing to test the other columns:</p>
<ul>
<li>Click on  <strong>fx</strong></li>
<li>Build the expression by testing the wished columns</li>
</ul>
<p><a href="http://www.itaware.eu/wp-content/uploads/2008/09/birt03.bmp"><img class="aligncenter size-medium wp-image-276" title="birt03" src="http://www.itaware.eu/wp-content/uploads/2008/09/birt03.bmp" alt="" /></a><strong></strong></p>
<p>2.<strong> Dataset with multi-lines</strong></p>
<p>First you have to create a computed column with the following attributes:</p>
<p><a href="http://www.itaware.eu/wp-content/uploads/2008/09/birt04.bmp"><img class="aligncenter size-medium wp-image-277" title="birt04" src="http://www.itaware.eu/wp-content/uploads/2008/09/birt04.bmp" alt="" /></a></p>
<ul>
<li>name : length</li>
<li>Data type : integer</li>
<li>Aggregation : <strong>COUNT</strong></li>
</ul>
<p>We create then an &laquo;&nbsp;isVisible&nbsp;&raquo; column which test the value of the column lenght with the following expression : <strong></strong></p>
<p><strong>row ["length"]!=0 </strong></p>
<p><a href="http://www.itaware.eu/wp-content/uploads/2008/09/birt05.bmp"><img class="alignnone size-medium wp-image-278" title="birt05" src="http://www.itaware.eu/wp-content/uploads/2008/09/birt05.bmp" alt="" /></a></p>
<p>3.<strong> Visible status of the component</strong></p>
<p>In the tab <strong>properties </strong>and  in the <strong>visibility </strong>column</p>
<ul>
<li>Select  the &laquo;&nbsp;Hide element &nbsp;&raquo;  checkbox</li>
<li>Set the expression field with the value:<strong> ! Row [" isVisible "] </strong></li>
</ul>
<p><a href="http://www.itaware.eu/wp-content/uploads/2008/09/birt06.bmp"><img class="aligncenter size-medium wp-image-273" title="birt06" src="http://www.itaware.eu/wp-content/uploads/2008/09/birt06.bmp" alt="" /></a><br />
If the return value is true the component is not display in the report.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/10/01/birt-designer-hideshow-a-component/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>REFACTORING&#8230;..to read absolutely</title>
		<link>http://www.itaware.eu/2008/09/25/refactoringto-read-absolutely/</link>
		<comments>http://www.itaware.eu/2008/09/25/refactoringto-read-absolutely/#comments</comments>
		<pubDate>Thu, 25 Sep 2008 15:36:21 +0000</pubDate>
		<dc:creator>Cyril Balit</dc:creator>
				<category><![CDATA[Anglais]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[fowler]]></category>
		<category><![CDATA[refactoring]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/?p=250</guid>
		<description><![CDATA[A small ticket to speak about this great book of Martin Fowler: Refactoring Improving the Design of Existing Code I like the way he has written it. The concepts are well explained and the examples are rather simple but also rather close to the reality so that they can  quickly be transposed in our daily [...]]]></description>
			<content:encoded><![CDATA[<p>A small ticket to speak about this great book of <a href="http://martinfowler.com/">Martin Fowler</a>: <a href="http://www.amazon.com/Refactoring-Improving-Existing-Addison-Wesley-Technology/dp/0201485672">Refactoring Improving the Design of Existing Code</a></p>
<p>I like the way he has written it. The concepts are well explained  and the examples are rather simple but also rather close to the reality so that they can  quickly be transposed in our daily work.</p>
<p>Just read it&#8230;..</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/09/25/refactoringto-read-absolutely/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Go back to JavaFX</title>
		<link>http://www.itaware.eu/2008/09/14/go-back-to-javafx/</link>
		<comments>http://www.itaware.eu/2008/09/14/go-back-to-javafx/#comments</comments>
		<pubDate>Sun, 14 Sep 2008 16:38:38 +0000</pubDate>
		<dc:creator>Sébastien Letélié</dc:creator>
				<category><![CDATA[Anglais]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RIA-RDA-RWA]]></category>
		<category><![CDATA[Illustrator]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[SVG]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/?p=235</guid>
		<description><![CDATA[In a previous post i said JavaFX lack was a design tool to promote a good relationship between developers and designers, essential for membership of the community around this technology. Knowing that designers will not change tools easily the best approach would be to make a bridge between the existing design tools and JavaFX. That [...]]]></description>
			<content:encoded><![CDATA[<p>In a previous <a href="http://www.itaware.eu/2007/05/18/java-on-the-ria-road/">post</a> i said JavaFX lack was a design tool to promote a good relationship between developers and designers, essential for membership of the community around this technology. Knowing that designers will not change tools easily the best approach would be to make a bridge between the existing design tools and JavaFX. That is the purpose of <a href="http://java.sun.com/javafx/reference/project_nile_installing/">Project NILE</a> by offering a Illustrator and Photoshop plugin to export a FXD or a FX file but also a SVG converter and a graphic viewer.<br />
It&#8217;s the good strategy i think, so I realized a test.<br />
<span id="more-235"></span><br />
To enhance collaboration designer / developer I went looking for graphic work on the net, I found &laquo;&nbsp;glossy&nbsp;&raquo; <a href = "http://www.bittbox.com/freebies/72-free-vector-glass-buttons-and-bars/">buttons</a> proposed in <em>.ai</em> and <em>.svg</em>.<br />
<img src="/JavaFX/alphabet_glass_bars.png" alt="alphabet_glass_bars" /><br />
The SVG test was not good, the conversion did not include the effects and a lot of corrections were needed to compile. I continued with a conversion via Illustrator. The first shot will not compile because I am <a href="http://forums.sun.com/thread.jspa?threadID=5320845&#038;tstart=0">european</a> <img src='http://www.itaware.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . In the second time it compiles and the result is almost identical to the <em>.ai</em> document. Just a slight color problem quickly corrected.<br />
The <a href="/JavaFX/alphabet_glass_bars2.fx">FX script</a> is composed of a set of SVGPath, each character of the keyboard is also defined in a SVGPath. A little difficult to operate as it would be more practical to extract a component and to apply behavior as typically a mouse click and passing it in setting its position and character to display.<br />
I extract in script the definition of a button I replace the SVGPath character by a Text component. I add a click event on the mouse and I change the effect when the mouse button is pressed.</p>
<p><strong>GlassButton.fx</strong></p>
<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; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
<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">
<span style="font-family: courier new; font-size: 10pt;"><span style="font-weight: bold; color: rgb(127,0,85);">package</span>&nbsp;<span style="color: rgb(0,0,0);">testfx1;</span></p>
<p><span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.geometry.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.image.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.paint.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.text.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.effect.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.input.MouseEvent;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.transform.*;</span>&nbsp;<br />
<span style="font-weight: bold; color: rgb(127,0,85);">public</span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">class</span>&nbsp;<span style="color: rgb(0,0,0);">GlassButton</span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">extends</span>&nbsp;<span style="color: rgb(0,0,0);">CustomNode</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">public</span>&nbsp;<span style="color: rgb(0,0,0);">attribute</span>&nbsp;<span style="color: rgb(0,0,0);">letter:String;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">public</span>&nbsp;<span style="color: rgb(0,0,0);">attribute</span>&nbsp;<span style="color: rgb(0,0,0);">onClick:function(t:String):Void;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">public</span>&nbsp;<span style="color: rgb(0,0,0);">attribute</span>&nbsp;<span style="color: rgb(0,0,0);">x:Integer;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">public</span>&nbsp;<span style="color: rgb(0,0,0);">attribute</span>&nbsp;<span style="color: rgb(0,0,0);">y:Integer;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">protected</span>&nbsp;<span style="color: rgb(0,0,0);">function</span>&nbsp;<span style="color: rgb(0,0,0);">create()</span>&nbsp;<span style="color: rgb(0,0,0);">:</span>&nbsp;<span style="color: rgb(0,0,0);">Node</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">effect</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">DropShadow</span>&nbsp;<span style="color: rgb(0,0,0);">{</span>&nbsp;<span style="color: rgb(0,0,0);">offsetX:0.0,offsetY:1.0,color:Color.BLACK,radius:8.0};</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">return</span>&nbsp;<span style="color: rgb(0,0,0);">Group</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">translateX:</span>&nbsp;<span style="color: rgb(0,0,0);">x</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">translateY:</span>&nbsp;<span style="color: rgb(0,0,0);">y</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">content:</span>&nbsp;<span style="color: rgb(0,0,0);">[</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">SVGPath</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">effect:</span>&nbsp;<span style="color: rgb(0,0,0);">bind</span>&nbsp;<span style="color: rgb(0,0,0);">effect</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">fill:</span>&nbsp;<span style="color: rgb(0,0,0);">LinearGradient{proportional:</span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">false</span>&nbsp;<span style="color: rgb(0,0,0);">startX:</span>&nbsp;<span style="color: rgb(0,0,0);">21.00</span>&nbsp;<span style="color: rgb(0,0,0);">startY:35.00</span>&nbsp;<span style="color: rgb(0,0,0);">endX:</span>&nbsp;<span style="color: rgb(0,0,0);">21.00</span>&nbsp;<span style="color: rgb(0,0,0);">endY:</span>&nbsp;<span style="color: rgb(0,0,0);">5.00</span>&nbsp;<span style="color: rgb(0,0,0);">stops:</span>&nbsp;<span style="color: rgb(0,0,0);">[</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">Stop</span>&nbsp;<span style="color: rgb(0,0,0);">{offset:</span>&nbsp;<span style="color: rgb(0,0,0);">0.000</span>&nbsp;<span style="color: rgb(0,0,0);">color:</span>&nbsp;<span style="color: rgb(0,0,0);">Color.rgb(0xd2,0xd2,0xd2,1.0)},</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">Stop</span>&nbsp;<span style="color: rgb(0,0,0);">{offset:</span>&nbsp;<span style="color: rgb(0,0,0);">0.500</span>&nbsp;<span style="color: rgb(0,0,0);">color:</span>&nbsp;<span style="color: rgb(0,0,0);">Color.rgb(0x4e,0x4e,0x4e,1.0)},</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">Stop</span>&nbsp;<span style="color: rgb(0,0,0);">{offset:</span>&nbsp;<span style="color: rgb(0,0,0);">1.000</span>&nbsp;<span style="color: rgb(0,0,0);">color:</span>&nbsp;<span style="color: rgb(0,0,0);">Color.BLACK},</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">]}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">content:</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;M36.00,27.00&nbsp;C36.00,31.42&nbsp;32.42,35.00&nbsp;28.00,35.00&nbsp;L14.00,35.00&nbsp;C9.58,35.00&nbsp;6.00,31.42&nbsp;6.00,27.00&nbsp;L6.00,13.00&nbsp;C6.00,8.59&nbsp;9.58,5.00&nbsp;14.00,5.00&nbsp;L28.00,5.00&nbsp;C32.42,5.00&nbsp;36.00,8.59&nbsp;36.00,13.00&nbsp;Z&nbsp;&quot;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">},</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">SVGPath</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">fill:</span>&nbsp;<span style="color: rgb(0,0,0);">Color.GRAY</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">content:</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;M34.00,22.77&nbsp;L8.00,22.77&nbsp;L8.00,14.00&nbsp;C8.00,9.86&nbsp;11.55,6.50&nbsp;15.92,6.50&nbsp;L26.08,6.50&nbsp;C30.46,6.50&nbsp;34.00,9.86&nbsp;34.00,14.00&nbsp;Z&nbsp;&quot;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">},</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">Text</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">fill:</span>&nbsp;<span style="color: rgb(0,0,0);">Color.WHITE</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">font:</span>&nbsp;<span style="color: rgb(0,0,0);">Font</span>&nbsp;<span style="color: rgb(0,0,0);">{</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">size:</span>&nbsp;<span style="color: rgb(0,0,0);">18</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">style:</span>&nbsp;<span style="color: rgb(0,0,0);">FontStyle.BOLD</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">x:</span>&nbsp;<span style="color: rgb(0,0,0);">14,</span>&nbsp;<span style="color: rgb(0,0,0);">y:</span>&nbsp;<span style="color: rgb(0,0,0);">27</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">content</span>&nbsp;<span style="color: rgb(0,0,0);">:</span>&nbsp;<span style="color: rgb(0,0,0);">letter</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">]</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">onMouseClicked:</span>&nbsp;<span style="color: rgb(0,0,0);">function(</span>&nbsp;<span style="color: rgb(0,0,0);">e:</span>&nbsp;<span style="color: rgb(0,0,0);">MouseEvent</span>&nbsp;<span style="color: rgb(0,0,0);">):Void</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">onClick(letter);</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">onMousePressed:</span>&nbsp;<span style="color: rgb(0,0,0);">function(</span>&nbsp;<span style="color: rgb(0,0,0);">e:</span>&nbsp;<span style="color: rgb(0,0,0);">MouseEvent</span>&nbsp;<span style="color: rgb(0,0,0);">):Void</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">effect</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">null</span><span style="color: rgb(0,0,0);">;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">onMouseReleased:</span>&nbsp;<span style="color: rgb(0,0,0);">function(</span>&nbsp;<span style="color: rgb(0,0,0);">e:</span>&nbsp;<span style="color: rgb(0,0,0);">MouseEvent</span>&nbsp;<span style="color: rgb(0,0,0);">):Void</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">effect</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">DropShadow</span>&nbsp;<span style="color: rgb(0,0,0);">{</span>&nbsp;<span style="color: rgb(0,0,0);">offsetX:0.0,offsetY:1.0,color:Color.BLACK,radius:8.0};</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">};</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
<span style="color: rgb(0,0,0);">}</span><br />
</span>
</div>
</div>
<p>Then I create a second class will manage the position of keys looping over an array of characters. </p>
<p><strong>Keyboard.fx</strong></p>
<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; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
<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">
<span style="font-family: courier new; font-size: 10pt;"><span style="font-weight: bold; color: rgb(127,0,85);">package</span>&nbsp;<span style="color: rgb(0,0,0);">testfx1;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.text.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.paint.*;</span></p>
<p><span style="font-weight: bold; color: rgb(127,0,85);">public</span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">class</span>&nbsp;<span style="color: rgb(0,0,0);">Keyboard</span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">extends</span>&nbsp;<span style="color: rgb(0,0,0);">CustomNode</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">public</span>&nbsp;<span style="color: rgb(0,0,0);">function</span>&nbsp;<span style="color: rgb(0,0,0);">create():Node</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">java.lang.System.out.println(</span><span style="color: rgb(42,0,255);">&quot;BuildLetters&nbsp;&#8230;&quot;</span><span style="color: rgb(0,0,0);">);</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">t:String;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">letters</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">[</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(42,0,255);">&quot;A&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;B&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;C&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;D&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;E&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;F&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;G&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;H&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;I&quot;</span><span style="color: rgb(0,0,0);">,</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(42,0,255);">&quot;J&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;K&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;L&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;M&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;N&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;O&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;P&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;Q&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;R&quot;</span><span style="color: rgb(0,0,0);">,</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(42,0,255);">&quot;S&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;T&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;U&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;V&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;W&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;X&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;Y&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;Z&quot;</span><span style="color: rgb(0,0,0);">,</span>&nbsp;<span style="color: rgb(42,0,255);">&quot;@&quot;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">];</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">buttons:Node[]</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">[</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">Text</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">font:</span>&nbsp;<span style="color: rgb(0,0,0);">Font</span>&nbsp;<span style="color: rgb(0,0,0);">{</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">size:</span>&nbsp;<span style="color: rgb(0,0,0);">14</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">style:</span>&nbsp;<span style="color: rgb(0,0,0);">FontStyle.PLAIN</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">x:</span>&nbsp;<span style="color: rgb(0,0,0);">5,</span>&nbsp;<span style="color: rgb(0,0,0);">y:</span>&nbsp;<span style="color: rgb(0,0,0);">16</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">content:</span>&nbsp;<span style="color: rgb(0,0,0);">bind</span>&nbsp;<span style="color: rgb(0,0,0);">t;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">];</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">posX:Integer</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">0;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">posY:Integer</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">0;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">incI:Integer</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">0;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">var</span>&nbsp;<span style="color: rgb(0,0,0);">incJ:Integer</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">0;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">for</span>&nbsp;<span style="color: rgb(0,0,0);">(i</span>&nbsp;<span style="color: rgb(0,0,0);">in</span>&nbsp;<span style="color: rgb(0,0,0);">letters)</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">if</span>&nbsp;<span style="color: rgb(0,0,0);">(</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">incI</span>&nbsp;<span style="color: rgb(0,0,0);">mod</span>&nbsp;<span style="color: rgb(0,0,0);">9</span>&nbsp;<span style="color: rgb(0,0,0);">==</span>&nbsp;<span style="color: rgb(0,0,0);">0)</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">posY</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">35</span>&nbsp;<span style="color: rgb(0,0,0);">*</span>&nbsp;<span style="color: rgb(0,0,0);">(incJ</span>&nbsp;<span style="color: rgb(0,0,0);">++</span>&nbsp;<span style="color: rgb(0,0,0);">);</span>&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">posX</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">0;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">incI</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">0;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span>&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">else</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">posX</span>&nbsp;<span style="color: rgb(0,0,0);">=</span>&nbsp;<span style="color: rgb(0,0,0);">35</span>&nbsp;<span style="color: rgb(0,0,0);">*</span>&nbsp;<span style="color: rgb(0,0,0);">incI;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">insert</span>&nbsp;<span style="color: rgb(0,0,0);">GlassButton</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">x:</span>&nbsp;<span style="color: rgb(0,0,0);">posX</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">y:</span>&nbsp;<span style="color: rgb(0,0,0);">bind</span>&nbsp;<span style="color: rgb(0,0,0);">45</span>&nbsp;<span style="color: rgb(0,0,0);">+</span>&nbsp;<span style="color: rgb(0,0,0);">posY</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">letter</span>&nbsp;<span style="color: rgb(0,0,0);">:</span>&nbsp;<span style="color: rgb(0,0,0);">i</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">onClick</span>&nbsp;<span style="color: rgb(0,0,0);">:</span>&nbsp;<span style="color: rgb(0,0,0);">function(s:String)</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">t</span>&nbsp;<span style="color: rgb(0,0,0);">+=</span>&nbsp;<span style="color: rgb(0,0,0);">s;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span>&nbsp;<span style="color: rgb(0,0,0);">into</span>&nbsp;<span style="color: rgb(0,0,0);">buttons;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">incI++;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">java.lang.System.out.println(</span><span style="color: rgb(42,0,255);">&quot;OK.&quot;</span><span style="color: rgb(0,0,0);">);</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-weight: bold; color: rgb(127,0,85);">return</span>&nbsp;<span style="color: rgb(0,0,0);">Group</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">content</span>&nbsp;<span style="color: rgb(0,0,0);">:</span>&nbsp;<span style="color: rgb(0,0,0);">buttons</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
<span style="color: rgb(0,0,0);">}</span></span>
</div>
</div>
<p>And then I put it all into an Applet following <a href="http://learnjavafx.typepad.com/weblog/2008/09/javafx-meets-google-chrome.html">James Weaver</a> advise.</p>
<p><strong>GlassButtonApplet.fx</strong></p>
<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; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, 'Courier New', courier, monospace; background-color: #f4f4f4">
<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">
<span style="font-family: courier new; font-size: 10pt;"><span style="font-weight: bold; color: rgb(127,0,85);">package</span>&nbsp;<span style="color: rgb(0,0,0);">testfx1;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.application.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.text.*;</span><br />
<span style="font-weight: bold; color: rgb(127,0,85);">import</span>&nbsp;<span style="color: rgb(0,0,0);">javafx.scene.paint.*;</span></p>
<p><span style="color: rgb(0,0,0);">Application</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">stage:</span>&nbsp;<span style="color: rgb(0,0,0);">Stage</span>&nbsp;<span style="color: rgb(0,0,0);">{</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">content:</span>&nbsp;<span style="color: rgb(0,0,0);">Keyboard</span>&nbsp;<span style="color: rgb(0,0,0);">{}</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(0,0,0);">}</span><br />
<span style="color: rgb(0,0,0);">}</span></span>
</div>
</div>
<p>Below the result, click on the keys and put the Applet out of the browser by pressing the Alt key and dragging the Applet. The launch time is long be patient (30s), I don&#8217; t know why right now, I will ask Sun.<br />
<applet code="javafx.application.Applet" width=320 height=220 archive="javafxrt.jar, Scenario.jar, javafxgui.jar, javafx-swing.jar, TestFX1.jar"></p>
<param name="ApplicationClass" value="testfx1.GlassButtonApplet"/>
<param name="jnlp_href" value="GlassButtonApplet.jnlp"/>
<param name="draggable" value="true">
<param name="codebase" value="http://www.itaware.eu/JavaFX/"/>
</applet><br />
Note: being able to put the Applet off the browser, it require to create a JNLP and therefore to sign all jars depending on the applet. A little boring, it is necessary to automate this task:</p>
<ol>
<li> certificate creation: keytool-genkey [-keystore <cheminDuKeystore>]-alias <nomDuCertificat> </li>
<li> JAR signing: jarsigner [-keystore <cheminDuKeystore>] <myfile>. jar <nomDuCertificat> </li>
</ol>
<p>Conclusion<br />
By putting all the time spent in developing it take about 4 hours, including learning of JavaFX. This is correct but it would be nice to further reduce this time. I believe that it is difficult to manipulate JavaFX without at least one real-time viewer. One provided in NetBeans 6.1 is a little slow.<br />
Finally, the idea is there and it is promising because with the <a href="http://java.sun.com/developer/technicalArticles/javase/java6u10/">Java Plugin</a> to 4MB will finally have rich full Java apps that take advantage of being able to do more than the competition: access to serial devices, Bluetooth, &#8230; on the client, using existing Java APIs (eg JMS), switch to desktop app&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/09/14/go-back-to-javafx/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Composite oriented programming</title>
		<link>http://www.itaware.eu/2008/08/24/composite-oriented-programming/</link>
		<comments>http://www.itaware.eu/2008/08/24/composite-oriented-programming/#comments</comments>
		<pubDate>Sun, 24 Aug 2008 14:53:15 +0000</pubDate>
		<dc:creator>Sébastien Letélié</dc:creator>
				<category><![CDATA[Anglais]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[SOA]]></category>
		<category><![CDATA[AOP]]></category>
		<category><![CDATA[dependency injection]]></category>
		<category><![CDATA[domain friven]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/?p=201</guid>
		<description><![CDATA[What lack in the object-oriented programming to invent a new concept ? According to Rickard Öberg, best practices and design patterns are not completely respond to all modelling problematics. The domaine driven design shows that the objects have different behaviour according to the contexts in which they are used. An object model must be adaptable [...]]]></description>
			<content:encoded><![CDATA[<p>What lack in the object-oriented programming to invent a new concept ? According to <a href="http://www.jroller.com/rickard/" target="_blank">Rickard Öberg</a>, best practices and design patterns are not completely respond to all modelling problematics. The domaine driven design shows that the objects have different behaviour according to the contexts in which they are used. An object model must be adaptable in the environment where it live. <span id="more-201"></span>Although a domain defined a set of common business objects their operation and behaviour expected changes as applications needs. To meet this expectation <a href="http://www.jroller.com/rickard/" target="_blank">Rickard Öberg</a> and Niclas Hedhman have developed a framework: Qi4j (chee for jay). Based on the concepts of <a href="http://fr.wikipedia.org/wiki/Programmation_orient%C3%A9e_aspect" target="_blank">AOP</a>, <a href="http://en.wikipedia.org/wiki/Dependency_injection" target="_blank">DI</a> and <a href="http://en.wikipedia.org/wiki/Domain-driven_design" target="_blank">DDD</a>, they developed the composite approach implemented entirely with Java 5.</p>
<p>The framework isn&#8217;t finished yet, but the idea is really interesting and extends existing concepts implemented in <a href="http://www.improve-foundations.com/" target="_blank">Improve Foundation</a> and <a href="http://www.springframework.com/" target="_blank">Spring</a> (dependency injection, inversion of control). We find the layer concept  (one advantage of IF vs Spring) but also module and assembly. The Composite is an object composed of different &laquo;&nbsp;Fragments&nbsp;&raquo; which can be</p>
<ul>
<li>&laquo;&nbsp;Mixins&nbsp;&raquo;: a set of implementation of interfaces,</li>
<li>&laquo;&nbsp;Concerns&nbsp;&raquo;: method interceptor (concept of the AOP)</li>
<li>&laquo;&nbsp;Constraints&nbsp;&raquo; : constraints on method input / output (concept of <a href="http://en.wikipedia.org/wiki/Design_by_contract" target="_blank">design by contract</a>)</li>
<li>&laquo;&nbsp;SideEffects&nbsp;&raquo; : action not really linked to the object, which can be reused by different objects</li>
</ul>
<p>The advantages are mainly a model much business closer that responds well to Eric Evans&#8217;s DDD concept. The drawbacks still learning and therefore adoption. Finally remains about the performance, which is not yet done. I do not think this is a competitor to Improve Foundation or Spring but rather a complement to which we will have an interest.</p>
<p><a href="http://www.qi4j.org/" target="_blank">Qi4j</a> : the documentation is still being developed but the concepts are well presented</p>
<p><a href="http://www.domaindrivendesign.org/" target="_blank">DDD</a> presented by Eric Evans in two parts:</p>
<ul>
<li><a href="http://www.infoq.com/presentations/model-to-work-evans" target="_blank">Putting model to work</a></li>
<li><a href="http://www.infoq.com/presentations/strategic-design-evans" target="_blank">Strategic design</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/08/24/composite-oriented-programming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java 6 update 10</title>
		<link>http://www.itaware.eu/2008/04/12/java-6-update-10/</link>
		<comments>http://www.itaware.eu/2008/04/12/java-6-update-10/#comments</comments>
		<pubDate>Sat, 12 Apr 2008 08:58:59 +0000</pubDate>
		<dc:creator>Sébastien Letélié</dc:creator>
				<category><![CDATA[Anglais]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/2008/04/12/java-6-update-10/</guid>
		<description><![CDATA[The Java 6 update 10 will be special. This future release provide features to keep Sun in the RIA competition, like Ethan Nicolas said, without waiting the version 7 : Difficult to detect JREs, especially from a web browser Difficult to automatically install new JREs Large download size Poor cold start performance Little overlap between [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="https://jdk6.dev.java.net/6u10ea.html" target="_blank">Java 6 update 10</a> will be special. This future release provide features to keep Sun in the RIA competition, like <a href="http://java.sun.com/developer/technicalArticles/javase/java6u10/index.html" target="_blank">Ethan Nicolas</a> said, without waiting the version 7 :</p>
<ul>
<li>Difficult to detect JREs, especially from a web browser </li>
<li>Difficult to automatically install new JREs </li>
<li>Large download size </li>
<li>Poor cold start performance </li>
<li>Little overlap between applets and Web Start programs </li>
</ul>
<p>3 importants new things :</p>
<ul>
<li>Java Kernel </li>
<li><a href="http://java.sun.com/javase/downloads/ea/6u10/plugin2/index.jsp" target="_blank">Java PlugIn</a> </li>
<li>Java Deployment Kit </li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2008/04/12/java-6-update-10/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Groovy and DSL</title>
		<link>http://www.itaware.eu/2007/12/06/groovy-and-dsl/</link>
		<comments>http://www.itaware.eu/2007/12/06/groovy-and-dsl/#comments</comments>
		<pubDate>Thu, 06 Dec 2007 22:39:53 +0000</pubDate>
		<dc:creator>Sébastien Letélié</dc:creator>
				<category><![CDATA[Anglais]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://www.itaware.eu/2007/12/06/groovy-and-dsl/</guid>
		<description><![CDATA[We were lucky receiving Guillaume Laforge at Improve for a Groovy and DSL presentation. I didn&#8217;t have time to really study script languages, i just take a quik look on Scala and Groovy and not on JRuby and Jython. I worried about the capacity of the developers to debug with this languages. I had a [...]]]></description>
			<content:encoded><![CDATA[<p>We were lucky receiving Guillaume Laforge at <a href="http://www.improve.fr">Improve</a> for a <a href="http://groovy.codehaus.org/">Groovy</a> and <a href="http://en.wikipedia.org/wiki/Domain-specific_programming_language">DSL</a> presentation.<br />
I didn&#8217;t have time to really study script languages, i just take a quik look on <a href="http://www.scala-lang.org/">Scala</a> and Groovy and not on JRuby and Jython. I worried about the capacity of the developers to debug with this languages. I had a lot of problems with Javascript. We were agree with <a href="http://weblogs.java.net/blog/joshy/">Josh Marinacci</a>  in our last <a href="http://www.itaware.eu/2006/11/12/java-dinner-in-prague/">exchange</a> to say that this technology is really interesting but how we can control it. Guillaume put me at rest it&#8217;s not really a problem, developers don&#8217;t make really more mistakes than they do in Java, and now IntelliJ have a great plugin which manage debugging, color syntaxing, content assist, refactoring&#8230; The Eclipse plugin haven&#8217;t it yet but it comes.<br />
It&#8217;s clear Groovy is a really great tool to realise DSL. The syntax is malleable and readable. His extension capacity with category concept (like in Objective C) or with operators is really great.<br />
I forgot to ask him what&#8217;s he thinking about JavaFX. The <a href="http://blogs.sun.com/chrisoliver/">Chris Oliver</a>&#8216;s DSL to create Swing UI is not based on Groovy for <a href="https://openjfx.dev.java.net/JavaFX_FAQ.html#Why_not_Groovy.3F">this reason</a>, is it a good reason ?<br />
For your information Guillaume has created a company <a href="http://www.g2one.com">G2one</a> offering services around Groovy and Grails. The slides he shows us are available on <a href="http://www.grails-exchange.com/">grails-exchange</a>. Guillaume will be at <a href="http://www.javapolis.com/confluence/display/JP07/Guillaume+Laforge">JavaPolis</a>.<br />
Thank&#8217;s a lot Guillaume and see you soon <img src='http://www.itaware.eu/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.itaware.eu/2007/12/06/groovy-and-dsl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

