<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="http://ajax.sys-con.com"  xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>From the Blogosphere</title>
 <link>http://ajax.sys-con.com/</link>
 <description>Latest articles from From the Blogosphere</description>
 <language>en</language>
 <copyright>Copyright 2009 Ulitzer.com</copyright>
 <generator>Ulitzer.com</generator>
 <lastBuildDate>Sat, 28 Nov 2009 09:29:32 EST</lastBuildDate>
 <docs>http://backend.userland.com/rss</docs>
 <ttl>10</ttl>
<item>
 <title>RIA Services: A DomainService Is a WCF Service – Add Service Reference</title>
 <link>http://ajax.sys-con.com/node/1197335</link>
 <description>I made the fairly bold statement at my PDC09 talk that a DomainService IS A WCF Service. That is, everything you know about a WCF service should be true of a DomainService. I didn’t have time to get into this in my talk, so I thought I’d hit the highlights here. And in the process show how to consume a DomainService from a WinForms. You can also see more examples at: &lt;a href=&quot;http://code.msdn.microsoft.com/RiaServices&quot; title=&quot;http://code.msdn.microsoft.com/RiaServices&quot;&gt;http://code.msdn.microsoft.com/RiaServices&lt;/a&gt;&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1197335&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Mon, 23 Nov 2009 10:30:00 EST</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1197335</guid>
</item>
<item>
 <title>Building Amazing Business Apps with Silverlight 4, &amp; Visual Studio 2010</title>
 <link>http://ajax.sys-con.com/node/1195515</link>
 <description>&lt;p&gt;I had a great time at &lt;a href=&quot;http://microsoftpdc.com/Sessions/CL21&quot;&gt;my talk today at PDC2009&lt;/a&gt;.&amp;#160; I was able to spend much of the time in a demo…&amp;#160;&amp;#160; Here is a summary of that demo so you can walk through it on your own machine:&lt;/p&gt;  &lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1195515&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Fri, 20 Nov 2009 09:45:00 EST</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1195515</guid>
</item>
<item>
 <title>ADF BC Groovy – Showing Old Values Along with New</title>
 <link>http://ajax.sys-con.com/node/1185105</link>
 <description>A common requirement in databound applications is to allow the user to view changes before they commit them to the database, showing the user both the original-old value along with the new.  This gives users a chance to review their changes visually by comparing the old and new.&lt;br /&gt;&lt;br /&gt;For an updated record that has yet been committed to the database, ADF BC stores both the old and new value.  Among other reasons ADF BC does this, is it allows the user to cancel any changes, and rather than having to fetch the original value back from the database, ADF BC just retrieves the old value it has cached without a roundtrip to the database.&lt;br /&gt;&lt;br /&gt;This cache gives us the ability to solve our original requirements as the ADF BC framework exposes methods to fetch both new and old non committed values from the Entity Object (EO).  To fetch the new current value we call the associated accessor such as getPosition() or getName() that was automatically created by the framework in our EntityImpl.  To get the old value we use the getPostedAttribute() method passing in the index of the field we wish to fetch.&lt;br /&gt;&lt;br /&gt;In JDeveloper 11g through its introduction of Groovy expressions, it&#039;s very simple to expose the old value through the Entity Objects:&lt;br /&gt;&lt;br /&gt;1) In your required EO create a transient attribute.  For example if we want to show the old values for the Position attribute of our EO, we could create a new transient attribute named OldPosition.&lt;br /&gt;&lt;br /&gt;2) Ensure the &quot;Persistent&quot; and &quot;Derived from SQL Expression&quot; properties are turned off for the new transient attribute.&lt;br /&gt;&lt;br /&gt;3) Set the &quot;Value Type&quot; to Expression and enter the following Groovy expression into the Value field:&lt;br /&gt;&lt;br /&gt;adf.object.getPostedAttribute(adf.object.getAttributeIndexOf(model.EmployeesImpl.POSITION))&lt;br /&gt;&lt;br /&gt;Note the call to the getPostedAttribute() method, passing in the index of the Position field that it requires.&lt;br /&gt;&lt;br /&gt;If the Groovy syntax isn&#039;t familiar to you in JDeveloper 11g consult Grant Ronald&#039;s &lt;a href=&quot;http://www.oracle.com/technology/products/jdev/11/how-tos/groovy/introduction_to_groovy.pdf&quot;&gt;Introduction to Groovy&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;A bad steer here maybe to try and use ADF Groovy&#039;s oldValue and newValue methods.  Unfortunately these are only available for Groovy expressions in EO Declarative Validators, not in transient attribute.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://1.bp.blogspot.com/_5hhNK2aXwp8/Su--b2b8OXI/AAAAAAAAA2o/MYyCNlsBuRU/s1600-h/groovy.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 186px;&quot; src=&quot;http://1.bp.blogspot.com/_5hhNK2aXwp8/Su--b2b8OXI/AAAAAAAAA2o/MYyCNlsBuRU/s400/groovy.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5399743863918967154&quot; /&gt;&lt;/a&gt;&lt;br /&gt;4) Expose the attribute through the associated View Objects (VO) if necessary.&lt;br /&gt;&lt;br /&gt;At runtime you&#039;ll note that initially the OldPosition field shows what&#039;s in the Position field.  When you change the Position field&#039;s value, the OldPosition remains at the pre-cached value.  Finally on committing the changes to the database, the OldPosition value is overwritten with the new Position value.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&#039;1&#039; height=&#039;1&#039; src=&#039;https://blogger.googleusercontent.com/tracker/38586079-10124615613825984?l=one-size-doesnt-fit-all.blogspot.com&#039;/&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/OneSizeDoesntFitAll/~4/HfFV9pc8uwY&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1185105&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Fri, 13 Nov 2009 14:45:00 EST</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1185105</guid>
</item>
<item>
 <title>Data Loss in MAC OS X</title>
 <link>http://ajax.sys-con.com/node/1171665</link>
 <description>Mac OS X is a multi-tasking operating system that allows you to execute one or more processes at the same time. In some situations, you need to restart your Mac computer to clear several system processes to free system resources. This is the best solution to prevent system freezing. But sometimes when you restart your Mac computer, you encounter gray screen of Mac with a gray spinner. &lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1171665&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 05 Nov 2009 16:15:00 EST</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1171665</guid>
</item>
<item>
 <title>Keep Your Executive Assistant Happy if Moving to the Cloud</title>
 <link>http://ajax.sys-con.com/node/1171763</link>
 <description>Google held a small event in London late last month, at which senior executives from a wide range of organisations gathered to discuss the impact of the Cloud. Presenters included luminaries such as Marc Benioff, Werner Vogels, Geoffrey Moore and Nick Carr, as well as CIOs at the coalface in adopting various Cloud (mainly SaaS) [...]&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1171763&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 04 Nov 2009 13:00:00 EST</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1171763</guid>
</item>
<item>
 <title>Contributing to FOSS: A Business Perspective</title>
 <link>http://ajax.sys-con.com/node/1157175</link>
 <description>Although my presentation focused on individual contributions, these lessons also apply to how businesses benefit by contributing to FOSS. When a business approaches a project they should attempt to build a symbiotic relationship with the community. Such a relationship involves following the established community procedures so that your contributions can be easily adopted by the project. Useful scripts and code developments made within the company that can be useful to the greater public should be contributed back and packaging of popular software within the company can be submitted for inclusion and use by the greater community. Testing and bug reporting based on experience using FOSS on their production (or development) systems can provide important information for FOSS developers about the health and status of their projects.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1157175&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 29 Oct 2009 18:30:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1157175</guid>
</item>
<item>
 <title>Welcome to The Managing FOSS for Business Results Blog</title>
 <link>http://ajax.sys-con.com/node/1148078</link>
 <description>This blog is part of a new educational initiative to foster a deeper understanding of the capabilities and issues involved with administering FOSS (Free and Open Source Software) to deliver concrete business benefits. Although our subject will sometimes become technical, we will strive to address the business benefits at the beginning of each and every post. Therefore, we are confident that this blog will prove interesting and understandable to a broad variety of leaders, managers, and technicians.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1148078&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 29 Oct 2009 17:15:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1148078</guid>
</item>
<item>
 <title>Business Service Management: Aligning Business &amp; IT</title>
 <link>http://ajax.sys-con.com/node/1154136</link>
 <description>The result is BSMReview.com, a site which seeks to analyze the best and next practices in business service management from a third-party point of view. The experts that Bill has brought to the site are literally a who&#039;s who of the best and most trusted people in the field: Peter Armstrong, Tom Bishop, Malcolm Fry, Israel Gat, Peter McGarahan, Richard Ptak, and Ken Turbitt. And that&#039;s just for the launch. Bill is recruiting more experts even as I write this. I&#039;d like to get David Williams from Gartner and Jean-Pierre Garbani from Forrester involved as well, but they&#039;re behind the iron walls of the analyst-dom.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1154136&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 29 Oct 2009 10:45:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1154136</guid>
</item>
<item>
 <title>Licensing of Linked Data</title>
 <link>http://ajax.sys-con.com/node/1159573</link>
 <description>As part of a workshop at this year&amp;#8217;s International Semantic Web Conference (ISWC), former colleague Leigh Dodds prepared an interesting diagram on the ways in which resources comprising the Linked Data Cloud are currently licensed.

For various reasons, I was unable to make it to Virginia for the event, but a scan through the presentations from [...]&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1159573&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 27 Oct 2009 09:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1159573</guid>
</item>
<item>
 <title>Ulitzer Provides a Powerful Social Journalism Platform</title>
 <link>http://ajax.sys-con.com/node/1124529</link>
 <description>Ulitzer provides a powerful social journalism platform for content syndication, bridging the gap between traditional and new media. For rapid awareness of news, articles, blogs and other content, Ulitzer&#039;s keyword tagging enhances searchability and allows targeted audiences to easily find the information they seek. The value of this is magnified with viral syndication on both the Ulitzer network and popular search engines such as Google, Yahoo and Bing, making Ulitzer one of the more effective content publishing sites on the Internet.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1124529&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Sun, 25 Oct 2009 08:45:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1124529</guid>
</item>
<item>
 <title>JSF 2, Custom Java Components, and AJAX Behaviors</title>
 <link>http://ajax.sys-con.com/node/1139762</link>
 <description>Unlike most of my blog posts, where I try to describe the easiest possible way to do things, in this posting, I&#039;ll instead go over a Java-based custom JSF component that responds to the Ajax tag.  The reason being that there simply aren&#039;t any examples out there of how to do this, and at least two people have expressed interest in finding exactly out how this is done.  I&#039;d advise anyone considering doing this to make &lt;i&gt;really&lt;/i&gt; sure that you can&#039;t do the same thing in a Composite Component (you usually can), but sometimes, a Java-based custom JSF component is going to be required.&lt;/p&gt;
&lt;p&gt;We&#039;re going to cover the following topics here, and it&#039;s going to be a little more code than usual, but I suspect that this will end up saving some folks a bunch of time, so lets plow forward.  I&#039;ll cover:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Ajax listeners&lt;/li&gt;
    &lt;li&gt;Facelet components&lt;/li&gt;
    &lt;li&gt;Integrating the two&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;First, the Ajax Listener&lt;/h2&gt;
&lt;p&gt;An ajax listener, connected to your ajax event with the listener attribute, is a method that will be called every time the ajax request is made.  For example, let&#039;s look at the following page section:&lt;/p&gt;
&lt;pre&gt;
   1 Echo test: &amp;lt;h:outputText id=&amp;quot;out&amp;quot; value=&amp;quot;#{custom.hello}&amp;quot;/&amp;gt;
   2 &amp;lt;br/&amp;gt;
   3 Echo count: &amp;lt;h:outputText id=&amp;quot;count&amp;quot; value=&amp;quot;#{custom.count}&amp;quot;/&amp;gt;
   4 &amp;lt;br/&amp;gt;
   5 &amp;lt;h:inputText id=&amp;quot;in&amp;quot; value=&amp;quot;#{custom.hello}&amp;quot; autocomplete=&amp;quot;off&amp;quot;&amp;gt;
   6     &amp;lt;f:ajax event=&amp;quot;keyup&amp;quot; render=&amp;quot;out count eventcount&amp;quot; listener=&amp;quot;#{custom.update}&amp;quot;/&amp;gt;
   7 &amp;lt;/h:inputText&amp;gt;
   8 &amp;lt;br/&amp;gt;
   9 Event count: &amp;lt;h:outputText id=&amp;quot;eventcount&amp;quot; value=&amp;quot;#{custom.eventCount}&amp;quot;/&amp;gt;
&lt;/pre&gt;
&lt;p&gt;We&#039;ve got three bean properties - hello (which is the string entered by the inputText), count (which is a count of the characters in hello, and eventCount (which is a count of the number of ajax requests).  We also have a method on the bean, update (line 6), which will be called every time the ajax call is submitted.&lt;/p&gt;
&lt;p&gt;The behavior of this page is pretty simple - every time you press a character in the inputText, the complete value of the input is echoed to the outputText &amp;quot;out&amp;quot; (line 1) - the length of &amp;quot;out&amp;quot; is written to &amp;quot;count&amp;quot; (line 3), and the &amp;quot;eventCount&amp;quot; outputText (line 9) has it&#039;s value incremented by one.&lt;/p&gt;
&lt;p&gt;So - what code is in the bean?  Here&#039;s the relevant bits:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre&gt;
   1 public void setHello(String hello) {
   2     this.hello = hello;
   3 }
   4 public int getCount() {
   5     return count;
   6 }
   7 public int getEventCount() {
   8     return eventCount;
   9 }
  10 public void update(AjaxBehaviorEvent event) {
  11     count = hello.length();
  12     eventCount++;
  13 }
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Not so bad - the only thing new here is that AjaxBehaviorEvent class - and we&#039;re not even using it.  The update method will simply set up the values to be correct, and we let the Ajax render to the rest.  So - listeners are easy.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Facelets Components&lt;/h2&gt;
&lt;p&gt;Now, we&#039;ll want to create a custom tag in Java.  To do that, we&#039;ll need to make a few configuration file entries, and write a little java code.  But first, let&#039;s see it used in the page:&lt;/p&gt;
&lt;p&gt;In the XHTML header, we&#039;ll say:&lt;/p&gt;
&lt;pre&gt;
   1 &amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;
   2       xmlns:ui=&amp;quot;http://java.sun.com/jsf/facelets&amp;quot;
   3       xmlns:h=&amp;quot;http://java.sun.com/jsf/html&amp;quot;
   4       xmlns:f=&amp;quot;http://java.sun.com/jsf/core&amp;quot;
   5       xmlns:cu=&amp;quot;http://javaserverfaces.dev.java.net/demo/custom-taglib&amp;quot;&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Setting up the &amp;quot;cu&amp;quot; prefix (line 5) to point to &amp;quot;custom-taglib&amp;quot; (the whole URL is significant).  Then later on in the page, we&#039;ll use it like so:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;cu:custom id=&amp;quot;customId&amp;quot;&amp;gt;
&lt;/pre&gt;
&lt;p&gt;We then need to add an entry in web.xml:&lt;/p&gt;
&lt;pre&gt;
   1 &amp;lt;context-param&amp;gt;
   2    &amp;lt;param-name&amp;gt;javax.faces.FACELETS_LIBRARIES&amp;lt;/param-name&amp;gt;
   3    &amp;lt;param-value&amp;gt;/WEB-INF/custom-taglib.xml&amp;lt;/param-value&amp;gt;
   4 &amp;lt;/context-param&amp;gt;
&lt;/pre&gt;
&lt;p&gt;This points to our next config file, which is the filename on line 3.  Here&#039;s its contents, in full:&lt;/p&gt;
&lt;pre&gt;
   1 &amp;lt;facelet-taglib xmlns=&amp;quot;http://java.sun.com/xml/ns/javaee&amp;quot;
   2               xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot;
   3               xsi:schemaLocation=&amp;quot;http://java.sun.com/xml/ns/javaee &lt;a href=&quot;http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd&amp;quot;&quot; title=&quot;http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd&amp;quot;&quot;&gt;http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd&amp;quot;&lt;/a&gt;
   4               version=&amp;quot;2.0&amp;quot;&amp;gt;
   5   &amp;lt;namespace&amp;gt;http://javaserverfaces.dev.java.net/demo/custom-taglib&amp;lt;/namespace&amp;gt;
   6   &amp;lt;tag&amp;gt;
   7     &amp;lt;tag-name&amp;gt;custom&amp;lt;/tag-name&amp;gt;
   8       &amp;lt;component&amp;gt;
   9         &amp;lt;component-type&amp;gt;mycustom&amp;lt;/component-type&amp;gt;
  10       &amp;lt;/component&amp;gt;
  11   &amp;lt;/tag&amp;gt;
  12 &amp;lt;/facelet-taglib&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Note that the namespace element on line 5 matches the URL we used for the namespace in the html element of the using page.  We said this taglibrary will have one tag &amp;quot;custom&amp;quot; (line 7), which maps to the FacesComponent &amp;quot;mycustom&amp;quot;.  Where does it find the definition of &amp;quot;mycustom&amp;quot;?  In the Java file defining the component, using the new @FacesComponent attribute.  Here&#039;s the full Java code, leaving out the imports:&lt;/p&gt;
&lt;pre&gt;
   1 @FacesComponent(value = &amp;quot;mycustom&amp;quot;)
   2 public class MyCustom extends UIComponentBase {
   3 
   4     @Override
   5     public String getFamily() {
   6         return &amp;quot;custom&amp;quot;;
   7     }
   8 
   9     @Override
  10     public void encodeEnd(FacesContext context) throws IOException {
  11 
  12         ResponseWriter responseWriter = context.getResponseWriter();
  13         responseWriter.startElement(&amp;quot;div&amp;quot;, null);
  14         responseWriter.writeAttribute(&amp;quot;id&amp;quot;,getClientId(context),&amp;quot;id&amp;quot;);
  15         responseWriter.writeAttribute(&amp;quot;name&amp;quot;, getClientId(context),&amp;quot;clientId&amp;quot;);
  16         responseWriter.write(&amp;quot;Howdy!&amp;quot;);
  17         responseWriter.endElement(&amp;quot;div&amp;quot;);
  18     }
  19 }
&lt;/pre&gt;
&lt;p&gt;In fact, the Java code itself is simple enough that I don&#039;t really think it requires any explanation.   Putting the cu:custom tag in your page will now render Howdy!, surrounded by a div with the same id and name as you gave the component.  All that&#039;s left is to add the Ajax.  That... is a bit more complicated, but now that we&#039;ve handled everything else, it&#039;s really just incremental.&lt;/p&gt;
&lt;h2&gt;Using f:ajax with your custom tag&lt;/h2&gt;
&lt;p&gt;To use the f:ajax tag, we&#039;d like to, for instance, do something like this:&lt;/p&gt;
&lt;pre&gt;
   1 &amp;lt;cu:custom id=&amp;quot;customId&amp;quot;&amp;gt;
   2     &amp;lt;f:ajax render=&amp;quot;eventcount&amp;quot; listener=&amp;quot;#{custom.updateEventCount}&amp;quot;/&amp;gt;
   3 &amp;lt;/cu:custom&amp;gt;
&lt;/pre&gt;
&lt;p&gt;Meaning, we&#039;d like to just decorate the tag, and let it do something &amp;quot;smart&amp;quot;.  In this case, we&#039;ll default to &amp;quot;onclick&amp;quot; (since we&#039;re dealing with a div, after all, we could also default to &amp;quot;onmouseover&amp;quot;, for instance).  It&#039;d also be nice if we could still call the ajax listener.  That&#039;ll require a bit more code.  Here&#039;s the full Java component, with the additional ajax code.  I&#039;ll go over it at the end:&lt;/p&gt;
&lt;pre&gt;
   1 @FacesComponent(value = &amp;quot;mycustom&amp;quot;)
   2 public class MyCustom extends UIComponentBase implements ClientBehaviorHolder {
   3 
   4     @Override
   5     public String getFamily() {
   6         return &amp;quot;custom&amp;quot;;
   7     }
   8 
   9     @Override
  10     public void encodeEnd(FacesContext context) throws IOException {
  11 
  12         ClientBehaviorContext behaviorContext =
  13                 ClientBehaviorContext.createClientBehaviorContext(context, 
  14                 this, &amp;quot;click&amp;quot;, getClientId(context), null);
  15 
  16         ResponseWriter responseWriter = context.getResponseWriter();
  17         responseWriter.startElement(&amp;quot;div&amp;quot;, null);
  18         responseWriter.writeAttribute(&amp;quot;id&amp;quot;,getClientId(context),&amp;quot;id&amp;quot;);
  19         responseWriter.writeAttribute(&amp;quot;name&amp;quot;, getClientId(context),&amp;quot;clientId&amp;quot;);
  20         Map&amp;lt;String,List&amp;lt;ClientBehavior&amp;gt;&amp;gt; behaviors = getClientBehaviors();
  21         if (behaviors.containsKey(&amp;quot;click&amp;quot;) ) {
  22             String click = behaviors.get(&amp;quot;click&amp;quot;).get(0).getScript(behaviorContext);
  23             responseWriter.writeAttribute(&amp;quot;onclick&amp;quot;, click, null);
  24         }
  25         responseWriter.write(&amp;quot;Click me!&amp;quot;);
  26         responseWriter.endElement(&amp;quot;div&amp;quot;);
  27     }
  28 
  29     
  30     @Override
  31     public void decode(FacesContext context) {
  32         Map&amp;lt;String, List&amp;lt;ClientBehavior&amp;gt;&amp;gt; behaviors = getClientBehaviors();
  33         if (behaviors.isEmpty()) {
  34             return;
  35         }
  36 
  37         ExternalContext external = context.getExternalContext();
  38         Map&amp;lt;String, String&amp;gt; params = external.getRequestParameterMap();
  39         String behaviorEvent = params.get(&amp;quot;javax.faces.behavior.event&amp;quot;);
  40 
  41         if (behaviorEvent != null) {
  42             List&amp;lt;ClientBehavior&amp;gt; behaviorsForEvent = behaviors.get(behaviorEvent);
  43 
  44             if (behaviors.size() &amp;gt; 0) {
  45                 String behaviorSource = params.get(&amp;quot;javax.faces.source&amp;quot;);
  46                String clientId = getClientId(context);
  47                if (behaviorSource != null &amp;&amp; behaviorSource.equals(clientId)) {
  48                    for (ClientBehavior behavior: behaviorsForEvent) {
  49                        behavior.decode(context, this);
  50                    }
  51                }
  52             }
  53         }
  54     }
  55 
  56     @Override
  57     public Collection&amp;lt;String&amp;gt; getEventNames() {
  58         return Arrays.asList(&amp;quot;click&amp;quot;);
  59     }
  60 
  61     @Override
  62     public String getDefaultEventName() {
  63         return &amp;quot;click&amp;quot;;
  64     }
  65 }
&lt;/pre&gt;
&lt;p&gt;At 65 lines, this is probably the longest code example I&#039;ve ever posted, but most of this is either really easy, or stuff you&#039;ve seen in the previous section.  First, we define what Ajax events we&#039;ll accept (&amp;quot;click&amp;quot;) and what one is the default (&amp;quot;click&amp;quot; again), on lines 56-64.  These are part of the ClientBehaviorHolder interface (line 2).  We also had to add a little code to the encodeEnd method, so that we correctly output the DOM event script as part of the div (lines 12-14, 20-24).  And lastly, we needed to add a decode method, since our component is no longer output only - the ajax event handling code is always part of the decode process (lines 31-50).  This is the part where we actually make sure that that listener is being called.&lt;/p&gt;
&lt;p&gt;Did I mention that you can do pretty much the same thing in a composite component?&amp;nbsp; That&#039;ll be the subject of a future blog.&lt;/p&gt;
&lt;p&gt;Well, I warned you this was a little more complex - hopefully it&#039;s all fairly clear.  If it isn&#039;t - ask in the comments.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1139762&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Mon, 12 Oct 2009 10:45:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1139762</guid>
</item>
<item>
 <title>Belgium ReMix and Architect Forum: 10 Years of Framework Design Guidelines</title>
 <link>http://ajax.sys-con.com/node/1125712</link>
 <description>I had a great time at ReMix and the Architect Forum in Belgium. I had a chance to cover build an application end-to-end with Silverlight 3 and RIA Services which was basically this application. At the Architect Forum I had a chance to talk in more depth about the general application pattern we are thinking about for RIA applications. I shamelessly stole some slides from Nikhil Kothari for this one. Check out the slides. &lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1125712&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 01 Oct 2009 12:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1125712</guid>
</item>
<item>
 <title>Adobe MAX 2009 Online</title>
 <link>http://ajax.sys-con.com/node/1125353</link>
 <description>Watch MAX keynotes, streamed live from Los Angeles-register now. On October 5th and 6th, Adobe MAX Online will feature the keynotes, streamed live, highlighting the newest and most exciting developments in the world of technology. Join 10 minutes early and participate in the backstage behind the scenes action.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1125353&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 29 Sep 2009 17:15:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1125353</guid>
</item>
<item>
 <title>Dell&#039;s Jiu-Jitsu. Strategic Genius?</title>
 <link>http://ajax.sys-con.com/node/1125003</link>
 <description>While I was off enjoying some brain candy by way of obtaining PMI&#039;s PMP (Project Management Professional) certification last week, the IT landscape was busy reconfiguring itself. I enjoyed reading Jeffrey Kaplan&#039;s analysis of the Perot acquisition by Dell, and Information Week&#039;s perspective.  At this early juncture I probably have more questions than answers, but also viewed the acquisition from a slightly different perspective.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1125003&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 29 Sep 2009 12:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1125003</guid>
</item>
<item>
 <title>Two Great Tools to Work with SQL Azure</title>
 <link>http://ajax.sys-con.com/node/1120619</link>
 <description>SQL Azure Migration Wizard is a nice tool. It can connect to (local)Server as well as it supports running scripts. I tried running a script to create &#039;pubs&#039; on SQL Azure. It did manage to bring in some tables and not all. It does not like &#039;USE&#039; in SQL statements(to know what is allowed and what is not you must go to MSDN). For running the script I need to be in Master(but how?, I could not fathom). I went through lots of &quot;encountered some problem, searching for a solution&quot; messages. On the whole it is very easy to use tool.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1120619&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Sat, 26 Sep 2009 15:15:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1120619</guid>
</item>
<item>
 <title>Cluetrain on Twitter</title>
 <link>http://ajax.sys-con.com/node/1121846</link>
 <description>It turns out that the four of us think different things about Twitter, as Tim indicates in this brief article. My own view is overall quite positive, but compound. I don’t think Twitter is “closer than anything we’ve seen before” to an ideal conversational medium. Twitter conversations are pretty weird because of the brevity of tweets, but mainly because of the asymmetry of the conversation: If the people you’re talking to respond, their responses go to people who may not be following you, and you may not see their responses.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1121846&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Fri, 25 Sep 2009 18:30:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1121846</guid>
</item>
<item>
 <title>CA Should Offer the CEO Job to Ken Cron</title>
 <link>http://ajax.sys-con.com/node/1117379</link>
 <description>The round of applause that greeted the suggestion that Ken Cron be promoted from Interim CEO to full CEO of Computer Associates International (renamed as CA as one of the first action items by John Swainson) left a smile on the face of Chairman Lewis Ranieri at the company&#039;s annual shareholder meeting in 2004. Ken had one of the toughest jobs any CEO can imagine: that of following Sanjay Kumar and Charles Wang. Yet under Cron&#039;s leadership CA&#039;s net income returned to the black after three consecutive years of losses and under very difficult circumstances.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1117379&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 23 Sep 2009 06:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1117379</guid>
</item>
<item>
 <title>Mobile Devices: Authenticate or Encrypt?</title>
 <link>http://ajax.sys-con.com/node/1114999</link>
 <description>I was already thinking about the insecurity of cell phone communications because Molly Dolesalek reported on them in Processor Magazine. &quot;It&#039;s fairly easy to tap into a cell phone conversation, but the business world doesn&#039;t really understand that,&quot; Dunleavy says. For that reason, he believes that there will be more interest in voice encryption, including VoIP encryption,&quot; she wrote, quoting Mike Dunleavy, president of Diginonymous.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1114999&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 22 Sep 2009 19:15:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1114999</guid>
</item>
<item>
 <title>Gmail Now Crashing Two Browsers</title>
 <link>http://ajax.sys-con.com/node/1114586</link>
 <description>Wow. I’m impressed. For the past few days, Gmail has been hanging when I try to attach a file. It doesn’t matter what type of file it is or how big it is. More times than not, it hangs. The hang happens as soon as Gmail shows the bar that displays the percent loaded. I have to force-quit. This is with the latest version of FF and of Snow Leopard. (I use Gmail as part of Google Accounts, and I have https turned on.)&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1114586&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Mon, 21 Sep 2009 15:15:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1114586</guid>
</item>
<item>
 <title>HanselMinutes Interview on RIA Services</title>
 <link>http://ajax.sys-con.com/node/1113247</link>
 <description>&lt;p&gt;I had a great opportunity to chat with the famous &lt;a href=&quot;http://www.hanselman.com/blog/&quot;&gt;Scott Hanselman&lt;/a&gt; recently on &lt;a href=&quot;http://code.msdn.microsoft.com/RiaServices&quot;&gt;.NET RIA Services&lt;/a&gt;.&amp;#160;&amp;#160;&amp;#160; We drilled a lot into the background for RIA Services and what the high level patterns we are addressing with RIA Services.  &lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1113247&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Sun, 20 Sep 2009 12:18:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1113247</guid>
</item>
<item>
 <title>Software Flexibility in the Cloud - Part 4 of 5</title>
 <link>http://ajax.sys-con.com/node/1112342</link>
 <description>Platform as a service (PaaS) refers to the tools used to build software applications (software programs) in the cloud. Think of it as a cloud-based development environment for building and managing software applications. These custom-built applications are then hosted on infrastructure as a service (IaaS).&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1112342&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Sun, 20 Sep 2009 06:30:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1112342</guid>
</item>
<item>
 <title>@BrandonWatson Is Listening</title>
 <link>http://ajax.sys-con.com/node/1105672</link>
 <description>One of the things that I have been loving about being back at Microsoft is working in the Developer Platform team.&amp;#160; I have always been a geek, and have this latent developer hiding inside of me.&amp;#160; I love designing interesting applications and services, and love to roll some code when I can, though my close [...]&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1105672&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Mon, 14 Sep 2009 10:12:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1105672</guid>
</item>
<item>
 <title>Silverlight Polling Duplex Channel is NOT a Scalable Solution</title>
 <link>http://ajax.sys-con.com/node/1022582</link>
 <description>This is great and the programming model for communicating with the Polling Duplex channel is brain-dead simple. It does NOT get any easier to implement push data to a RIA - not in Flash, not in AIR, and certainly not in JavaFX. The problem is that this solution doesn&#039;t scale. On the server side, for each concurrently running Silverlight application (so probably one per concurrent user), there is a full live socket being consumed that will not be relinquished until the client disconnects/closes their browser.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1022582&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 08 Sep 2009 09:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1022582</guid>
</item>
<item>
 <title>What Server Does SproutCore Run On?</title>
 <link>http://ajax.sys-con.com/node/1095716</link>
 <description>&lt;p&gt;Ha ha! Trick question! SproutCore is a &lt;b&gt;client-side&lt;/b&gt; application framework (unlike, say, &lt;a href=&quot;http://en.wikipedia.org/wiki/Google_Web_Toolkit&quot;&gt;Google Web Toolkit&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;b&gt;No part of SproutCore “runs” on the server, and SproutCore contains no “server-side” libraries.&lt;/b&gt; A web server (Apache, for example) is only used to deliver plain old HTML, CSS, and JavaScript to the browser. Once those initial files have been served, a SproutCore-based application runs entirely in the browser (and can easily be run “offline”, with no network access at all).&lt;/p&gt;
&lt;p&gt;Any server that can receive HTTP requests (which is all of them) can interact with a running SproutCore application, via XHR calls. Here’s some example languages and servers you could use to interact with a SproutCore application at runtime: CGI scripts, Java, .Net, PHP, Perl, Python, Django, Ruby, Rails/Merb/Rack, WebObjects, WebDav and countless others.&lt;/p&gt;
&lt;p&gt;During &lt;i&gt;development&lt;/i&gt;, SproutCore’s own HTML, CSS, and JavaScript and any custom HTML, JavaScript and CSS you write can be easily served to the browser using a trivial Ruby/Rack-based server included with the SproutCore buildtools and launched with the &lt;code&gt;sc-server&lt;/code&gt; command. The &lt;code&gt;sc-server&lt;/code&gt; command and SproutCore buildtools are &lt;i&gt;not&lt;/i&gt; used once your SproutCore application is deployed to users; they are merely a development aid.&lt;/p&gt;
&lt;p&gt;When you are ready to deploy, SproutCore’s buildtools provide an &lt;code&gt;sc-build&lt;/code&gt; command—used to generate a static directory of HTML, CSS, and JavaScript that you would then upload to a production-quality web server such as Apache or lighttpd. &lt;code&gt;sc-build&lt;/code&gt; will combine, pack, and minify the HTML, CSS, and JavaScript—and generate cache-friendly URLs. The same directory structure you used with &lt;code&gt;sc-server&lt;/code&gt; during development is accepted by &lt;code&gt;sc-build&lt;/code&gt; for deployment, making this an easy, one-step process.&lt;/p&gt;
&lt;p&gt;Note: &lt;i&gt;SproutCore&lt;/i&gt; (HTML, CSS, and JavaScript) and SproutCore’s &lt;i&gt;buildtools&lt;/i&gt; (Ruby, Rack) are &lt;a href=&quot;http://github.com/sproutit/sproutcore/tree/master&quot;&gt;separate&lt;/a&gt; &lt;a href=&quot;http://github.com/sproutit/sproutcore-abbot/tree/master&quot;&gt;projects&lt;/a&gt; and can be used independently. For example, &lt;a href=&quot;http://www.sproutcore.com&quot;&gt;this website&lt;/a&gt; is built using SproutCore’s buildtools, but not SproutCore itself (it is a website after all, not an application).&lt;/p&gt;
&lt;p&gt;&lt;i&gt;Hat tip to &lt;/i&gt;&lt;i&gt;&lt;a href=&quot;http://jacobian.org/&quot;&gt;Jacob Kaplan-Moss&lt;/a&gt;&lt;/i&gt;&lt;i&gt; for noticing that we hadn’t moved the docs for this aspect of SproutCore prominently to the new SproutCore 1.0 website.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;&lt;i&gt; &lt;/i&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Sproutcore-BlogPosts/~4/AbvirEd3Y-g&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1095716&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Sun, 06 Sep 2009 04:45:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1095716</guid>
</item>
<item>
 <title>Cloud Gets Endorsement From Events</title>
 <link>http://ajax.sys-con.com/node/1095317</link>
 <description>Many of the concepts first proposed and extolled during the Internet hype curve in the mid-1990s are now bearing fruit. Perhaps we should think of cloud computing as less than a separate hype curve, and more as the realization of the original Internet value curve , now some 15 years into its mainstream maturity.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1095317&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Fri, 04 Sep 2009 17:45:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1095317</guid>
</item>
<item>
 <title>The Dissolution of the Rich Internet Application (RIA) Market</title>
 <link>http://ajax.sys-con.com/node/1094479</link>
 <description>As the line between browser-based and desktop-based applications blurs, and as approaches for abstracting functionality and information from user interfaces develop, other markets will eventually merge with the currently separately identifiable RIA market. Furthermore, as the Internet continues to penetrate every aspect of our lives, both business and personal, the distinction between &quot;Internet application&quot; and &quot;application&quot; will disappear, rich or not.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1094479&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 03 Sep 2009 17:15:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1094479</guid>
</item>
<item>
 <title>Busy Status Indicator with JSF 2</title>
 <link>http://ajax.sys-con.com/node/1093191</link>
 <description>&lt;span class=&#039;print-link&#039;&gt;&lt;/span&gt;&lt;!--  | 0 --&gt;&lt;p&gt;
I&#039;ve had a few requests on how to write a busy status indicator - you know, the little spinning ball that&#039;s there while an Ajax call is active, and which goes away once the request is complete.  So, I spent about two hours today, and did just that - including putting it into a component so it&#039;s reusable.  As usual, it involved no Java, and only a minimal amount of JavaScript.
&lt;/p&gt;
&lt;p&gt;
First, I needed an animated gif for a spinning image - there were a number at &lt;a href=&quot;http://mentalized.net/activity-indicators&quot; title=&quot;http://mentalized.net/activity-indicators&quot;&gt;http://mentalized.net/activity-indicators&lt;/a&gt; - I just picked one.  They&#039;re all in the public domain, and there are other sites which offer similar animated gif spinners.
&lt;/p&gt;
&lt;p&gt;
After that, I tried to imagine what it would look like in the using page.  Something like this seemed appropriate:
&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
   1 &amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;
   2       xmlns:ui=&amp;quot;http://java.sun.com/jsf/facelets&amp;quot;
   3       xmlns:h=&amp;quot;http://java.sun.com/jsf/html&amp;quot;
   4       xmlns:f=&amp;quot;http://java.sun.com/jsf/core&amp;quot;
   5       xmlns:ez=&amp;quot;http://java.sun.com/jsf/composite/busystatus&amp;quot;&amp;gt;
   6 &amp;lt;h:head&amp;gt;
   7     &amp;lt;title&amp;gt;Busy Busy&amp;lt;/title&amp;gt;
   8 &amp;lt;/h:head&amp;gt;
   9 &amp;lt;h:body&amp;gt;
  10     &amp;lt;h:form id=&amp;quot;busyForm&amp;quot;&amp;gt;
  11         &amp;lt;h:inputText id=&amp;quot;in&amp;quot; value=&amp;quot;#{string.string}&amp;quot;&amp;gt;
  12             &amp;lt;f:ajax render=&amp;quot;out&amp;quot;/&amp;gt;
  13         &amp;lt;/h:inputText&amp;gt;&lt;b&gt;&amp;lt;ez:busystatus id=&amp;quot;busy&amp;quot; for=&amp;quot;busyForm:in&amp;quot; /&amp;gt;&lt;/b&gt;&amp;lt;br/&amp;gt;
  14         &amp;lt;h:outputText id=&amp;quot;out&amp;quot; value=&amp;quot;#{string.string}&amp;quot;/&amp;gt;&amp;lt;br/&amp;gt;
  15         &amp;lt;h:commandButton type=&amp;quot;button&amp;quot; value=&amp;quot;Click Me&amp;quot;/&amp;gt;
  16     &amp;lt;/h:form&amp;gt;
  17 &amp;lt;/h:body&amp;gt;
  18 &amp;lt;/html&amp;gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
On line 13, you see a  component, busystatus, with a single attribute, &quot;for&quot;, which is pointing at the rendered ID of the component I want to monitor.  Otherwise, it&#039;s a straightforward JSF Ajax app - Ajaxify the &quot;in&quot; component, write to the the &quot;out&quot; component.  I had to use the rendered ID (busyForm:in) rather than the JSF id (in), because there was no easy way to do ID resolution inside the component, but we&#039;ve had to deal with that often enough at this point that the difference shouldn&#039;t be too confusing.
&lt;/p&gt;
&lt;p&gt;
We&#039;ll also have make sure that the Ajax request lasts long enough to visibly trigger the indicator - that&#039;s as simple as adding a &lt;code&gt;Thread.sleep(2000);&lt;/code&gt; to the setString method of the bean referenced by #{string}.
&lt;/p&gt;
&lt;p&gt;
With that out of the way, let&#039;s write the component.  Here&#039;s the composite component implementation section (the interface section just refers to the &quot;for&quot; attribute, so there&#039;s nothing to see there):
&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
   1 &amp;lt;h:outputScript name=&amp;quot;jsf.js&amp;quot; library=&amp;quot;javax.faces&amp;quot; target=&amp;quot;head&amp;quot;/&amp;gt;
   2 &amp;lt;h:outputScript name=&amp;quot;busystatus/busystatus.js&amp;quot; target=&amp;quot;head&amp;quot;/&amp;gt;
   3 &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
   4     busystatusdemo.init(&amp;quot;#{cc.clientId}&amp;quot;, &amp;quot;#{cc.attrs.for}&amp;quot;);
   5 &amp;lt;/script&amp;gt;
   6 &amp;lt;span id=&amp;quot;#{cc.clientId}&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;
   7    &amp;lt;h:graphicImage id=&amp;quot;busyindicator&amp;quot; height=&amp;quot;15&amp;quot; width=&amp;quot;15&amp;quot; name=&amp;quot;busystatus/spinner3-greenie.gif&amp;quot;/&amp;gt;
   8 &amp;lt;/span&amp;gt;
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
Line 1 loads the jsf.js library, if necessary.  We&#039;ll need it in the next file for listening to events - note that it&#039;ll get loaded anyway, from any f:ajax tag we use, but it&#039;s good practice to make sure that it&#039;s loaded before we try to reference it.  Line 2 will load the JavaScript we&#039;ve written for this component.  We could have just put the script inline in the composite component itself, but then we&#039;d bloat the size of the page unnecessarily if we used this component more than once in the page.  What works best for performance is going to vary on case by case basis, but since we&#039;re trying to create a generally reusable component, this is probably the best way to do it.  Lines 3 thru 5 call the init function for this component, which we&#039;ll use to associate the component ID with the for attribute:  this is the same trick we use for almost every Ajax component on this blog, so again, this shouldn&#039;t be surprising.
Lines 6 thru 8 define a span wrapping an image.  The span is initially set to be invisible with a style attribute, and we&#039;ll make it visible via JavaScript calls once the ajax request is active.  The image itself is loading the spinning animated gif as a resource - and it&#039;s in the same resource library as the component itself.
&lt;p&gt;
So, to recap what&#039;s happening in this file: We load the required scripts, run an initialization function, and set up an invisible span holding the image we&#039;ll display later.  Now, let&#039;s examine the last file for this component, the busystatus.js file that holds the functions that&#039;ll be doing all the work on the page:
&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
   1 if (!window[&amp;quot;busystatusdemo&amp;quot;]) {
   2     var busystatusdemo = {};
   3 }
   4 busystatusdemo.onStatusChange = function onStatusChange(data) {
   5     var status = data.status;
   6     var componentID = busystatusdemo[data.source.id];
   7     if (!componentID) {  // if there&#039;s no request to listen for this one component, then leave
   8         return;
   9     }
  10     var element = document.getElementById(componentID);
  11     if (status === &amp;quot;begin&amp;quot;) { // turn on busy indicator
  12         element.style.display = &amp;quot;inline&amp;quot;;
  13     } else {  // turn off busy indicator, on either &amp;quot;complete&amp;quot; or &amp;quot;success&amp;quot;
  14         element.style.display = &amp;quot;none&amp;quot;;
  15     }
  16 };
  17 
  18 jsf.ajax.addOnEvent(busystatusdemo.onStatusChange);
  19 
  20 busystatusdemo.init =  function init(componentID, forValue) {
  21     busystatusdemo[forValue] = componentID;
  22 };
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
Three sections here:  Lines 1 thru 3 set up the namespace.  Lines 20 thru 22 are the initialization function that creates a map between the component and the for attribute.  Let&#039;s go over lines 4 thru 18, though, since that&#039;s doing the interesting bit...
&lt;/p&gt;&lt;p&gt;
On line 18, we&#039;re adding an event listener - after this call, whenever an event occurs, the onStatusChange function will be called with a single parameter.  When that function is called, on lines 6 thru 10, we retrieve the id of the component that generated the event, and use it to look up the associated &quot;for&quot; value, and exit the function if there&#039;s no associated &quot;for&quot; value.  Then, lines 11 thru 15, we check whether we&#039;re beginning the Ajax call, or ending it.  If beginning, we display the gif - if ending, we hide the gif.
&lt;/p&gt;
So, that&#039;s our very simple busy component.  But please note that this isn&#039;t really done.  For instance, by revealing and hiding the gif, we&#039;re actually altering the layout of the page - there&#039;s traditionally two different ways to deal with this:  you can either swap between the animated gif and a blank, transparent gif of the same size, or use CSS to hardcode in the size of a span, which wraps the component that&#039;s having it&#039;s display set to none.   Either would work, and both are really out of scope for this blog - my only goal for this blog was to just show you how to use the event to trigger changes that updated a status indicator.  
&lt;p&gt;
As usual, you can find the code for this blog in the &lt;a href=&quot;https://javaserverfaces.dev.java.net/&quot;&gt;Project Mojarra&lt;/a&gt; codebase, under the jsf-demo/ajax-components directory.
&lt;/p&gt;
&lt;p&gt;
Questions?  Please ask in the comments section, and I&#039;ll do my best to answer them.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1093191&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 03 Sep 2009 06:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1093191</guid>
</item>
<item>
 <title>One-Way SSL with JAX-WS Using JDeveloper 11gR1 and WLS 10.3.1</title>
 <link>http://ajax.sys-con.com/node/1075471</link>
 <description>A while back Gerard Davison blogged some simple examples of using &lt;a href=&quot;http://kingsfleet.blogspot.com/2009/01/security-policy-worked-example.html&quot;&gt;WS-Security Policies&lt;/a&gt;.  Gerard&#039;s specific example dealt with the WLS policy Wssp1.2-2007-Wss1.1-UsernameToken-Plain-X509-Basic256.xml.  As Gerard notes the said policy (further documented in the WLS 10.3.1 doco &lt;a href=&quot;http://download.oracle.com/docs/cd/E12839_01/web.1111/e13713/message.htm#i210119&quot;&gt;here&lt;/a&gt;) implements user name tokens, encryption of the tokens and signing of the whole SOAP payload.&lt;br /&gt;&lt;br /&gt;The following post strips back Gerard&#039;s example to instead to consider the steps in setting up and testing One-Way SSL for a JAX-WS web service generated via JDeveloper 11gR1 and installed in WLS 10.3.1, using the WLS policy Wssp1.2-2007-Https.xml.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Assumptions&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;This article assumes the reader has the following basic knowledge:&lt;br /&gt;&lt;br /&gt;* HTTPS/SSL&lt;br /&gt;* Digital certificates and trusted/certificate authorities (CAs)&lt;br /&gt;* Oracle&#039;s WebLogic Server, WLS managed servers and the WLS console&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;One-Way SSL vs Two-Way SSL&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;For those not familiar with either, Oracle&#039;s WLS documentation has a good explanation of the implementation of and differences between One-Way SSL and Two-Way SSL in the &lt;a href=&quot;http://download.oracle.com/docs/cd/E12839_01/web.1111/e13710/concepts.htm#i1122990&quot;&gt;Understanding Security for Oracle WebLogic Server&lt;/a&gt; manual.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Steps&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To implement a One-Way SSL example we&#039;ll run through the following steps:&lt;br /&gt;&lt;br /&gt;1) Create a basic JAX-WS web service with JDeveloper 11gR1&lt;br /&gt;2) Generate the digital certificates required for the WLS server&lt;br /&gt;3) Modify the web service to use the Wssp1.2-2007-Https.xml WLS policy&lt;br /&gt;4) Deploy the running web service to WLS&lt;br /&gt;5) Test the running web service via JDeveloper&#039;s HTTP Analyzer&lt;br /&gt;6) Test the running web service via SoapUI&lt;br /&gt;7) Test the running web service via a JAX-WS client&lt;br /&gt;8) Inspect the web service packets on the wire to verify the traffic is indeed encrypted&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;1) Create a basic JAX-WS web service with JDeveloper 11gR1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This step is documented in a previous &lt;a href=&quot;http://one-size-doesnt-fit-all.blogspot.com/2008/11/creating-jax-ws-web-services-via-wsdl.html&quot;&gt;blog&lt;/a&gt; post Creating JAX-WS web services via a WSDL in JDev 11g.  There are also a number of viewlet demonstrations available from Oracle&#039;s &lt;a href=&quot;http://www.oracle.com/technology/products/jdev/viewlets/11/index.html&quot;&gt;OTN&lt;/a&gt; which show how to construct the WSDL in a drag&#039;n&#039;drop fashion. &lt;br /&gt;&lt;br /&gt;The resulting web service we&#039;ll demonstrate here is a very simple one.  It is comprised of the following solutions:&lt;br /&gt;&lt;br /&gt;OneWaySSLExample.xsd&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;?xml version=&quot;1.0&quot; encoding=&quot;windows-1252&quot; ?&gt;&lt;br /&gt;&lt;xsd:schema xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns=&quot;http://www.sagecomputing.com.au&quot;&lt;br /&gt;            targetNamespace=&quot;http://www.sagecomputing.com.au&quot; elementFormDefault=&quot;qualified&quot;&gt;&lt;br /&gt;  &lt;xsd:element name=&quot;inputElement&quot; type=&quot;xsd:string&quot;/&gt;&lt;br /&gt;  &lt;xsd:element name=&quot;outputElement&quot; type=&quot;xsd:string&quot;/&gt;&lt;br /&gt;&lt;/xsd:schema&gt;&lt;/pre&gt;The inputElement and the outputElement will constitute the incoming and outgoing payloads of a simple HelloWorld web service.&lt;br /&gt;&lt;br /&gt;OneWaySSLExample.wsdl&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;&lt;br /&gt;&lt;definitions targetNamespace=&quot;urn:OneWaySSLExample.wsdl&quot; xmlns=&quot;http://schemas.xmlsoap.org/wsdl/&quot;&lt;br /&gt;             xmlns:tns=&quot;urn:OneWaySSLExample.wsdl&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot;&lt;br /&gt;             xmlns:soap=&quot;http://schemas.xmlsoap.org/wsdl/soap/&quot; xmlns:mime=&quot;http://schemas.xmlsoap.org/wsdl/mime/&quot;&lt;br /&gt;             xmlns:soap12=&quot;http://schemas.xmlsoap.org/wsdl/soap12/&quot; xmlns:wsca=&quot;http://www.sagecomputing.com.au&quot;&gt;&lt;br /&gt;  &lt;types&gt;&lt;br /&gt;    &lt;xsd:schema&gt;&lt;br /&gt;      &lt;xsd:import schemaLocation=&quot;../xsd/OneWaySSLExample.xsd&quot; namespace=&quot;http://www.sagecomputing.com.au&quot;/&gt;&lt;br /&gt;    &lt;/xsd:schema&gt;&lt;br /&gt;  &lt;/types&gt;&lt;br /&gt;  &lt;message name=&quot;InputMessage&quot;&gt;&lt;br /&gt;    &lt;part name=&quot;part&quot; element=&quot;wsca:inputElement&quot;/&gt;&lt;br /&gt;  &lt;/message&gt;&lt;br /&gt;  &lt;message name=&quot;OutputMessage&quot;&gt;&lt;br /&gt;    &lt;part name=&quot;part&quot; element=&quot;wsca:outputElement&quot;/&gt;&lt;br /&gt;  &lt;/message&gt;&lt;br /&gt;  &lt;portType name=&quot;OneWaySSLPortType&quot;&gt;&lt;br /&gt;    &lt;operation name=&quot;OneWaySSLOperation&quot;&gt;&lt;br /&gt;      &lt;input message=&quot;tns:InputMessage&quot;/&gt;&lt;br /&gt;      &lt;output message=&quot;tns:OutputMessage&quot;/&gt;&lt;br /&gt;    &lt;/operation&gt;&lt;br /&gt;  &lt;/portType&gt;&lt;br /&gt;  &lt;binding name=&quot;OneWaySSLBinding&quot; type=&quot;tns:OneWaySSLPortType&quot;&gt;&lt;br /&gt;    &lt;soap12:binding style=&quot;document&quot; transport=&quot;http://schemas.xmlsoap.org/soap/http&quot;/&gt;&lt;br /&gt;    &lt;operation name=&quot;OneWaySSLOperation&quot;&gt;&lt;br /&gt;      &lt;soap12:operation style=&quot;document&quot; soapAction=&quot;urn:OneWaySSLExample.wsdl/OneWaySSLOperation&quot;/&gt;&lt;br /&gt;      &lt;input&gt;&lt;br /&gt;        &lt;soap12:body use=&quot;literal&quot; parts=&quot;part&quot;/&gt;&lt;br /&gt;      &lt;/input&gt;&lt;br /&gt;      &lt;output&gt;&lt;br /&gt;        &lt;soap12:body use=&quot;literal&quot; parts=&quot;part&quot;/&gt;&lt;br /&gt;      &lt;/output&gt;&lt;br /&gt;    &lt;/operation&gt;&lt;br /&gt;  &lt;/binding&gt;&lt;br /&gt;  &lt;service name=&quot;OneWaySSLService&quot;&gt;&lt;br /&gt;    &lt;port name=&quot;OneWaySSLPortTypePort&quot; binding=&quot;tns:OneWaySSLBinding&quot;&gt;&lt;br /&gt;      &lt;soap12:address location=&quot;http://www.sagecomputing.com.au &quot;/&gt;&lt;br /&gt;    &lt;/port&gt;&lt;br /&gt;  &lt;/service&gt;&lt;br /&gt;&lt;/definitions&gt;&lt;/pre&gt;&lt;br /&gt;The overall web service comprises of a single operation accepting the inputElement and outputElement strings as specified in the XSD.&lt;br /&gt;&lt;br /&gt;OneWaySSLPortTypeImpl.java&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;package au.com.sagecomputing.ws;&lt;br /&gt;&lt;br /&gt;import javax.jws.WebService;&lt;br /&gt;&lt;br /&gt;import javax.xml.ws.BindingType;&lt;br /&gt;import javax.xml.ws.soap.SOAPBinding;&lt;br /&gt;&lt;br /&gt;@WebService(serviceName = &quot;OneWaySSLService&quot;,&lt;br /&gt;            targetNamespace = &quot;urn:OneWaySSLExample.wsdl&quot;,&lt;br /&gt;            portName = &quot;OneWaySSLPortTypePort&quot;,&lt;br /&gt;            endpointInterface = &quot;au.com.sagecomputing.ws.OneWaySSLPortType&quot;,&lt;br /&gt;            wsdlLocation = &quot;/WEB-INF/wsdl/OneWaySSLExample.wsdl&quot;)&lt;br /&gt;@BindingType(SOAPBinding.SOAP12HTTP_BINDING)&lt;br /&gt;public class OneWaySSLPortTypeImpl {&lt;br /&gt;&lt;br /&gt;  public String oneWaySSLOperation(String part) {&lt;br /&gt;    return &quot;Hello &quot; + part;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;A very basic JAX-WS web service accepting the inputElement String and returning the outputElement String prefixed with &quot;Hello &quot;.&lt;br /&gt;&lt;br /&gt;Example request SOAP payload&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;env:Envelope xmlns:env=&quot;http://www.w3.org/2003/05/soap-envelope&quot; xmlns:ns1=&quot;http://www.sagecomputing.com.au&quot;&gt;&lt;br /&gt;   &lt;env:Header/&gt;&lt;br /&gt;   &lt;env:Body&gt;&lt;br /&gt;      &lt;ns1:inputElement&gt;Chris&lt;/ns1:inputElement&gt;&lt;br /&gt;   &lt;/env:Body&gt;&lt;br /&gt;&lt;/env:Envelope&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Example response SOAP payload&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;?xml version = &#039;1.0&#039; encoding = &#039;UTF-8&#039;?&gt;&lt;br /&gt;&lt;S:Envelope xmlns:S=&quot;http://www.w3.org/2003/05/soap-envelope&quot;&gt;&lt;br /&gt;   &lt;S:Body&gt;&lt;br /&gt;      &lt;outputElement xmlns=&quot;http://www.sagecomputing.com.au&quot;&gt;Hello Chris&lt;/outputElement&gt;&lt;br /&gt;   &lt;/S:Body&gt;&lt;br /&gt;&lt;/S:Envelope&gt;&lt;/pre&gt;The overall application/project structure will look as follows in JDeveloper&#039;s Application Navigator:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_5hhNK2aXwp8/Sn-tOW0MlyI/AAAAAAAAAz0/Yh6wVO5dzNI/s1600-h/sslExamplePic0.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 254px; height: 400px;&quot; src=&quot;http://3.bp.blogspot.com/_5hhNK2aXwp8/Sn-tOW0MlyI/AAAAAAAAAz0/Yh6wVO5dzNI/s400/sslExamplePic0.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5368199743003203362&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;2) Generate the digital certificates required for the WLS server&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In order for a client to undertake a SSL connection with our web service on the WLS server, the WLS server must be configured with a valid digital certificate.  &lt;br /&gt;&lt;br /&gt;Again note from the Oracle &lt;a href=&quot;http://download.oracle.com/docs/cd/E12839_01/web.1111/e13710/concepts.htm#i1122990&quot;&gt;documentation&lt;/a&gt; how One-Way SSL works at runtime:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;With one-way SSL authentication, the target (the server) is required to present a digital certificate to the initiator (the client) to prove its identity. The client performs two checks to validate the digital certificate:&lt;br /&gt;&lt;br /&gt;1. The client verifies that the certificate is trusted (meaning, it was issued by the client&#039;s trusted CA), is valid (not expired), and satisfies the other certificate constraints.&lt;br /&gt;2. The client checks that the certificate Subject&#039;s common name (CN) field value matches the host name of the server to which the client is trying to connect&lt;br /&gt;&lt;br /&gt;If both of the above checks return true, the SSL connection is established.&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;In this section we consider the digital certificates required for the WLS server.&lt;br /&gt;&lt;br /&gt;WLS is an interesting application server in that it keeps two separate Java keystores, 1 for storing the digital certificates for such actions as SSL, and another which is typically used for storing CA digital certificates.  The former is referred to as the identity keystore, the later the trust keystore.&lt;br /&gt;&lt;br /&gt;The WLS manual Securing Oracle WebLogic Server section 11 &lt;a href=&quot;http://download.oracle.com/docs/cd/E12839_01/web.1111/e13707/identity_trust.htm#i1202182&quot;&gt;Configuring Identity and Trust&lt;/a&gt; has a detailed explanation of this setup.&lt;br /&gt;&lt;br /&gt;By default WLS comes with demonstration identity and trust keystores containing demonstration digital certificates.  As the WLS documentation takes great pains to explain these are for development purposes only and should never be used in a production environment.  For the purposes of this blog post if you&#039;re testing One-Way SSL in a development environment you can in fact skip this entire step as the demonstration WLS keystores will suffice.&lt;br /&gt;&lt;br /&gt;To check that the demonstration keystores are currently installed login to your WLS console, select your server, and under the Configurations -&gt; Keystores tab you&#039;ll see the following entries:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_5hhNK2aXwp8/Sn-tO5JWl1I/AAAAAAAAAz8/bD2U_1xqnnA/s1600-h/sslExamplePic1.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 376px;&quot; src=&quot;http://3.bp.blogspot.com/_5hhNK2aXwp8/Sn-tO5JWl1I/AAAAAAAAAz8/bD2U_1xqnnA/s400/sslExamplePic1.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5368199752218744658&quot; /&gt;&lt;/a&gt;&lt;br /&gt;Your entries for the file locations of the keystore will be different from my example here dependent on where you installed WLS.&lt;br /&gt;&lt;br /&gt;However using the demonstration keystores avoids the whole learning exercise of configuring your own custom digital certificates in WLS which is an important lesson.  The following describes those steps in detail, as based off Gerard&#039;s original &lt;a href=&quot;http://kingsfleet.blogspot.com/2009/01/security-policy-worked-example.html&quot;&gt;post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;To install our own digital certificate we followed these general steps:&lt;br /&gt;&lt;br /&gt;a) Open a command prompt and set the WLS environment&lt;br /&gt;b) Generate our own trusted certificate authority digital certificate&lt;br /&gt;c) Store the private key and digital certificate and import into the identity keystore&lt;br /&gt;d) Store the same digital certificate into the trust keystore.&lt;br /&gt;e) Configure the new keystores in WLS&#039;s identity and trust keystore&lt;br /&gt;&lt;br /&gt;The following describes those steps in detail.  In order to do this we&#039;ve used WLS utilities to do as much of the work as possible.&lt;br /&gt;&lt;br /&gt;a) Open a command prompt and set the WLS environment&lt;br /&gt;&lt;br /&gt;Under Windows open a command prompt on the same machine as where WLS is installed, create a temporary directory in your favourite place and cd to that directory, and run your WLS server&#039;s setDomainEnv.cmd command.  Something like:&lt;br /&gt;&lt;br /&gt;&quot;C:\&lt;wls_home&gt;\setDomainEnv.cmd&quot;&lt;br /&gt;&lt;br /&gt;Once run ensure you&#039;re still in your new directory.&lt;br /&gt;&lt;br /&gt;b) Generate our own trusted certificate authority digital certificate&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;java utils.CertGen -certfile ServerCACert -keyfile ServerCAKey -keyfilepass ServerCAKey -selfsigned -e &lt;a href=&quot;mailto:somebody@xxxx.com.au&quot;&gt;somebody@xxxx.com.au&lt;/a&gt; -ou FOR-DEVELOPMENT-ONLY -o XXXX -l PERTH -s WA -c AU&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This generates 4 files: ServerCACert.der, ServerCACert.pem, ServerCAKey.der, ServerCAKey.pem&lt;br /&gt;&lt;br /&gt;The utils.CertGen utility is useful for development purposes, but as per the WLS documentation, should not be used for production purposes.  Alternatively &lt;a href=&quot;http://www.openssl.org&quot;&gt;OpenSSL&lt;/a&gt; could be used instead.&lt;br /&gt;&lt;br /&gt;Note the use of selfsigned flag.  This implies this digital certificate will be used both as the CA in the trust keystore and the served digital certificate in the identity keystore.  This is not what we&#039;d do for a production environment using commercial Certificate Authorities, but is sufficient for demonstration purposes in this post.&lt;br /&gt;&lt;br /&gt;More information on:&lt;br /&gt;&lt;br /&gt;* the WLS CertGen utility can be found &lt;a href=&quot;http://download.oracle.com/docs/cd/E12839_01/web.1111/e13749/utils.htm#i1198919&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;* .der vs .pem files can be found &lt;a href=&quot;http://download.oracle.com/docs/cd/E12839_01/web.1111/e13707/identity_trust.htm#i1196582&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;http://e-docs.bea.com/wls/docs92/secmanage/identity_trust.html#wp1195506&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;* WLS provides two utilities &lt;a href=&quot;http://download.oracle.com/docs/cd/E12839_01/web.1111/e13749/utils.htm#i1218395&quot;&gt;der2pem&lt;/a&gt; and &lt;a href=&quot;http://download.oracle.com/docs/cd/E12839_01/web.1111/e13749/utils.htm#i1185185&quot;&gt;pem2der&lt;/a&gt; can be used to convert between the two file types.&lt;br /&gt;&lt;br /&gt;Under Windows you can double click on the ServerCACert.der file to show its contents:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sn-tPTY5fuI/AAAAAAAAA0E/C8rY0ol90MA/s1600-h/sslExamplePic2.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 322px; height: 400px;&quot; src=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sn-tPTY5fuI/AAAAAAAAA0E/C8rY0ol90MA/s400/sslExamplePic2.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5368199759263268578&quot; /&gt;&lt;/a&gt;&lt;br /&gt;If you have access to the openSSL command line tool you can use it to query the certificate we just created:&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;openssl x509 -text -inform der -in ServerCACert.der&lt;br /&gt;&lt;br /&gt;Certificate:&lt;br /&gt;    Data:&lt;br /&gt;        Version: 3 (0x2)&lt;br /&gt;        Serial Number:&lt;br /&gt;            0d:a9:d1:4a:0f:0b:b2:61:13:90:89:f5:40:4d:4f:e2&lt;br /&gt;        Signature Algorithm: md5WithRSAEncryption&lt;br /&gt;        Issuer: C=AU, ST=WA, L=PERTH, O=SAGECOMPUTING, OU=FOR-DEVELOPMENT-ONLY, CN=&lt;hostname obscured - CM&gt;/emailAddress=somebody@sagecomputing.com.au&lt;br /&gt;        Validity&lt;br /&gt;            Not Before: Jul  9 07:06:49 2009 GMT&lt;br /&gt;            Not After : Jul 10 07:06:49 2029 GMT&lt;br /&gt;        Subject: C=AU, ST=WA, L=PERTH, O=SAGECOMPUTING, OU=FOR-DEVELOPMENT-ONLY, CN=&lt;hostname obscured - CM&gt;/emailAddress=somebody@sagecomputing.com.au&lt;br /&gt;        Subject Public Key Info:&lt;br /&gt;            Public Key Algorithm: rsaEncryption&lt;br /&gt;            RSA Public Key: (1024 bit)&lt;br /&gt;                Modulus (1024 bit):&lt;br /&gt;                    00:df:cb:6c:ed:86:75:4c:5b:66:cd:aa:3d:34:8f:&lt;br /&gt;                    &lt;snip&gt;&lt;br /&gt;                    73:f6:9c:b5:ed:82:9c:c3:15&lt;br /&gt;                Exponent: 65537 (0x10001)&lt;br /&gt;        X509v3 extensions:&lt;br /&gt;            X509v3 Key Usage: critical&lt;br /&gt;                Certificate Sign&lt;br /&gt;            X509v3 Basic Constraints: critical&lt;br /&gt;                CA:TRUE, pathlen:1&lt;br /&gt;    Signature Algorithm: md5WithRSAEncryption&lt;br /&gt;        b7:fa:1b:8f:c4:ee:af:6b:1d:f0:dc:f4:cf:35:20:f1:df:eb:&lt;br /&gt;        &lt;snip&gt;&lt;br /&gt;        0c:fe&lt;br /&gt;-----BEGIN CERTIFICATE-----&lt;br /&gt;MIIC8zCCAlygAwIBAgIQDanRSg8LsmETkIn1QE1P4jANBgkqhkiG9w0BAQQFADCB&lt;br /&gt;&lt;snip&gt;&lt;br /&gt;i7Pd63d03mWkI85tvsr5Q+40yitOL5JnLsbyHSrM+1aK8kkY7Qz+&lt;br /&gt;-----END CERTIFICATE-----&lt;br /&gt;&lt;snip&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This identifies information that maybe useful later if we make a mistake, such as the encryption algorithm used (RSA), the size of the keys (1024bit), the serial number of the certificate (a hex number).&lt;br /&gt;&lt;br /&gt;c) Store the private key and the digital certificate in the identity keystore&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;java utils.ImportPrivateKey -certfile ServerCACert.der -keyfile ServerCAKey.der -keyfilepass ServerCAKey -keystore ServerIdentity.jks -storepass ServerCAKey -alias identity -keypass ServerCAKey&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;d) Store the same digital certificate into the trust keystore&lt;br /&gt;Import the certificate generated in step b into a trust keystore.&lt;br /&gt;&lt;br /&gt;&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;keytool -import -v -trustcacerts -alias identity -file ServerCACert.der -keystore ServerTrust.jks -storepass ServerTrustStorePass&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;e) Configure the new keystores in WLS&#039;s identity and trust keystore&lt;br /&gt;&lt;br /&gt;To configure the keystores in WLS enter the WLS console, select the managed server you&#039;re interested in, then make the following changes under the following tabs:&lt;br /&gt;&lt;br /&gt;Configuration tab -&gt; General subtab&lt;br /&gt;&lt;br /&gt;SSL Listed Port Enabled = checkbox&lt;br /&gt;SSL Listen Port = 7102 (and different from the Listen Port)&lt;br /&gt;&lt;br /&gt;Configuration tab -&gt; Keystores subtab&lt;br /&gt;&lt;br /&gt;Keystores = Custom Identity and Custom Trust&lt;br /&gt;Custom Identity Keystore = &lt;path&gt;\ServerIdentity.jks, such as c:\temp\ServerIdentity.jks&lt;br /&gt;Custom Identity Keystore Type = jks&lt;br /&gt;Custom Identity Keystore Passphrase = ServerCAKey&lt;br /&gt;Confirm Custom Identity Keystore Passphrase = ServerCAKey&lt;br /&gt;&lt;br /&gt;Custom Trust Keystore = &lt;path&gt;\ServerTrust.jks, such as c:\temp\ServerTrust.jks&lt;br /&gt;Custom Trust Keystore Type = jks&lt;br /&gt;Custom Trust Keystore Passphrase = ServerTrustStorePass&lt;br /&gt;Confirm Custom Trust Keystore Passphrase = ServerTrustStorePass&lt;br /&gt;&lt;br /&gt;Configuration tab -&gt; SSL subtab&lt;br /&gt;&lt;br /&gt;Identify and Trust Locations = Keystores&lt;br /&gt;Private key alias = identity&lt;br /&gt;Private Key Passphrase = ServerCAKey&lt;br /&gt;Confirm Private Key Passphrase = ServerCAKey&lt;br /&gt;&lt;br /&gt;Then save.&lt;br /&gt;&lt;br /&gt;After this restart your WLS server and you should see similar messages to the following in the WLS logs:&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;Jul 14, 2009 2:12:03 PM GMT+05:30&gt; &lt;Notice&gt; &lt;Security&gt; &lt;BEA-090171&gt; &lt;Loading the identity certificate and private key stored under the alias identity from the JKS keystore file C:\Temp\Server Identity.jks.&gt;&lt;br /&gt;&lt;Jul 14, 2009 2:12:03 PM GMT+05:30&gt; &lt;Notice&gt; &lt;Security&gt; &lt;BEA-090169&gt; &lt;Loading trusted certificates from the JKS keystore file C:\Temp\ServerTrust.jks.&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Alternatively is you see the following messages you have made a mistake in your configuration:&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;10/07/2009 4:08:30 PM WST&gt; &lt;Notice&gt; &lt;Security&gt; &lt;BEA-090171&gt; &lt;Loading the identity certificate and private key stored under the alias identity from the jks keystore file c:\temp\ServerIdentity.jks.&gt; &lt;br /&gt;&lt;10/07/2009 4:08:30 PM WST&gt; &lt;Notice&gt; &lt;Security&gt; &lt;BEA-090169&gt; &lt;Loading trusted certificates from the jks keystore file c:\temp\ServerTrust.jks.&gt; &lt;br /&gt;&lt;10/07/2009 4:08:30 PM WST&gt; &lt;Warning&gt; &lt;Security&gt; &lt;BEA-090172&gt; &lt;No trusted certificates have been loaded. Server will not trust to any certificate it receives.&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;3) Modify the web service to use the Wssp1.2-2007-Https.xml WLS policy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This can be done in a number of ways in JDeveloper, the easiest of which for this blog post at least is just to insert the @Policy annotation into the JAX-WS endpoint as follows:&lt;br /&gt;&lt;br /&gt;(Note if you&#039;re using earlier versions of JDeveloper or Eclipse, this mechanism wont work, you must manually add the policies to the WSDL).&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;package au.com.sagecomputing.ws;&lt;br /&gt;&lt;br /&gt;import javax.jws.WebService;&lt;br /&gt;&lt;br /&gt;import javax.xml.ws.BindingType;&lt;br /&gt;import javax.xml.ws.soap.SOAPBinding;&lt;br /&gt;&lt;br /&gt;import weblogic.jws.Policy;&lt;br /&gt;&lt;br /&gt;@WebService(serviceName = &quot;OneWaySSLService&quot;,&lt;br /&gt;            targetNamespace = &quot;urn:OneWaySSLExample.wsdl&quot;,&lt;br /&gt;            portName = &quot;OneWaySSLPortTypePort&quot;,&lt;br /&gt;            endpointInterface = &quot;au.com.sagecomputing.ws.OneWaySSLPortType&quot;,&lt;br /&gt;            wsdlLocation = &quot;/WEB-INF/wsdl/OneWaySSLExample.wsdl&quot;)&lt;br /&gt;@BindingType(SOAPBinding.SOAP12HTTP_BINDING)&lt;br /&gt;@Policy(uri = &quot;policy:Wssp1.2-2007-Https.xml&quot;) &lt;br /&gt;public class OneWaySSLPortTypeImpl {&lt;br /&gt;&lt;br /&gt;  public String oneWaySSLOperation(String part) {&lt;br /&gt;    return &quot;Hello &quot; + part;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;4) Deploy the running web service to WLS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Within JDeveloper to deploy and run from the integrated WLS, it&#039;s simply a case of right clicking on the JAX-WS file and selecting Run.&lt;br /&gt;&lt;br /&gt;If you click on the hyperlink provided in the log window, this will open the HTTP Analyzer.  From the HTTP Analyzer you can open the WSDL at the top of the window:&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;?xml version=&#039;1.0&#039; encoding=&#039;UTF-8&#039;?&gt;&lt;!-- Published by JAX-WS RI at &lt;a href=&quot;http://jax-ws.dev.java.net&quot; title=&quot;http://jax-ws.dev.java.net&quot;&gt;http://jax-ws.dev.java.net&lt;/a&gt;. RI&#039;s version is Oracle JAX-WS 2.1.4. --&gt;&lt;definitions xmlns=&quot;http://schemas.xmlsoap.org/wsdl/&quot; xmlns:tns=&quot;urn:OneWaySSLExample.wsdl&quot; xmlns:xsd=&quot;http://www.w3.org/2001/XMLSchema&quot; xmlns:soap=&quot;http://schemas.xmlsoap.org/wsdl/soap/&quot; xmlns:mime=&quot;http://schemas.xmlsoap.org/wsdl/mime/&quot; xmlns:soap12=&quot;http://schemas.xmlsoap.org/wsdl/soap12/&quot; xmlns:wsca=&quot;http://www.sagecomputing.com.au&quot; targetNamespace=&quot;urn:OneWaySSLExample.wsdl&quot; xmlns:wsp=&quot;http://schemas.xmlsoap.org/ws/2004/09/policy&quot; xmlns:wssutil=&quot;http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd&quot;&gt;&lt;wsp:UsingPolicy wssutil:Required=&quot;true&quot; /&gt;&lt;wsp:Policy wssutil:Id=&quot;Wssp1.2-2007-Https.xml&quot;&gt;&lt;ns0:TransportBinding xmlns:ns0=&quot;http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702&quot;&gt;&lt;wsp:Policy&gt;&lt;ns0:TransportToken&gt;&lt;wsp:Policy&gt;&lt;ns0:HttpsToken /&gt;&lt;/wsp:Policy&gt;&lt;/ns0:TransportToken&gt;&lt;ns0:AlgorithmSuite&gt;&lt;wsp:Policy&gt;&lt;ns0:Basic256 /&gt;&lt;/wsp:Policy&gt;&lt;/ns0:AlgorithmSuite&gt;&lt;ns0:Layout&gt;&lt;wsp:Policy&gt;&lt;ns0:Lax /&gt;&lt;/wsp:Policy&gt;&lt;/ns0:Layout&gt;&lt;ns0:IncludeTimestamp /&gt;&lt;/wsp:Policy&gt;&lt;/ns0:TransportBinding&gt;&lt;/wsp:Policy&gt;&lt;br /&gt;  &lt;types&gt;&lt;br /&gt;    &lt;xsd:schema&gt;&lt;br /&gt;      &lt;xsd:import schemaLocation=&quot;http://localhost:7101/WebServiceSSLExamples-OneWaySSLExample-context-root/OneWaySSLPortTypePort?xsd=1&quot; namespace=&quot;http://www.sagecomputing.com.au&quot; /&gt;&lt;br /&gt;    &lt;/xsd:schema&gt;&lt;br /&gt;  &lt;/types&gt;&lt;br /&gt;  &lt;message name=&quot;InputMessage&quot;&gt;&lt;br /&gt;    &lt;part name=&quot;part&quot; element=&quot;wsca:inputElement&quot; /&gt;&lt;br /&gt;  &lt;/message&gt;&lt;br /&gt;  &lt;message name=&quot;OutputMessage&quot;&gt;&lt;br /&gt;    &lt;part name=&quot;part&quot; element=&quot;wsca:outputElement&quot; /&gt;&lt;br /&gt;  &lt;/message&gt;&lt;br /&gt;  &lt;portType name=&quot;OneWaySSLPortType&quot;&gt;&lt;br /&gt;    &lt;operation name=&quot;OneWaySSLOperation&quot;&gt;&lt;br /&gt;      &lt;input message=&quot;tns:InputMessage&quot; /&gt;&lt;br /&gt;      &lt;output message=&quot;tns:OutputMessage&quot; /&gt;&lt;br /&gt;    &lt;/operation&gt;&lt;br /&gt;  &lt;/portType&gt;&lt;br /&gt;  &lt;binding name=&quot;OneWaySSLBinding&quot; type=&quot;tns:OneWaySSLPortType&quot;&gt;&lt;wsp:PolicyReference URI=&quot;#Wssp1.2-2007-Https.xml&quot; /&gt;&lt;br /&gt;    &lt;soap12:binding style=&quot;document&quot; transport=&quot;http://schemas.xmlsoap.org/soap/http&quot; /&gt;&lt;br /&gt;    &lt;operation name=&quot;OneWaySSLOperation&quot;&gt;&lt;br /&gt;      &lt;soap12:operation style=&quot;document&quot; soapAction=&quot;urn:OneWaySSLExample.wsdl/OneWaySSLOperation&quot; /&gt;&lt;br /&gt;      &lt;input&gt;&lt;br /&gt;        &lt;soap12:body use=&quot;literal&quot; parts=&quot;part&quot; /&gt;&lt;br /&gt;      &lt;/input&gt;&lt;br /&gt;      &lt;output&gt;&lt;br /&gt;        &lt;soap12:body use=&quot;literal&quot; parts=&quot;part&quot; /&gt;&lt;br /&gt;      &lt;/output&gt;&lt;br /&gt;    &lt;/operation&gt;&lt;br /&gt;  &lt;/binding&gt;&lt;br /&gt;  &lt;service name=&quot;OneWaySSLService&quot;&gt;&lt;br /&gt;    &lt;port name=&quot;OneWaySSLPortTypePort&quot; binding=&quot;tns:OneWaySSLBinding&quot;&gt;&lt;br /&gt;      &lt;soap12:address location=&quot;https://localhost:7102/WebServiceSSLExamples-OneWaySSLExample-context-root/OneWaySSLPortTypePort&quot; /&gt;&lt;br /&gt;    &lt;/port&gt;&lt;br /&gt;  &lt;/service&gt;&lt;br /&gt;&lt;/definitions&gt;&lt;/pre&gt;Note on deployment to WLS you can see that the Wssp1.2-2007-Https.xml policy has been added to the binding to enforce One-Way SSL, and in addition the service address now runs from HTTPS, not HTTP, on the now enabled SSL port.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;5) Test the running web service via JDeveloper&#039;s HTTP Analyzer&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;JDeveloper out of the box includes HTTP Analyzer for testing your web services.  It&#039;s particularly useful as you don&#039;t have to leave the confines of your IDE to test your web services.&lt;br /&gt;&lt;br /&gt;In order to run the HTTP Analyzer with SSL&#039;ed web service traffic, you need to make some changes to the configuration of JDeveloper.  Selecting the Tools-&gt;Preferences menu option, followed by Https and Truststore Settings, you can configure the Client and Server keystores HTTP Analyzer needs to run with SSL.&lt;br /&gt;&lt;br /&gt;If you followed my exact instructions on setting up a selfsigned CA into the WLS identity and trust keystores, you need to enter the following options in the Preferences Https and Trusting Settings page:&lt;br /&gt;&lt;br /&gt;Client Trusted Certificate Keystore: c:\temp\ServerTrust.jks&lt;br /&gt;Client Trusted Keystore Password: ServerTrustStorePass&lt;br /&gt;&lt;br /&gt;Server Keystore: c:\temp\ServerIdentity.jks&lt;br /&gt;Server Keystore Password: ServerCAKey&lt;br /&gt;Server Private Key Password: ServerCAKey&lt;br /&gt;&lt;br /&gt;When you run your web service you can access the HTTP Analyzer by clicking on the URL of your served web service in the JDev IDE log window, among other methods.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_5hhNK2aXwp8/Sn-tds-LA1I/AAAAAAAAA0c/SHX8Xt6G2Fg/s1600-h/sslExamplePic6.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 135px;&quot; src=&quot;http://3.bp.blogspot.com/_5hhNK2aXwp8/Sn-tds-LA1I/AAAAAAAAA0c/SHX8Xt6G2Fg/s400/sslExamplePic6.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5368200006648660818&quot; /&gt;&lt;/a&gt;&lt;br /&gt;This presents the following HTTP Analyzer screens:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://1.bp.blogspot.com/_5hhNK2aXwp8/Sn-tdyoISaI/AAAAAAAAA0k/XZECMIMtqAo/s1600-h/sslExamplePic7.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 318px;&quot; src=&quot;http://1.bp.blogspot.com/_5hhNK2aXwp8/Sn-tdyoISaI/AAAAAAAAA0k/XZECMIMtqAo/s400/sslExamplePic7.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5368200008166820258&quot; /&gt;&lt;/a&gt;&lt;br /&gt;In the top of the screen you&#039;ll see the HTTP Analyzer has formed a dummy request for you to send out based on the web service&#039;s WSDL.  In my example picture I&#039;ve filled out the part field and pressed Send Request, of which you can see the reply from the web service on the right hand side.&lt;br /&gt;&lt;br /&gt;At the bottom of the screen you can the individual request/responses that were generated in order to service the request.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;6) Test the running web service via SoapUI&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.soapui.org&quot;&gt;SoapUI&lt;/a&gt; is a popular web service testing tool.  I wanted to show how to configure it here to show similar results to the HTTP Analyzer.  The following steps were built with SoapUI v3.0.&lt;br /&gt;&lt;br /&gt;a) Create a new Project via File -&gt; New soapUI Project&lt;br /&gt;b) In the New SoapUI Project dialog, enter a custom project name, then your WSDL, leave the rest of the fields as default.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://1.bp.blogspot.com/_5hhNK2aXwp8/Sn-tPyT8L9I/AAAAAAAAA0M/02PavQnXVWk/s1600-h/sslExamplePic3.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 199px;&quot; src=&quot;http://1.bp.blogspot.com/_5hhNK2aXwp8/Sn-tPyT8L9I/AAAAAAAAA0M/02PavQnXVWk/s400/sslExamplePic3.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5368199767563972562&quot; /&gt;&lt;/a&gt;&lt;br /&gt;c) In the Project list expand your new project to the last Request 1 node, and double click it.&lt;br /&gt;d) This will open the Request 1 window, showing on the left handside the outgoing request payload, where you can modify the inputElement XML element with your name.&lt;br /&gt;e) Pressing the green arrow executes the request against the webservice, you&#039;ll now hopefully see the SOAP response on the right handside of the window.&lt;br /&gt;f) Note at the bottom right of the right handside of the window you have the text SSL Info.  Clicking on this shows another sub-window with the SSL certificate information that was swapped with the WLS server to undertake the SSL communications.&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sn-tdVNlc2I/AAAAAAAAA0U/mE_WmvxK4dY/s1600-h/sslExamplePic4.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 243px;&quot; src=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sn-tdVNlc2I/AAAAAAAAA0U/mE_WmvxK4dY/s400/sslExamplePic4.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5368200000270857058&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;7) Test the running web service via a JAX-WS client&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Assuming under JDeveloper you know how to create a Java Proxy for the deployed web service, you&#039;ll end up with the following code:&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;import clientexamples.SSLUtilities;&lt;br /&gt;&lt;br /&gt;import javax.xml.ws.WebServiceRef;&lt;br /&gt;&lt;br /&gt;public class OneWaySSLPortTypePortClient&lt;br /&gt;{&lt;br /&gt;  @WebServiceRef&lt;br /&gt;  private static OneWaySSLService oneWaySSLService;&lt;br /&gt;&lt;br /&gt;  public static void main(String [] args)&lt;br /&gt;  {&lt;br /&gt;    oneWaySSLService = new OneWaySSLService();&lt;br /&gt;    OneWaySSLPortType oneWaySSLPortType = oneWaySSLService.getOneWaySSLPortTypePort();&lt;br /&gt;&lt;br /&gt;    SSLUtilities.trustAllHttpsCertificates(); &lt;br /&gt;&lt;br /&gt;    System.out.println(oneWaySSLPortType.oneWaySSLOperation(&quot;Chris&quot;));&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;Note SSLUtilities is a handy class written by &lt;a href=&quot;http://schrepfler.blogspot.com/2009/06/relaxing-ssl-validation-for-jaxws.html&quot;&gt;Srgjan Srepfler&lt;/a&gt; that includes a number of methods for handling and modifying the default SSL behaviour.  In our case in writing a simple test client we&#039;re not overly concerned about trusting the server&#039;s CA, so we can use SSUtilities.trustAllHttpsCertificates to stop the required checking.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;8) Inspect the web service packets on the wire to verify the traffic is indeed encrypted&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;What neither JDeveloper&#039;s HTTP Analyzer nor SoapUI can do is actually confirm for you that the traffic on the network was actually encrypted. To check this we can use a wire sniffing tool called &lt;a href=&quot;http://www.wireshark.org/&quot;&gt;WireShark&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Warning: at some sites using wire sniffing tools like WireShark can be a dismissible offence because you can see private data on the network.  Be careful to check your organisation policies before doing this.&lt;br /&gt;&lt;br /&gt;Note if you&#039;re running the JAX-WS web services via the integrated WLS on the same localhost as SoapUI, you&#039;re most likely running through the localhost address.  For various technical reasons WireShark cannot sniff packets through localhost or the MS loopback adapter in Windows.  Instead we must separate our WLS and SoapUI installations, and place them on different hosts.  Let&#039;s call them Box1 and Box2, with WLS and SoapUI installed respectively&lt;br /&gt;&lt;br /&gt;Once you have both up and running, determine the IP address of Box2.  Let&#039;s say that IP address was: 101.102.103.104&lt;br /&gt;&lt;br /&gt;a) Start WireShark.  In the filter box top left enter: ip.addr == 101.102.103.104&lt;br /&gt;b) Select the filter Apply button.&lt;br /&gt;c) Select the Capture -&gt; Interfaces&lt;br /&gt;d) Select the Start button for your ethernet card&lt;br /&gt;e) WireShark is now sitting listening for traffic from the other ip.address of Box2.&lt;br /&gt;&lt;br /&gt;f) Now in SoapUI execute the request.&lt;br /&gt;g)In WireShark you should see the incoming requests:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_5hhNK2aXwp8/Sn-tOGA54oI/AAAAAAAAAzs/1IjFetqMjdo/s1600-h/sslExample5.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 248px;&quot; src=&quot;http://3.bp.blogspot.com/_5hhNK2aXwp8/Sn-tOGA54oI/AAAAAAAAAzs/1IjFetqMjdo/s400/sslExample5.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5368199738493100674&quot; /&gt;&lt;/a&gt;&lt;br /&gt;As WireShark works at the network level it sees the individual packets, several of which will comprise the request/response between SoapUI and WLS, effectively an incredible amount of detail.  You can select each packet and look at the data contained within in the bottom window of the display.  This window shows the data in both hex and raw text, so you&#039;ll need to carefully look to see the data contained within.  Obviously if the traffic is encrypted you wont see much meaning at all which is what we want! To see the unencrypted traffic, remove the policy from your web service, redeploy it and run the same scenario again.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Thanks&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I must aim my very strong thanks to Gerard Davison from Oracle UK with assistance with this article, Gerard&#039;s help has been invaluable.  Any mistakes in this post are of course mine however, of which I&#039;m sure there will be a few in such a long post.&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&#039;1&#039; height=&#039;1&#039; src=&#039;https://blogger.googleusercontent.com/tracker/38586079-5229552844110935684?l=one-size-doesnt-fit-all.blogspot.com&#039;/&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/OneSizeDoesntFitAll/~4/O59z4Eqp0Uw&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1075471&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 02 Sep 2009 11:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1075471</guid>
</item>
<item>
 <title>Inline Scripts with Mojarra</title>
 <link>http://ajax.sys-con.com/node/1091510</link>
 <description>&lt;span class=&#039;print-link&#039;&gt;&lt;/span&gt;&lt;!--  | 0 --&gt;&lt;p&gt;A few weeks ago, &lt;a href=&quot;http://weblogs.java.net/blog/2009/07/18/including-scripts-jsf-2-ajax-requests&quot;&gt;I blogged about&lt;/a&gt; ways to execute scripts on the client which you were writing out from the server via Ajax.&amp;nbsp; By popular demand, the latest build of &lt;a href=&quot;https://javaserverfaces.dev.java.net/&quot;&gt;Mojarra&lt;/a&gt; now allows execution of inline scripts.&lt;/p&gt;
&lt;p&gt;So, instead of having to either bundle code into an &amp;lt;eval&amp;gt; tag, or using an event to execute it later, you can now simply say something like:&lt;/p&gt;
&lt;p&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;alert(&amp;quot;Hello there&amp;quot;);&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;right inside the rendered html.&lt;/p&gt;
&lt;p&gt;You can also say something like:&lt;/p&gt;
&lt;p&gt;&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;file.js&amp;gt;&amp;lt;/script&amp;gt;&lt;/p&gt;
&lt;p&gt;And the script will be loaded as well.&lt;/p&gt;
&lt;p&gt;This feature will (probably) be the next revision of the specification, but you should be able to use this feature without fear of compatability issues going forward - the specifcation&#039;s Expert Group has already expressed their approval of including this.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1091510&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 02 Sep 2009 07:15:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1091510</guid>
</item>
<item>
 <title>JDev 11gR1 - af:tree mashup – Using Hierarchical Tables and Drag-n-Drop</title>
 <link>http://ajax.sys-con.com/node/1091514</link>
 <description>This blog post demonstrates creating an ADF Faces RC af:tree component that sources its data from a hierarchical database table, and supports drag n drop of the nodes.&lt;br /&gt;&lt;br /&gt;Both these topics have been discussed and demonstrated by other excellent bloggers, the core of this post is to bring both concepts together, with my usual own proof of concept documentation that may be useful to readers.&lt;br /&gt;&lt;br /&gt;The ADF Faces RC support for hierarchical data sources was defined by &lt;a href=&quot;http://cbhavsar.blogspot.com/2008/09/declarative-databinding-for-lazy.html&quot;&gt;Chandu Bhavsar&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The drag and drop support for af:trees was documented by &lt;a href=&quot;http://technology.amis.nl/blog/3302/dropping-trees&quot;&gt;Luc Bors&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;(Definitely the kudos for this post must go to both Chandu and Luc for their posts that sparked the inspiration for mine)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Data model&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;In this example we&#039;ll use the following table:&lt;pre name=&quot;code&quot; class=&quot;sql&quot;&gt;CREATE TABLE organisations&lt;br /&gt;(org_id        NUMBER(4,0)  NOT NULL&lt;br /&gt;,parent_org_id NUMBER(4,0)&lt;br /&gt;,name          VARCHAR2(35) NOT NULL&lt;br /&gt;,CONSTRAINT org_pk PRIMARY KEY (org_id)&lt;br /&gt;,CONSTRAINT org_parent_fk&lt;br /&gt; FOREIGN KEY (parent_org_id)&lt;br /&gt; REFERENCES organisations (org_id));&lt;/pre&gt;Note the FK between the table and itself, essentially modelling that an organisation has sub-organisations (or agencies).&lt;br /&gt;&lt;br /&gt;The data:&lt;pre name=&quot;code&quot; class=&quot;sql&quot;&gt;ORG_ID  PARENT_ORG_ID  NAME&lt;br /&gt;------  -------------  -------------------------------&lt;br /&gt;1000    (null)         Sage Computing Services&lt;br /&gt;1010    1000           Training Division&lt;br /&gt;1030    1010           Self Study Program&lt;br /&gt;1040    1010           Classroom Training&lt;br /&gt;2264    (null)         Australian Medical Systems&lt;br /&gt;3210    (null)         Conservation Society&lt;br /&gt;3214    3210           Forests Division&lt;br /&gt;3216    3210           Rivers Division&lt;br /&gt;4394    (null)         Newface cosmetics&lt;br /&gt;3842    (null)         Institute of Business Services&lt;br /&gt;3843    3842           Marketing Services&lt;br /&gt;3844    3842           Financial Services&lt;/pre&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Hierarchical af:tree&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This details the steps to setup an ADF BC layer and ADF Faces RC bindings to support the af:tree with hierachical data from the organisations table, as previously described in Chandu Bhavsar &lt;a href=&quot;http://cbhavsar.blogspot.com/2008/09/declarative-databinding-for-lazy.html&quot;&gt;post&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Note the following steps are well documented on Chandu&#039;s post, though you will find slightly more detail on creating the correct bindings below:&lt;br /&gt;&lt;br /&gt;1) Create a Fusion Web App with an ADF BC Model project and ADF Faces RC ViewController.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Model project&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;2) In the Model project create an empty Application Module (AM)&lt;br /&gt;&lt;br /&gt;3) Create an Entity Object (EO) based on your organisations table in the database.&lt;br /&gt;&lt;br /&gt;4) Create two View Objects (VO) based off the same EM.  Name the first ParentOrgView and the second LeafOrgView.&lt;br /&gt;&lt;br /&gt;5) Modify the ParentOrgView query as follows:&lt;pre name=&quot;code&quot; class=&quot;sql&quot;&gt;SELECT Organisations.ORG_ID, &lt;br /&gt;       Organisations.PARENT_ORG_ID, &lt;br /&gt;       Organisations.NAME&lt;br /&gt;FROM ORGANISATIONS Organisations&lt;br /&gt;WHERE Organisations.PARENT_ORG_ID IS NULL&lt;/pre&gt;6) You don&#039;t need to modify the LeafOrgView query.  For completeness it&#039;s described as follows:&lt;pre name=&quot;code&quot; class=&quot;sql&quot;&gt;SELECT Organisations.ORG_ID, &lt;br /&gt;       Organisations.PARENT_ORG_ID, &lt;br /&gt;       Organisations.NAME&lt;br /&gt;FROM ORGANISATIONS Organisations&lt;/pre&gt;7) Create a VO Link between the ParentOrgView and LeafOrgView as follows:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://2.bp.blogspot.com/_5hhNK2aXwp8/Sp4T5rrPvVI/AAAAAAAAA1I/3He0n26PTAk/s1600-h/adftreepic1.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;&quot; src=&quot;http://2.bp.blogspot.com/_5hhNK2aXwp8/Sp4T5rrPvVI/AAAAAAAAA1I/3He0n26PTAk/s400/adftreepic1.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5376756886824533330&quot; /&gt;&lt;/a&gt;Essentially:&lt;br /&gt;&lt;br /&gt;ParentOrgView.OrgId = LeafOrgView.ParentOrgId&lt;br /&gt;&lt;br /&gt;8) Create a second VO Link between the LeafOrgView to itself as follows:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_5hhNK2aXwp8/Sp4T6Az-DOI/AAAAAAAAA1Q/481_ANDdye0/s1600-h/adftreepic2.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 250px;&quot; src=&quot;http://3.bp.blogspot.com/_5hhNK2aXwp8/Sp4T6Az-DOI/AAAAAAAAA1Q/481_ANDdye0/s400/adftreepic2.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5376756892498267362&quot; /&gt;&lt;/a&gt;Essentially:&lt;br /&gt;&lt;br /&gt;LeafOrgView (source).OrgId = LeafOrgView (dest).ParentOrgId&lt;br /&gt;&lt;br /&gt;9) Externalize the VOs through the AM using the following model:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sp4T6kj9rvI/AAAAAAAAA1Y/uHL1L8Xz3xo/s1600-h/adftreepic3.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 227px;&quot; src=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sp4T6kj9rvI/AAAAAAAAA1Y/uHL1L8Xz3xo/s400/adftreepic3.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5376756902094810866&quot; /&gt;&lt;/a&gt;Essentially:&lt;br /&gt;&lt;br /&gt;ParentOrgView1&lt;br /&gt;- LeafOrgView1&lt;br /&gt;- - LeafOrgView2&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;ViewController project&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;10) In your ViewController project create a new blank JSF page called treeMashupDemo.jspx.&lt;br /&gt;&lt;br /&gt;11) From the Data Control Palette drag the ParentOrgView onto the page as a tree.  In the Edit Tree Binding you should see the following:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sp4T68xQIqI/AAAAAAAAA1g/I1LwS-5R32I/s1600-h/adftreepic4.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 357px; height: 400px;&quot; src=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sp4T68xQIqI/AAAAAAAAA1g/I1LwS-5R32I/s400/adftreepic4.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5376756908592997026&quot; /&gt;&lt;/a&gt;Note the first level of the tree has been defined as model.ParentOrgView.&lt;br /&gt;&lt;br /&gt;12) For clarity when testing later, ensure both the OrgId and Name are included in the Display Attributes.&lt;br /&gt;&lt;br /&gt;13) With the model.ParentOrgView node selected in the Tree Level Rules, select the green plus (+) button and select LeafOrgView:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sp4T7RJuIpI/AAAAAAAAA1o/6zYfNqAEFHs/s1600-h/adftreepic5.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 357px; height: 400px;&quot; src=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sp4T7RJuIpI/AAAAAAAAA1o/6zYfNqAEFHs/s400/adftreepic5.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5376756914064335506&quot; /&gt;&lt;/a&gt;&lt;br /&gt;14) With the LeafOrgView node selected in the Tree Level Rules, ensure both the OrgId and Name are included in the Display Attributes.&lt;br /&gt;&lt;br /&gt;15) Again with the LeafOrgView node selected in the Tree Level Rules, again select the green plus (+) button, and select LeafOrgView__2:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://1.bp.blogspot.com/_5hhNK2aXwp8/Sp4UZoniQqI/AAAAAAAAA1w/iFc5rxWfOkw/s1600-h/adftreepic6.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 357px; height: 400px;&quot; src=&quot;http://1.bp.blogspot.com/_5hhNK2aXwp8/Sp4UZoniQqI/AAAAAAAAA1w/iFc5rxWfOkw/s400/adftreepic6.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5376757435759477410&quot; /&gt;&lt;/a&gt;Note how the Tree Level Rules only has 2 nodes, but to the right of each node is the child of the current node.  Of specific interest in the hierarchical relationship between LeafOrgView and LeafOrgView__2.&lt;br /&gt;&lt;br /&gt;16) For reference the JSF af:tree code is as follows:&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;af:tree value=&quot;#{bindings.ParentOrgView1.treeModel}&quot;&lt;br /&gt;         var=&quot;node&quot;&lt;br /&gt;         selectionListener=&quot;#{bindings.ParentOrgView1.treeModel.makeCurrent}&quot; &lt;br /&gt;         rowSelection=&quot;single&quot;&lt;br /&gt;         id=&quot;t1&quot;&gt;&lt;br /&gt;  &lt;f:facet name=&quot;nodeStamp&quot;&gt;&lt;br /&gt;    &lt;af:outputText value=&quot;#{node}&quot; id=&quot;ot1&quot;/&gt;&lt;br /&gt;  &lt;/f:facet&gt;&lt;br /&gt;&lt;/af:tree&gt;&lt;/pre&gt;...the bindings look as follows:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sp4UZwhUIMI/AAAAAAAAA14/WZ0PgSUJu0I/s1600-h/adftreepic7.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 129px;&quot; src=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sp4UZwhUIMI/AAAAAAAAA14/WZ0PgSUJu0I/s400/adftreepic7.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5376757437880869058&quot; /&gt;&lt;/a&gt;..and the page def XML file as follows:&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt;&lt;br /&gt;&lt;pageDefinition xmlns=&quot;http://xmlns.oracle.com/adfm/uimodel&quot; version=&quot;11.1.1.54.7&quot; id=&quot;treeMashupDemoPageDef&quot;&lt;br /&gt;                Package=&quot;view.pageDefs&quot;&gt;&lt;br /&gt;  &lt;parameters/&gt;&lt;br /&gt;  &lt;executables&gt;&lt;br /&gt;    &lt;variableIterator id=&quot;variables&quot;/&gt;&lt;br /&gt;    &lt;iterator Binds=&quot;ParentOrgView1&quot; RangeSize=&quot;25&quot; DataControl=&quot;AppModuleDataControl&quot; id=&quot;ParentOrgView1Iterator&quot;/&gt;&lt;br /&gt;  &lt;/executables&gt;&lt;br /&gt;  &lt;bindings&gt;&lt;br /&gt;    &lt;tree IterBinding=&quot;ParentOrgView1Iterator&quot; id=&quot;ParentOrgView1&quot;&gt;&lt;br /&gt;      &lt;nodeDefinition DefName=&quot;model.ParentOrgView&quot; Name=&quot;ParentOrgView10&quot;&gt;&lt;br /&gt;        &lt;AttrNames&gt;&lt;br /&gt;          &lt;Item Value=&quot;OrgId&quot;/&gt;&lt;br /&gt;          &lt;Item Value=&quot;Name&quot;/&gt;&lt;br /&gt;        &lt;/AttrNames&gt;&lt;br /&gt;        &lt;Accessors&gt;&lt;br /&gt;          &lt;Item Value=&quot;LeafOrgView&quot;/&gt;&lt;br /&gt;        &lt;/Accessors&gt;&lt;br /&gt;      &lt;/nodeDefinition&gt;&lt;br /&gt;      &lt;nodeDefinition DefName=&quot;model.LeafOrgView&quot; Name=&quot;ParentOrgView11&quot;&gt;&lt;br /&gt;        &lt;AttrNames&gt;&lt;br /&gt;          &lt;Item Value=&quot;OrgId&quot;/&gt;&lt;br /&gt;          &lt;Item Value=&quot;Name&quot;/&gt;&lt;br /&gt;        &lt;/AttrNames&gt;&lt;br /&gt;        &lt;Accessors&gt;&lt;br /&gt;          &lt;Item Value=&quot;LeafOrgView_2&quot;/&gt;&lt;br /&gt;        &lt;/Accessors&gt;&lt;br /&gt;      &lt;/nodeDefinition&gt;&lt;br /&gt;    &lt;/tree&gt;&lt;br /&gt;  &lt;/bindings&gt;&lt;br /&gt;&lt;/pageDefinition&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Testing&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;On running our web page we see the following:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://1.bp.blogspot.com/_5hhNK2aXwp8/Sp4UaeYDJAI/AAAAAAAAA2A/Zylhs-6Km-4/s1600-h/adftreepic8.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 268px; height: 281px;&quot; src=&quot;http://1.bp.blogspot.com/_5hhNK2aXwp8/Sp4UaeYDJAI/AAAAAAAAA2A/Zylhs-6Km-4/s400/adftreepic8.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5376757450190038018&quot; /&gt;&lt;/a&gt;Note that the tree is happily showing the hierarchical data based on our tree bindings.&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-weight:bold;&quot;&gt;Adding drag n drop to the tree&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The next set of functionality we wish to add is the ability to drag and drop nodes, or in our case organisations, in the tree.  This involves adding support for drag n drop to the tree, as well as behind the scenes updating the dropped organisation&#039;s parent_org_id  to that of the org_id of the organisation the original was dropped on.&lt;br /&gt;&lt;br /&gt;The inspiration of this section comes from Luc Bors blog &lt;a href=&quot;http://technology.amis.nl/blog/3302/dropping-trees&quot;&gt;post&lt;/a&gt;, with slight difference in mine some of the supporting code is further spelt out:&lt;br /&gt;&lt;br /&gt;1) As a reminder at the moment our af:tree code looks as follows:&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;af:tree value=&quot;#{bindings.ParentOrgView1.treeModel}&quot;&lt;br /&gt;         var=&quot;node&quot;&lt;br /&gt;         selectionListener=&quot;#{bindings.ParentOrgView1.treeModel.makeCurrent}&quot; &lt;br /&gt;         rowSelection=&quot;single&quot;&lt;br /&gt;         id=&quot;t1&quot;&gt;&lt;br /&gt;  &lt;f:facet name=&quot;nodeStamp&quot;&gt;&lt;br /&gt;    &lt;af:outputText value=&quot;#{node}&quot; id=&quot;ot1&quot;/&gt;&lt;br /&gt;  &lt;/f:facet&gt;&lt;br /&gt;&lt;/af:tree&gt;&lt;/pre&gt;2) We then introduce a collectionDragSource and a collectionDropTarget to support the drag and drop within the tree:&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;af:tree value=&quot;#{bindings.ParentOrgView1.treeModel}&quot;&lt;br /&gt;         var=&quot;node&quot;&lt;br /&gt;         selectionListener=&quot;#{bindings.ParentOrgView1.treeModel.makeCurrent}&quot; &lt;br /&gt;         rowSelection=&quot;single&quot;&lt;br /&gt;         id=&quot;t1&quot;&gt;&lt;br /&gt;  &lt;af:collectionDragSource actions=&quot;MOVE&quot; &lt;br /&gt;                           modelName=&quot;DnDOrganisations&quot;/&gt;&lt;br /&gt;  &lt;af:collectionDropTarget actions=&quot;MOVE&quot; &lt;br /&gt;                           modelName=&quot;DnDOrganisations&quot; &lt;br /&gt;                           dropListener=&quot;#{treeBean.dragAndDrop}&quot;/&gt;&lt;br /&gt;  &lt;f:facet name=&quot;nodeStamp&quot;&gt;&lt;br /&gt;    &lt;af:outputText value=&quot;#{node}&quot; id=&quot;ot1&quot;/&gt;&lt;br /&gt;  &lt;/f:facet&gt;&lt;br /&gt;&lt;/af:tree&gt;&lt;/pre&gt;Note both support the MOVE action, they both specify a matching modelName DnDOrganisations, and finally the dropListener maps to a backing bean method we&#039;ll define in a moment.  It&#039;s essential the modelName&#039;s match including the case of the name, and we&#039;ll be referring to this in the dragAndDrop backing bean treeBean method in a moment.&lt;br /&gt;&lt;br /&gt;3) In your adfc-config.xml file declare a bean treeBean of class view.TreeBean:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://3.bp.blogspot.com/_5hhNK2aXwp8/Sp4Ua3In7nI/AAAAAAAAA2I/_PW7pyU9-wc/s1600-h/adftreepic9.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 164px;&quot; src=&quot;http://3.bp.blogspot.com/_5hhNK2aXwp8/Sp4Ua3In7nI/AAAAAAAAA2I/_PW7pyU9-wc/s400/adftreepic9.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5376757456836226674&quot; /&gt;&lt;/a&gt;&lt;br /&gt;4) And create a Java class TreeBean in your view package within the ViewController project.&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;package view;&lt;br /&gt;&lt;br /&gt;public class TreeBean {&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;The real work for drag and drop is done in the backing bean method.  However in order for the code to work there are a couple of items we need to configure in the Model project:&lt;br /&gt;&lt;br /&gt;5) Create an AppModuleImpl for the AM&lt;br /&gt;&lt;br /&gt;6) Create a LeafOrgViewImpl for the VO &lt;br /&gt;&lt;br /&gt;7) Create a LeafOrgViewRowImpl for the VO and ensure to include the accessors&lt;br /&gt;&lt;br /&gt;8) In the AM expose the LeafOrgView VO one more time as its own node (not a child), and call the usage LeafOrgViewAll as follows:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sp4UbPovzGI/AAAAAAAAA2Q/SvSwAYj51jk/s1600-h/adftreepic10.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 251px;&quot; src=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sp4UbPovzGI/AAAAAAAAA2Q/SvSwAYj51jk/s400/adftreepic10.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5376757463413410914&quot; /&gt;&lt;/a&gt;&lt;br /&gt;9) Finally the dragAndDrop code is as follows.  Note the code includes inline documentation comments that explains what is occurring:&lt;pre name=&quot;code&quot; class=&quot;java&quot;&gt;package view;&lt;br /&gt;&lt;br /&gt;import model.AppModuleImpl;&lt;br /&gt;import model.LeafOrgViewImpl;&lt;br /&gt;import model.LeafOrgViewRowImpl;&lt;br /&gt;import model.ParentOrgViewRowImpl;&lt;br /&gt;import oracle.adf.model.BindingContext;&lt;br /&gt;import oracle.adf.view.rich.component.rich.data.RichTree;&lt;br /&gt;import oracle.adf.view.rich.datatransfer.DataFlavor;&lt;br /&gt;import oracle.adf.view.rich.datatransfer.Transferable;&lt;br /&gt;import oracle.adf.view.rich.dnd.DnDAction;&lt;br /&gt;import oracle.adf.view.rich.event.DropEvent;&lt;br /&gt;import oracle.adfinternal.view.faces.model.binding.FacesCtrlHierNodeBinding;&lt;br /&gt;import oracle.jbo.Key;&lt;br /&gt;import oracle.jbo.uicli.binding.JUCtrlHierNodeBinding;&lt;br /&gt;import org.apache.myfaces.trinidad.model.CollectionModel;&lt;br /&gt;import org.apache.myfaces.trinidad.model.RowKeySet;&lt;br /&gt;&lt;br /&gt;public class TreeBean {&lt;br /&gt;  &lt;br /&gt;  public DnDAction dragAndDrop(DropEvent dropEvent) {&lt;br /&gt;    // The default action - do nothing&lt;br /&gt;    DnDAction result = DnDAction.NONE;&lt;br /&gt;&lt;br /&gt;    // Represents the object that was dropped    &lt;br /&gt;    Transferable draggedTransferObject = dropEvent.getTransferable();&lt;br /&gt;    &lt;br /&gt;    // The data in the draggedTransferObject &quot;Transferrable&quot; object is the row key for the dragged component.&lt;br /&gt;    // Note how the DnDOrganisations value in the call to getDataFlavor() matches the collectionDragSource&lt;br /&gt;    // and collectionDropTarget tags model attributes in our page.  It&#039;s essential the strings exactly match.&lt;br /&gt;    DataFlavor&lt;RowKeySet&gt; draggedRowKeySetFlavor = DataFlavor.getDataFlavor(RowKeySet.class, &quot;DnDOrganisations&quot;);&lt;br /&gt;    RowKeySet draggedRowKeySet = draggedTransferObject.getData(draggedRowKeySetFlavor);&lt;br /&gt;       &lt;br /&gt;    if (draggedRowKeySet != null) {&lt;br /&gt;      // We grab the tree&#039;s data model, essentially the CollectionModel that stores the complete tree of nodes&lt;br /&gt;      CollectionModel treeModel = draggedTransferObject.getData(CollectionModel.class);&lt;br /&gt;       &lt;br /&gt;      // Ask the collection model to set the current row/node to that of the transferrable object that was dropped&lt;br /&gt;      Object draggedKey = draggedRowKeySet.iterator().next();&lt;br /&gt;      treeModel.setRowKey(draggedKey);&lt;br /&gt;    &lt;br /&gt;      // Grab that current row (thanks to the last statements work) and get the row&#039;s OrgId. It&#039;s essential the&lt;br /&gt;      // OrgId is one of the displayed attributes in the tree binding.&lt;br /&gt;      FacesCtrlHierNodeBinding draggedTreeNode =  (FacesCtrlHierNodeBinding)treeModel.getRowData();      &lt;br /&gt;      oracle.jbo.domain.Number draggedTreeNodeId = (oracle.jbo.domain.Number)draggedTreeNode.getAttribute(&quot;OrgId&quot;);&lt;br /&gt;&lt;br /&gt;      // The dropEvent carries the target/location&#039;s row key where the dropped organisations was dropped&lt;br /&gt;      Object serverRowKey = dropEvent.getDropSite();&lt;br /&gt;      RichTree richTree = (RichTree)dropEvent.getDropComponent();&lt;br /&gt;      // This time we use the tree itself to make it&#039;s current row that of the server row key (ie. the destination)&lt;br /&gt;      richTree.setRowKey(serverRowKey);&lt;br /&gt;      // And we retrieve that row&#039;s index&lt;br /&gt;      int rowIndex = richTree.getRowIndex();&lt;br /&gt;&lt;br /&gt;      // The rich tree based on the index allows us to retrieve that current row/organisation&#039;s OrgId&lt;br /&gt;      oracle.jbo.domain.Number targetNodeId = (oracle.jbo.domain.Number)((JUCtrlHierNodeBinding)richTree.getRowData(rowIndex)).getAttribute(&quot;OrgId&quot;);&lt;br /&gt;      &lt;br /&gt;      // At this point we now have the OrgId of the dropped organisation (draggedTreeNodeId) and the OrgId of the&lt;br /&gt;      // organisation that is the target.  From here we simply want to update the dropped organisations&#039; ParentOrgId&lt;br /&gt;      // to the OrgId of the target.  This is best done through the model layer.&lt;br /&gt;      //&lt;br /&gt;      // Normally this would be best done by fetching the appropriate iterator bindings and making the changes through&lt;br /&gt;      // the bindings.  However in this case the tree doesn&#039;t expose any iterator for the leaf nodes, so we need to&lt;br /&gt;      // resort to retrieve the Model project&#039;s objects and do the work ourself.&lt;br /&gt;      &lt;br /&gt;      // Retrieve the AM and then a handle on the LeafOrgViewAll - this gives us access to all rows regardless of&lt;br /&gt;      // where they exist in the hierarchy&lt;br /&gt;      AppModuleImpl am = (AppModuleImpl)BindingContext.getCurrent().getDefaultDataControl().getApplicationModule();&lt;br /&gt;      LeafOrgViewImpl leafOrgView = (LeafOrgViewImpl)am.getLeafOrgViewAll();&lt;br /&gt;      &lt;br /&gt;      // Given the dragged organisation&#039;s OrgId, construct a key object, and then retrieve that row from the VO using&lt;br /&gt;      // the key&lt;br /&gt;      Object[] nodeObjectKey = new Object[] {draggedTreeNodeId};&lt;br /&gt;      Key nodeKey = new Key(nodeObjectKey);&lt;br /&gt;      LeafOrgViewRowImpl nodeRow = (LeafOrgViewRowImpl)leafOrgView.getRow(nodeKey);&lt;br /&gt;&lt;br /&gt;      // See below&lt;br /&gt;      boolean parentNode = nodeRow.getParentOrgId() == null;&lt;br /&gt;      &lt;br /&gt;      // Finally update that organisaiton&#039;s ParentOrgId to that of the target organisation&#039;s OrgId&lt;br /&gt;      nodeRow.setParentOrgId(targetNodeId);&lt;br /&gt;&lt;br /&gt;      // And commit the changes – obviously this has side effects on any other uncommitted data, be careful&lt;br /&gt;      am.getDBTransaction().commit();&lt;br /&gt;      &lt;br /&gt;      // If we&#039;ve moved a parent node to become a leaf, we need to force the parent VO to requery itself to correctly&lt;br /&gt;      // reflect the data change.  This is destructive on the current expand/collapsed state of the tree.&lt;br /&gt;      // I&#039;m not overly sure of a solution for this; maybe a reader can suggest one.&lt;br /&gt;      if (parentNode) {      &lt;br /&gt;        am.getParentOrgView1().clearCache();&lt;br /&gt;        am.getParentOrgView1().executeQuery();&lt;br /&gt;      }&lt;br /&gt;      &lt;br /&gt;      // Indicate to the dragEvent that the operation was succesful and visually the move should occur in the tree&lt;br /&gt;      result = DnDAction.MOVE;&lt;br /&gt;    }&lt;br /&gt;    return result;&lt;br /&gt;  }&lt;br /&gt;}&lt;/pre&gt;You&#039;ll note in the code I take pains to mention it&#039;s essential the OrgId is one of the displayed attributes for the tree.  If you fail to supply this the routine has no OrgId attribute to fetch the OrgId value from.&lt;br /&gt; &lt;br /&gt;This does pose a problem, because while during testing it&#039;s fine to show the OrgId and Name of the organisations in the tree, for production we might not want to show these meaningless internal ID numbers to the user.  The simple fix for this is to return to the af:tree and update the af:outputText component who is responsible for what values to show for each node in the tree, changing the EL expression from #{code} to #{code.Name}:&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&lt;af:tree value=&quot;#{bindings.ParentOrgView1.treeModel}&quot;&lt;br /&gt;         var=&quot;node&quot;&lt;br /&gt;         selectionListener=&quot;#{bindings.ParentOrgView1.treeModel.makeCurrent}&quot; &lt;br /&gt;         rowSelection=&quot;single&quot;&lt;br /&gt;         id=&quot;t1&quot;&gt;&lt;br /&gt;  &lt;af:collectionDragSource actions=&quot;MOVE&quot; &lt;br /&gt;                           modelName=&quot;DnDOrganisations&quot;/&gt;&lt;br /&gt;  &lt;af:collectionDropTarget actions=&quot;MOVE&quot; &lt;br /&gt;                           modelName=&quot;DnDOrganisations&quot; &lt;br /&gt;                           dropListener=&quot;#{treeBean.dragAndDrop}&quot;/&gt;&lt;br /&gt;  &lt;f:facet name=&quot;nodeStamp&quot;&gt;&lt;br /&gt;    &lt;af:outputText value=&quot;#{node.Name}&quot; id=&quot;ot1&quot;/&gt;&lt;br /&gt;  &lt;/f:facet&gt;&lt;br /&gt;&lt;/af:tree&gt;&lt;/pre&gt;This ensures only the name attribute is displayed:&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sp4Uy4f0CTI/AAAAAAAAA2Y/jBFLhLvCVng/s1600-h/adftreepic11.png&quot;&gt;&lt;img style=&quot;display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 224px; height: 281px;&quot; src=&quot;http://4.bp.blogspot.com/_5hhNK2aXwp8/Sp4Uy4f0CTI/AAAAAAAAA2Y/jBFLhLvCVng/s400/adftreepic11.png&quot; border=&quot;0&quot; alt=&quot;&quot;id=&quot;BLOGGER_PHOTO_ID_5376757869518784818&quot; /&gt;&lt;/a&gt;&lt;div class=&quot;blogger-post-footer&quot;&gt;&lt;img width=&#039;1&#039; height=&#039;1&#039; src=&#039;https://blogger.googleusercontent.com/tracker/38586079-7150502317199297318?l=one-size-doesnt-fit-all.blogspot.com&#039;/&gt;&lt;/div&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/OneSizeDoesntFitAll/~4/iFnPrKdfaVw&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1091514&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 02 Sep 2009 02:35:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1091514</guid>
</item>
<item>
 <title>Book Review: ASP.NET 3.5 for Dummies</title>
 <link>http://ajax.sys-con.com/node/1090760</link>
 <description>I have been a big fan of the Dummies book series for the last 8 years. I can still remember the day when I picked up my first dummies book from a local book shop. I recently came to know that Ken Cox has been involved in writing a dummies title for ASP.NET 3.5 and [...]&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1090760&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Tue, 01 Sep 2009 16:30:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1090760</guid>
</item>
<item>
 <title>OpenXava 3.1.4 Released</title>
 <link>http://ajax.sys-con.com/node/1086134</link>
 <description>OpenXava 3.1.4 is a framework focused in productivity for developing business Java applications. The idea is that you write only your POJOs annotated with JPA and you get an application ready for production.

With OpenXava, you only need to write your model, POJOs and Java annotations. You do not need to write the view, and the controller (for CRUD, printing, etc) is reused. And from that you&#039;ll have an application for CRUD, report generation in PDF, export to Excel, searching, sorting, validations etc. You only need to write a simple Java class, no XMLs, no JSPs and no code generation.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1086134&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Fri, 28 Aug 2009 09:45:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1086134</guid>
</item>
<item>
 <title>Enterprise JavaFX</title>
 <link>http://ajax.sys-con.com/node/1084368</link>
 <description>This article is also posted on JavaLobby.com
This is a guest post by Anton Polyakov.  Anton is Senior Developer at Exadel, he describes our experience building a JavaFX front end for a Seam booking application. 
JavaFX is new tool set for developing and delivering Rich Internet Applications or RIAs. JavaFX 1.0 was released in December [...]&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1084368&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 27 Aug 2009 13:45:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1084368</guid>
</item>
<item>
 <title>Twitter 101 Guide for Business</title>
 <link>http://ajax.sys-con.com/node/1083729</link>
 <description>Twitter is a communication platform that helps businesses stay connected to their customers. As a business, you can use it to quickly share information with people interested in your company, gather real-time market intelligence and feedback, and build relationships with customers, partners and other people who care about your company. As an individual user, you can use Twitter to tell a company (or anyone else) that you&#039;ve had a great—or disappointing—experience with their business, offer product ideas, and learn about great offers.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1083729&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 26 Aug 2009 12:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1083729</guid>
</item>
<item>
 <title>Rich Content with a Database Server</title>
 <link>http://ajax.sys-con.com/node/1073425</link>
 <description>Enterprises are increasingly being called upon to provide a high level of user experience with compelling and interactive content. Serving enterprise content and data securely to internet / intranet has become a very common necessity and is routinely handled by web servers. Web services technology, on the other hand, addresses the application-to-application transparent interaction over the web using industry standards. Delivery of web services can also be handled by databases which are responsive to HTTP requests. In this article a simple example of serving a static web page containing dynamic content from a SQL Anywhere 11 database server is described. The web page has examples of jQuery, DOJO, as well as an embedded ADOBE flash file. 
&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1073425&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Mon, 17 Aug 2009 22:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1073425</guid>
</item>
<item>
 <title>The Frozen Canuck Is At It Again</title>
 <link>http://ajax.sys-con.com/node/1071695</link>
 <description>The Frozen Canuck is at it again. This time with I think the first public explanation of how to build a custom view with the new SC.View class.  Notice that SproutCore 1.0 views are built using a simple render() method where you generate HTML.  It’s a really easy API and it just so happens to be extremely fast, especially in IE where DOM manipulation is very expensive.&lt;/p&gt;
&lt;p&gt;Check it: &lt;a href=&quot;http://frozencanuck.wordpress.com/2009/08/14/creating-a-simple-custom-view-in-sproutcore-part1/#comment-3&quot;&gt;Creating a Simple Custom View in SproutCore: Part1&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://feeds.feedburner.com/~r/Sproutcore-BlogPosts/~4/RpuSrAhWjUE&quot; height=&quot;1&quot; width=&quot;1&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1071695&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Sun, 16 Aug 2009 10:45:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1071695</guid>
</item>
<item>
 <title>.NET RIA Services: Separate Solution Files</title>
 <link>http://ajax.sys-con.com/node/1068817</link>
 <description>&lt;p&gt;Still updating my Mix 09 Silverlight 3 + RIA Services talk with more fun stuff.&amp;#160; This time I take up a challenge from &lt;a href=&quot;http://wildermuth.com/&quot;&gt;Mr. Wildermuth&lt;/a&gt;.&amp;#160; Shawn recently raised a very interesting issue with RIA Services&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1068817&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 12 Aug 2009 15:00:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1068817</guid>
</item>
<item>
 <title>Hierarchical Data</title>
 <link>http://ajax.sys-con.com/node/1066829</link>
 <description>Wow – the gift that keeps giving.. I am *still* having fun updating my my simple Mix 09 Business Application demo.   Would anyone be interested in a say 10 hour session at PDC2009 where we walk thought all of this stuff ;-).  Anyway, in this section I want to take up a challenge that Ben Hayat sent me to show that Silverlight and  RIA Services are really capable of building real business applications.&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1066829&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Mon, 10 Aug 2009 17:10:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1066829</guid>
</item>
<item>
 <title>Web 2.0 Is Not About AJAX, Gradients, or Gloss</title>
 <link>http://ajax.sys-con.com/node/1063490</link>
 <description>Too often I hear people talk about adding AJAX-enabled fancy UI elements to their website or web application to make it more &amp;#8220;Web 2.0&amp;#8243; style.  While many Web 2.0 applications do include these elements of AJAX,  gradients,  and glossy style, those features are not what characterizes them as Web 2.0 applications.  Web 2.0 is [...]&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1063490&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Thu, 06 Aug 2009 19:45:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1063490</guid>
</item>
<item>
 <title>Exadel JavaFX Studio Plug-in for Eclipse 1.0.2 Released</title>
 <link>http://ajax.sys-con.com/node/1061494</link>
 <description>We have released Exadel JavaFX Studio plug-in for Eclipse version 1.0.2 . The biggest feature in this version is error markers in the editor. Previously the compiler would run and report the errors in standard Eclipse console but wouldn’t put error markers in editor. 

How to get started? Three easy steps (I’m assuming you already have JavaFX SDK installed. If not, download and install it from &lt;a href=&quot;http://www.javafx.com&quot; title=&quot;http://www.javafx.com&quot;&gt;http://www.javafx.com&lt;/a&gt;):&lt;p&gt;&lt;a href=&quot;http://ajax.sys-con.com/node/1061494&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</description>
 <pubDate>Wed, 05 Aug 2009 19:30:00 EDT</pubDate>
 <guid isPermaLink="true">http://ajax.sys-con.com/node/1061494</guid>
</item>
</channel>
</rss>
