<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-808130183756216637</id><updated>2011-07-08T18:14:40.336+02:00</updated><category term='apache'/><category term='bpm'/><category term='mail'/><category term='continuous integration'/><category term='alfresco'/><category term='java'/><category term='html5'/><category term='kaazing'/><category term='jbpm'/><category term='methodology'/><category term='lazyuncached'/><category term='hudson'/><category term='cmis'/><category term='chemistry'/><category term='product development'/><category term='adf'/><category term='wlst'/><category term='property inspector'/><category term='jdeveloper'/><category term='popup'/><category term='cms'/><category term='bejug'/><category term='garbage collection'/><category term='ojdeploy'/><category term='property editor'/><category term='weblogic'/><category term='oracle aq'/><category term='opencmis'/><category term='hotspot'/><category term='contentdelivery'/><category term='customization'/><category term='deploy'/><title type='text'>Productivity With Choice...</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-5516990379119862198</id><published>2011-05-01T12:27:00.001+02:00</published><updated>2011-05-01T14:26:25.190+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='oracle aq'/><category scheme='http://www.blogger.com/atom/ns#' term='html5'/><category scheme='http://www.blogger.com/atom/ns#' term='kaazing'/><title type='text'>A little leap: invoking a HTML5 WebSocket from PL/SQL with Oracle Advanced Queuing (Oracle JMS).</title><content type='html'>&lt;h3&gt;How it started&lt;/h3&gt; &lt;p&gt;Recently I had to organize a HTML5 coding Dojo within the company I work, the difficult part concerning this dojo was not HTML5 but finding an interesting use-case to code around. A major aspect to consider, concerning finding a feasible use-case, was the fact that the dojo audience was not a homogeneous group; on the contrary it was primarily formed by a mix of Java and PL/SQL programmers.&lt;/p&gt; &lt;h3&gt;The use-case&lt;/h3&gt; &lt;p&gt;To find a suitable use-case, I first launched a little intern poll to collect all ideas, the response was quite poor and none of the proposals met my needs, but just as I was considering to give up, l had a little epiphany :-)… What if I could invoke a WebSocket from PL/SQL code? Wouldn’t that be a nice use-case for the entire audience? This is what I came up with…  &lt;ul&gt; &lt;li&gt;WebSocket gateway: Kaazing Gateway.  &lt;li&gt;Oracle Advanced Queuing (Oracle JMS).  &lt;li&gt;A self-written proxy between the WebSocket gateway and Oracle AQ.&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;Kaazing Gateway&lt;/h3&gt; &lt;p&gt;First the easy part: install and configure the Kaazing Gateway. &lt;br&gt;I just downloaded Kaazing WebSocket Gateway - HTML5 Edition 3.1.6 &lt;a href="http://kaazing.com/download.html"&gt;here&lt;/a&gt;, and followed the &lt;a href="http://tech.kaazing.com/documentation/html5/index.html"&gt;getting started documentation&lt;/a&gt;. &lt;br&gt;For my use-case I added a new Service in the gateway-config.xml (for more details see &lt;a href="http://tech.kaazing.com/documentation/html5/admin-guide.html"&gt;Administrator’s Guide&lt;/a&gt;).&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 590px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1: &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;service&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2:   	&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;accept&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;ws://hostname:8002/oaq&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;accept&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3:   	&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;broadcast&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4: 	&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;properties&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5:      	 	&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;accept&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;udp://hostname:9876&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;accept&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  6:     	&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;properties&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  7: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  8: 	&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;cross&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;site&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;constraint&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  9:     		&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;allow&lt;/span&gt;-&lt;span style="color: #ff0000"&gt;origin&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;*&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;allow&lt;/span&gt;-origin&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 10:   	&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;cross&lt;/span&gt;-site-constraint&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 11:   &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;service&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;  &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 12: &lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;u&gt;Note&lt;br&gt;&lt;/u&gt;You have to adjust the hostname to your servers hostname.&lt;/em&gt;&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Oracle Advanced Queuing&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;This section describes how to set up the Oracle Advanced Queuing.&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 590px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1: &lt;span style="color: #008000"&gt;--Oracle schema grants needed for AQ&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=GRANT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;GRANT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=EXECUTE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;EXECUTE&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=ON&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;ON&lt;/a&gt; dbms_aq &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=TO&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;TO&lt;/a&gt; [&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=user&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;user&lt;/a&gt;];&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=GRANT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;GRANT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=EXECUTE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;EXECUTE&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=ON&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;ON&lt;/a&gt; dbms_aqadm &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=TO&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;TO&lt;/a&gt; [&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=user&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;user&lt;/a&gt;];&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=GRANT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;GRANT&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=EXECUTE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;EXECUTE&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=ON&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;ON&lt;/a&gt; dbms_aqin &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=to&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;to&lt;/a&gt; [&lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=user&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;user&lt;/a&gt;];&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  6: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  7: &lt;span style="color: #008000"&gt;--Prepare schema for Oracle AQ&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  8: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  9: &lt;span style="color: #008000"&gt;--Create object type&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 10: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 11: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CREATE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CREATE&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=OR&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;OR&lt;/a&gt; REPLACE TYPE notification_type &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=AS&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;AS&lt;/a&gt; OBJECT&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 12: ( table_name        &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=varchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;varchar&lt;/a&gt;2(100)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 13: , key_name          &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=varchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;varchar&lt;/a&gt;2(100)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 14: , key_              number(10)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 15: , message           &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=varchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;varchar&lt;/a&gt;2(1000)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 16: , user_             &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=varchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;varchar&lt;/a&gt;2(20)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 17: , &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=action&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;action&lt;/a&gt;	    &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=varchar&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;varchar&lt;/a&gt;2(100)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 18: );&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 19: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 20: &lt;span style="color: #008000"&gt;--Create queue table&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 21: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 22: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=BEGIN&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;BEGIN&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 23:   dbms_aqadm.create_queue_table&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 24:   ( queue_table         =&amp;gt; '&lt;span style="color: #8b0000"&gt;aq_notifications&lt;/span&gt;'&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 25:   , queue_payload_type  =&amp;gt; '&lt;span style="color: #8b0000"&gt;notification_type&lt;/span&gt;'&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 26:   , multiple_consumers  =&amp;gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=false&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;false&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 27:   , comment             =&amp;gt; '&lt;span style="color: #8b0000"&gt;AQ Notification Queue&lt;/span&gt;'&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 28:   );&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 29: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=END&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;END&lt;/a&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 30: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 31: &lt;span style="color: #008000"&gt;--Create queue&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 32: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 33: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=BEGIN&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;BEGIN&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 34:   dbms_aqadm.create_queue&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 35:   ( queue_name  =&amp;gt; '&lt;span style="color: #8b0000"&gt;notification_queue&lt;/span&gt;'&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 36:   , queue_table =&amp;gt; '&lt;span style="color: #8b0000"&gt;aq_notifications&lt;/span&gt;'&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 37:   );&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 38: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=END&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;END&lt;/a&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 39: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 40: &lt;span style="color: #008000"&gt;--Start queuing&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 41: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 42: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=BEGIN&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;BEGIN&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 43:   dbms_aqadm.start_queue( queue_name =&amp;gt; '&lt;span style="color: #8b0000"&gt;notification_queue&lt;/span&gt;');&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 44: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=END&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;END&lt;/a&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 45: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 46: &lt;span style="color: #008000"&gt;--Procedure to enqueue new notifcations&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 47: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 48: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=CREATE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;CREATE&lt;/a&gt; &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=OR&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;OR&lt;/a&gt; REPLACE&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 49: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=PROCEDURE&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;PROCEDURE&lt;/a&gt; enqueue_notification_type&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 50: ( p_notification &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=in&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;in&lt;/a&gt; notification_type)&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 51: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=IS&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;IS&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 52:   queue_options       dbms_aq.enqueue_options_t;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 53:   message_properties  dbms_aq.message_properties_t;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 54:   message_id          raw(16);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 55: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=BEGIN&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;BEGIN&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 56:   dbms_aq.enqueue&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 57:   ( queue_name         =&amp;gt; '&lt;span style="color: #8b0000"&gt;notification_queue&lt;/span&gt;'&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 58:   , enqueue_options    =&amp;gt; queue_options&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 59:   , message_properties =&amp;gt; message_properties&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 60:   , payload            =&amp;gt; p_notification&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 61:   , msgid              =&amp;gt; message_id&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 62:   );&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 63: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=END&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;END&lt;/a&gt;;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 64: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 65: &lt;span style="color: #008000"&gt;--Enqueue a Message&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 66: &lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 67: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=EXEC&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;EXEC&lt;/a&gt; enqueue_notification_type( p_notification  =&amp;gt; notification_type('&lt;span style="color: #8b0000"&gt;DummyAQ&lt;/span&gt;', '&lt;span style="color: #8b0000"&gt;ID&lt;/span&gt;', 1, '&lt;span style="color: #8b0000"&gt;Test 1&lt;/span&gt;', '&lt;span style="color: #8b0000"&gt;SYS&lt;/span&gt;', '&lt;span style="color: #8b0000"&gt;EXEC&lt;/span&gt;'));&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 68: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=COMMIT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;COMMIT&lt;/a&gt;;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;em&gt;&lt;u&gt;Important note&lt;br&gt;&lt;/u&gt;The Java proxy described in the next section needs a Java Wrapper Type for the Oracle notification object type.&lt;br&gt;&lt;/em&gt;&lt;em&gt;&lt;strong&gt;If you change the notification Oracle object type, the proxy has to be rebuilt with a new Java notification type wrapper object.&lt;/strong&gt;&lt;br&gt;The java notification type wrapper object is generated via JPublisher (which comes with SQLJ). To generate the wrapper you have to execute the following command: &lt;/em&gt;&lt;strong&gt;&lt;em&gt;jpub -user=[user]/[password] -sql=Notification_Type -usertypes=oracle -methods=false&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Oracle AQ WebSocket Proxy&lt;/h3&gt;&lt;br /&gt;&lt;br&gt;The proxy consists of three classes:&lt;br&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;AQWebSocketProxy: the Proxy. &lt;br /&gt;&lt;li&gt;Notification_Type: Java Wrapper for the Oracle Notification object type. &lt;br /&gt;&lt;li&gt;Notification_TypeRef: Java Wrapper for the Oracle Notification object type.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;The next snippets are code snippets from the proxy class.&lt;br&gt;The most import things the class does are:&lt;br&gt;Listening to the Oracle AQ and dequeue a message as soon as it comes available on the queue.&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 590px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1:     &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; dequeue() {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2:         &lt;span style="color: #0000ff"&gt;try&lt;/span&gt; {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3:             LOGGER.info("&lt;span style="color: #8b0000"&gt;Start listening single consumer queue...&lt;/span&gt;");&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4:             &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; AQOracleDriver driver = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AQOracleDriver();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5:             &lt;span style="color: #0000ff"&gt;while&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;true&lt;/span&gt;) {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  6:                 &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; AQSession session = driver.createAQSession(connection);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  7:                 &lt;span style="color: #008000"&gt;//Create reference to qeue.&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  8:                 &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; AQQueue queue = session.getQueue(username, queueName);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  9:                 &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; AQDequeueOption dequeueOption = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AQDequeueOption();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 10:                 &lt;span style="color: #008000"&gt;//Set dequeue mode to BROWSE (messages won't get deleted after dequeue).&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 11:                 &lt;span style="color: #008000"&gt;//dequeueOption.setDequeueMode(AQDequeueOption.DEQUEUE_BROWSE);&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 12:                 dequeueOption.setWaitTime(AQDequeueOption.WAIT_FOREVER);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 13:                 LOGGER.info("&lt;span style="color: #8b0000"&gt;Waiting for message to dequeue...&lt;/span&gt;");&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 14:                 &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; AQMessage message = queue.dequeue(dequeueOption, Notification_Type.getORADataFactory());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 15:                 &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] msgId = message.getMessageId();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 16:                 LOGGER.info("&lt;span style="color: #8b0000"&gt;Dequeue starts for message: &lt;/span&gt;" + msgId + "&lt;span style="color: #8b0000"&gt;  ...&lt;/span&gt;");&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 17:                 &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; AQObjectPayload payload = message.getObjectPayload();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 18:                 &lt;span style="color: #008000"&gt;//Retrieve data.&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 19:                 &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; Notification_Type messageData = (Notification_Type) payload.getPayloadData();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 20:                 LOGGER.debug("&lt;span style="color: #8b0000"&gt;[BEGIN Message Data]&lt;/span&gt;");&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 21:                 LOGGER.debug(messageData.getTableName());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 22:                 LOGGER.debug(messageData.getKeyName());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 23:                 LOGGER.debug(messageData.getKey());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 24:                 LOGGER.debug(messageData.getMessage());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 25:                 LOGGER.debug(messageData.getUser());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 26:                 LOGGER.debug(messageData.getAction());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 27:                 LOGGER.debug("&lt;span style="color: #8b0000"&gt;[END Message Data]&lt;/span&gt;");&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 28:                 connection.commit();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 29:                 sendUDPPacket(messageData);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 30:                 LOGGER.info("&lt;span style="color: #8b0000"&gt;Dequeue for message: &lt;/span&gt;" + msgId + "&lt;span style="color: #8b0000"&gt; done.&lt;/span&gt;");&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 31:             }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 32:         } &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (SQLException sqlex) {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 33:             LOGGER.error(sqlex.getMessage(), sqlex);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 34:         } &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (AQException aqe) {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 35:             LOGGER.error(aqe.getMessage(), aqe);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 36:         } &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (SocketException se) {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 37:             LOGGER.error(se.getMessage(), se);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 38:         } &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (UnknownHostException uhe) {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 39:             LOGGER.error(uhe.getMessage(), uhe);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 40:         } &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (IOException ioe) {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 41:             LOGGER.error(ioe.getMessage(), ioe);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 42:         }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 43:     }&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The dequeued message will be translated to JSON first and then it will be send to the WebSocket gateway via the UDP protocol.&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 590px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1:     &lt;span style="color: #0000ff"&gt;private&lt;/span&gt; String convertToJSON(&lt;span style="color: #0000ff"&gt;final&lt;/span&gt; Notification_Type message) {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2:         &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; JsonFactory factory = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; JsonFactory();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3:         &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; StringWriter writer = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; StringWriter();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4:         JsonGenerator gen;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5:         &lt;span style="color: #0000ff"&gt;try&lt;/span&gt; {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  6:             gen = factory.createJsonGenerator(writer);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  7:             gen.writeStartObject();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  8:             gen.writeStringField("&lt;span style="color: #8b0000"&gt;TableName&lt;/span&gt;", message.getTableName());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  9:             gen.writeStringField("&lt;span style="color: #8b0000"&gt;KeyName&lt;/span&gt;", message.getKeyName());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 10:             gen.writeNumberField("&lt;span style="color: #8b0000"&gt;Key&lt;/span&gt;", message.getKey());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 11:             gen.writeStringField("&lt;span style="color: #8b0000"&gt;Message&lt;/span&gt;", message.getMessage());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 12:             gen.writeStringField("&lt;span style="color: #8b0000"&gt;User&lt;/span&gt;", message.getUser());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 13:             gen.writeStringField("&lt;span style="color: #8b0000"&gt;Action&lt;/span&gt;", message.getAction());&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 14:             gen.writeEndObject();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 15:             gen.close();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 16:         } &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (IOException ioe) {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 17:             LOGGER.error(ioe.getMessage(), ioe);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 18:         } &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (SQLException se) {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 19:             LOGGER.error(se.getMessage(), se);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 20:         }&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 21:         &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; String json = writer.getBuffer().toString();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 22:         LOGGER.debug("&lt;span style="color: #8b0000"&gt;[BEGING JSON Format]&lt;/span&gt;");&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 23:         LOGGER.debug(json);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 24:         LOGGER.debug("&lt;span style="color: #8b0000"&gt;[END JSON Format]&lt;/span&gt;");&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 25:         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; json;&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 26:     }&lt;/pre&gt;&lt;/pre&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 590px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1:     &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; sendUDPPacket(&lt;span style="color: #0000ff"&gt;final&lt;/span&gt; Notification_Type message) &lt;span style="color: #0000ff"&gt;throws&lt;/span&gt; SocketException, UnknownHostException,&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2:                                                                          IOException {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  3:         &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; DatagramSocket clientSocket = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DatagramSocket();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  4:         &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; InetAddress IPAddress = InetAddress.getByName(gatewayHost);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  5:         &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[] sendData = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;byte&lt;/span&gt;[1024];&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  6:         &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; String jsonMessage = convertToJSON(message);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  7:         sendData = jsonMessage.getBytes();&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  8:         &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; DatagramPacket sendPacket = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DatagramPacket(sendData, sendData.length, IPAddress, 9876);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  9:         clientSocket.send(sendPacket);&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt; 10:     }&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;I made one little adjustment to the Wrapper files to make them ‘schema’ independent (I pass the schema name from the Proxy class):&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 590px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1: &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Notification_TypeRef &lt;span style="color: #0000ff"&gt;implements&lt;/span&gt; ORAData, ORADataFactory {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2:     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; String _SQL_BASETYPE = AQWebSocketProxy.username + "&lt;span style="color: #8b0000"&gt;.NOTIFICATION_TYPE&lt;/span&gt;";&lt;/pre&gt;&lt;/pre&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 590px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1: &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; Notification_Type &lt;span style="color: #0000ff"&gt;implements&lt;/span&gt; ORAData, ORADataFactory {&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2:     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;final&lt;/span&gt; String _SQL_NAME = AQWebSocketProxy.username + "&lt;span style="color: #8b0000"&gt;.NOTIFICATION_TYPE&lt;/span&gt;";&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;The complete source code of the proxy is available in the download section below. It includes a runnable jar, all the source code, a HTML test page and a complete README file to get you started right away.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;Run the Proxy and test it&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;First run the Kaazing Gateway.&lt;br&gt;Put the HTML5 WebSocket test page (which is included in the zip file –don’t forget to adjust the hostname to point to the Kaazing gateway host) on a webserver and open it in Google Chrome.&lt;br&gt;Then Run the AQWebSocketProxy (I ran it on the same server as the Kaazing gateway):&lt;br&gt;&lt;em&gt;&lt;strong&gt;java -jar AQWebSocketProxy.jar -user scott -pwd tiger -dbhost localhost -dbsid ORCL -queue notification_queue -wsgateway localhost –debug&lt;br&gt;&lt;br&gt;&lt;/strong&gt;&lt;/em&gt;If everything works fine you can now execute PL/SQL code and see the result in your browser.&lt;/p&gt;&lt;pre style="border-bottom: #cecece 1px solid; border-left: #cecece 1px solid; padding-bottom: 5px; background-color: #fbfbfb; min-height: 40px; padding-left: 5px; width: 590px; padding-right: 5px; overflow: auto; border-top: #cecece 1px solid; border-right: #cecece 1px solid; padding-top: 5px"&gt;&lt;pre style="background-color: #fbfbfb; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  1: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=EXEC&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;EXEC&lt;/a&gt; enqueue_notification_type( p_notification  =&amp;gt; notification_type('&lt;span style="color: #8b0000"&gt;DummyAQ&lt;/span&gt;', '&lt;span style="color: #8b0000"&gt;ID&lt;/span&gt;', 1, '&lt;span style="color: #8b0000"&gt;Test 1&lt;/span&gt;', '&lt;span style="color: #8b0000"&gt;SYS&lt;/span&gt;', '&lt;span style="color: #8b0000"&gt;EXEC&lt;/span&gt;'));&lt;br /&gt;&lt;/pre&gt;&lt;pre style="background-color: #ffffff; margin: 0em; width: 100%; font-family: consolas,'Courier New',courier,monospace; font-size: 12px"&gt;  2: &lt;a style="color: #0000ff" href="http://search.microsoft.com/default.asp?so=RECCNT&amp;amp;siteid=us%2Fdev&amp;amp;p=1&amp;amp;nq=NEW&amp;amp;qu=COMMIT&amp;amp;IntlSearch=&amp;amp;boolean=PHRASE&amp;amp;ig=01&amp;amp;i=09&amp;amp;i=99"&gt;COMMIT&lt;/a&gt;;&lt;/pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h3&gt;Download &amp;amp; Documentation&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;The complete source code of the proxy is available &lt;a href="https://docs.google.com/leaf?id=0B_TOoce0vp06ZWIxNjViYjctMjRmNy00MDIxLTkwMzMtYzgxY2U4MDA5Nzlh&amp;amp;hl=enYzgxY2U4MDA5Nzlh&amp;amp;hl=en"&gt;here&lt;/a&gt;, it includes a runnable jar, all the source code, a HTML test page and a complete README file to get you started in seconds.&lt;/p&gt;&lt;br /&gt;&lt;h3&gt;References&lt;/h3&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96587/apexampl.htm"&gt;Oracle Advanced Queuing by Example&lt;/a&gt; &lt;br&gt;&lt;a href="http://www.cs.umbc.edu/portal/help/oracle8/server.815/a68005/ref_java.htm"&gt;Advanced Queuing -- Java API&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10785/jm_opers.htm"&gt;Oracle Streams AQ JMS Interface: Basic Operations&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.akadia.com/services/ora_advanced_queueing.html"&gt;Oracle Advanced Queuing (1)&lt;/a&gt; &lt;br&gt;&lt;a href="http://download.oracle.com/docs/cd/B28359_01/java.111/b31224/streamsaq.htm"&gt;Oracle Advanced Queuing (2)&lt;/a&gt;&lt;br&gt;&lt;a href="http://forums.oracle.com/forums/thread.jspa?threadID=630122"&gt;JPublisher with the 11g database&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.cs.umbc.edu/portal/help/oracle8/server.815/a68001/dbms_aqa.htm"&gt;DBMS_AQADM&lt;/a&gt;&lt;br&gt;&lt;a href="http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10785/aq_opers.htm"&gt;Oracle Streams AQ Operational Interface: Basic Operations&lt;/a&gt;&lt;br&gt;&lt;a href="http://gbowyer.freeshell.org/oracle-aq.html"&gt;oracle aq and java jms&lt;/a&gt;&lt;br&gt;&lt;a href="http://technology.amis.nl/blog/8472/oracle-advanced-queuing-and-jms-bridging-from-aq-to-jms-and-vice-versa"&gt;Oracle Advanced Queuing and JMS&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-5516990379119862198?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/5516990379119862198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2011/05/little-leap-invoking-html5-websocket.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/5516990379119862198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/5516990379119862198'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2011/05/little-leap-invoking-html5-websocket.html' title='A little leap: invoking a HTML5 WebSocket from PL/SQL with Oracle Advanced Queuing (Oracle JMS).'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-3459297543830099315</id><published>2010-07-14T11:03:00.007+02:00</published><updated>2010-07-14T11:56:32.176+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='cms'/><category scheme='http://www.blogger.com/atom/ns#' term='opencmis'/><category scheme='http://www.blogger.com/atom/ns#' term='cmis'/><category scheme='http://www.blogger.com/atom/ns#' term='chemistry'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='alfresco'/><title type='text'>Implementing CMIS</title><content type='html'>&lt;p&gt;Since the first of may the first version of the &lt;a href="http://docs.oasis-open.org/cmis/CMIS/v1.0/os/cmis-spec-v1.0.html"&gt;CMIS spec&lt;/a&gt; is finalized. This new standard is ideally suited for Repository-to-Repository (R2R) and Application-to-Repository (A2R) CMS integration. In this post I’ll try to give you a brief overview of the possibilities and focus points concerning a CMIS integration.&lt;/p&gt;&lt;h4&gt;The specification&lt;/h4&gt;&lt;p&gt;CMIS allows you to communicate with a CMIS compliant CMS via a standard way. The communication can be based on Webs Services or on Restful AtomPub. If you can freely choose between these two technologies I definitely would go for AtomPub because it’s the most complete one (the spec handles AtomPub in almost 100 pages, Web Services takes only 3 pages). &lt;/p&gt;&lt;p&gt;So does a new standard for integrating a CMS solves all your problems/needs? The answer -of course- is No. After reading the spec this is my major concern:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;2.1.1.1 Optional Capabilities “...&lt;b&gt;&lt;u&gt;Thus, a repository implementation may not necessarily be able to support all CMIS capabilities&lt;/u&gt;&lt;/b&gt;. A few CMIS capabilities are therefore “optional” for a repository to be compliant…”&lt;/em&gt; &lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;It states clearly that a compliant CMS not necessarily will support the whole spec. Especially if you have the idea to write an implementation which can handle multiple Content Management Systems at once, this could be a pitfall.&lt;br /&gt;Luckily CMIS has a query service available to retrieve the possibilities of a repository, and it is clear, you should first investigate the repository's possibilities (to figure out how much of the spec is implemented) before integrating a CMS via CMIS. You find the information about this in the spec in the following chapter:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;2.2.2.2 getRepositoryInfo&lt;br /&gt;Description: Returns information about the CMIS repository, the optional capabilities it supports and its Access Control information if applicable.&lt;/em&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h4&gt;Apache Chemistry&lt;/h4&gt;&lt;p&gt;Before going into detail on the architecture I would like to introduce another framework to you: &lt;a href="http://incubator.apache.org/chemistry/index.html"&gt;Apache Chemistry&lt;/a&gt;. if you are a Java, Phyton, PHP or JavaScript developer you have the option to enable your application for CMIS by adding an extra layer based on this framework.&lt;br /&gt;Apache Chemistry provides open source implementations of the &lt;a href="http://docs.oasis-open.org/cmis/CMIS/v1.0/cmis-spec-v1.0.html"&gt;Content Management Interoperability Services (CMIS)&lt;/a&gt; specification. There is an API available for different languages, but since I’m a Java guy, I will only focus on the Java API.&lt;br /&gt;&lt;br /&gt;The Apache Chemistry &lt;u&gt;Java API &lt;/u&gt;is named OpenCMIS.&lt;/p&gt;&lt;h5&gt;OpenCMIS&lt;/h5&gt;&lt;p&gt;OpenCMIS is a collection of Java libraries, frameworks and tools around the CMIS specification and is very complete. The main thing that is lacking for the moment (of course) is documentation. There are three main parts in the OpenCMIS collection: CMIS Client (consisting of &lt;a href="http://incubator.apache.org/opencmis-client-api.html"&gt;Client API&lt;/a&gt; and &lt;a href="http://incubator.apache.org/opencmis-client-bindings.html"&gt;Client Bindings API&lt;/a&gt;), OpenCMIS &lt;a href="http://incubator.apache.org/opencmis-server-framework.html"&gt;Server Framework&lt;/a&gt; and &lt;a href="http://incubator.apache.org/opencmis-browser.html"&gt;CMIS Browser&lt;/a&gt;. In this blog post I will only focus on the CMIS Client.&lt;/p&gt;&lt;h5&gt;OpenCMIS Client&lt;/h5&gt;&lt;p&gt;As said before the OpenCMIS Client contains two separate API’s: the Client API and the Client Bindings API.&lt;br /&gt;The OpenCMIS Client Bindings API hides the CMIS AtomPub and Web Services bindings and provides an interface that is very similar to the &lt;a href="http://docs.oasis-open.org/cmis/CMIS/v1.0/cs01/cmis-spec-v1.0.html#_Toc243905381"&gt;CMIS domain model&lt;/a&gt;. The services, operations, parameters, and structures are named after the CMIS domain model and behave as described in the CMIS specification.&lt;/p&gt;&lt;p&gt;The primary objective of the Client Bindings API is to be complete, covering all CMIS operations and extension points. The result is a somewhat clunky interface. The &lt;u&gt;Client API&lt;/u&gt; sits on top of the Binding API and exposes a nicer and simpler to use interface. It &lt;u&gt;is the better choice for most applications&lt;/u&gt;.&lt;/p&gt;&lt;h4&gt;Architectures&lt;/h4&gt;&lt;h5&gt;A2R (Application-to-Repository)&lt;/h5&gt;&lt;p&gt;&lt;a href="http://lh3.ggpht.com/_kBXpBgSenK0/TD19UqoTuNI/AAAAAAAAAFo/z-tCj4R5LJA/s1600-h/arch36.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="arch3" border="0" alt="arch3" src="http://lh3.ggpht.com/_kBXpBgSenK0/TD19VXkM0bI/AAAAAAAAAFs/vZCAvebvkUg/arch3_thumb4.png?imgmax=800" width="401" height="191" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;h5&gt;A2R (with OpenCMIS)&lt;/h5&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_kBXpBgSenK0/TD19XWChdoI/AAAAAAAAAFw/3P4mUNl1g4E/s1600-h/arch44.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="arch4" border="0" alt="arch4" src="http://lh5.ggpht.com/_kBXpBgSenK0/TD19Yu89aOI/AAAAAAAAAF0/geLjAhKTGqc/arch4_thumb2.png?imgmax=800" width="414" height="273" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;h5&gt;R2R (Repository-to-Repository)&lt;/h5&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_kBXpBgSenK0/TD19ZH1eLPI/AAAAAAAAAF4/2udnjoHCvSQ/s1600-h/arch54.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="arch5" border="0" alt="arch5" src="http://lh6.ggpht.com/_kBXpBgSenK0/TD19Z-IxNHI/AAAAAAAAAF8/VsD7Vi5w-0A/arch5_thumb2.png?imgmax=800" width="424" height="179" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;h4&gt;Put it all in practice&lt;/h4&gt;&lt;p&gt;Since there’s almost no documentation available at this point I’ll share some code with you. It’s not too hard to get something working but most of the time to get there you have to dive in the source code of OpenCMIS from time to time.&lt;br /&gt;In contrast to the OpenCMIS documentation the CMIS spec however is very complete, and there are a lot of useful examples based on AtomPub.&lt;/p&gt;&lt;p&gt;Another big help is the Alfresco Website, there even is a test site which you can use to test you implementation.&lt;/p&gt;&lt;h5&gt;The code&lt;/h5&gt;&lt;h5&gt;Java imports:&lt;/h5&gt;&lt;div style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; DIRECTION: ltr; MAX-HEIGHT: 200px; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px; BACKGROUND-: 20px 0px 10pxfont-family:'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;" id="codeSnippetWrapper"   &gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;" id="codeSnippet"  &gt;&lt;span style="color:#0000ff;"&gt;import&lt;/span&gt; org.apache.chemistry.opencmis.client.api.CmisObject;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;import&lt;/span&gt; org.apache.chemistry.opencmis.client.api.ItemIterable;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;import&lt;/span&gt; org.apache.chemistry.opencmis.client.api.ObjectId;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;import&lt;/span&gt; org.apache.chemistry.opencmis.client.api.QueryResult;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;import&lt;/span&gt; org.apache.chemistry.opencmis.client.api.Session;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;import&lt;/span&gt; org.apache.chemistry.opencmis.client.api.SessionFactory;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;import&lt;/span&gt; org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;import&lt;/span&gt; org.apache.chemistry.opencmis.commons.SessionParameter;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;import&lt;/span&gt; org.apache.chemistry.opencmis.commons.enums.BindingType;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h5&gt;Connecting to a repository:&lt;/h5&gt;&lt;div style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; DIRECTION: ltr; MAX-HEIGHT: 200px; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px; BACKGROUND-: 20px 0px 10pxfont-family:'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;" id="codeSnippetWrapper"   &gt;&lt;br /&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;" id="codeSnippet"  &gt;SessionFactory f = SessionFactoryImpl.newInstance();&lt;br /&gt;Map&amp;lt;String, String&amp;gt; parameter = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HashMap&amp;lt;String, String&amp;gt;();&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;//user credentials&lt;/span&gt;&lt;br /&gt;parameter.put(SessionParameter.USER, &lt;span style="color:#006080;"&gt;"admin"&lt;/span&gt;);&lt;br /&gt;parameter.put(SessionParameter.PASSWORD, &lt;span style="color:#006080;"&gt;"admin"&lt;/span&gt;);&lt;br /&gt;parameter.put(SessionParameter.BINDING_TYPE, BindingType.ATOMPUB.value());&lt;br /&gt;parameter.put(SessionParameter.ATOMPUB_URL,&lt;br /&gt;    &lt;span style="color:#006080;"&gt;"http://a.url.be:8888/alfresco/service/cmis"&lt;/span&gt;);&lt;br /&gt;parameter.put(SessionParameter.REPOSITORY_ID,&lt;br /&gt;    &lt;span style="color:#006080;"&gt;"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;//session locale&lt;/span&gt;&lt;br /&gt;parameter.put(SessionParameter.LOCALE_ISO3166_COUNTRY, &lt;span style="color:#006080;"&gt;"BE"&lt;/span&gt;);&lt;br /&gt;parameter.put(SessionParameter.LOCALE_ISO639_LANGUAGE, &lt;span style="color:#006080;"&gt;"nl"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#008000;"&gt;// create session&lt;/span&gt;&lt;br /&gt;Session s = f.createSession(parameter);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h5&gt;Retrieve a folder:&lt;/h5&gt;&lt;div style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; DIRECTION: ltr; MAX-HEIGHT: 200px; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px; BACKGROUND-: 20px 0px 10pxfont-family:'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;" id="codeSnippetWrapper"   &gt;&lt;br /&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;" id="codeSnippet"  &gt;&lt;span style="color:#008000;"&gt;//Retrieve a Folder&lt;/span&gt;&lt;br /&gt;ObjectId objectID =&lt;br /&gt;    s.createObjectId(&lt;span style="color:#006080;"&gt;"workspace://SpacesStore/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"&lt;/span&gt;);&lt;br /&gt;CmisObject CO = s.getObject(objectID);&lt;br /&gt;System.out.println(CO.getName());&lt;br /&gt;System.out.println(CO.getType().getDescription());&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;h5&gt;Query the repository: &lt;/h5&gt;&lt;div style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; DIRECTION: ltr; MAX-HEIGHT: 200px; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px; BACKGROUND-: 20px 0px 10pxfont-family:'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;" id="codeSnippetWrapper"   &gt;&lt;br /&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;" id="codeSnippet"  &gt;ItemIterable&amp;lt;QueryResult&amp;gt; q =&lt;br /&gt;    s.query(&lt;span style="color:#006080;"&gt;"SELECT * FROM cmis:document WHERE CONTAINS('RS232') AND "&lt;/span&gt; +&lt;br /&gt;    &lt;span style="color:#006080;"&gt;"cmis:createdBy = 'admin' AND IN_FOLDER("&lt;/span&gt; +&lt;br /&gt;    &lt;span style="color:#006080;"&gt;"'workspace://SpacesStore/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx')"&lt;/span&gt;, true);&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; i = 0;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;for&lt;/span&gt; (QueryResult qr : q) {&lt;br /&gt;    System.out.println(&lt;span style="color:#006080;"&gt;"--&amp;gt;"&lt;/span&gt;);&lt;br /&gt;    System.out.println(qr.getPropertyById(&lt;span style="color:#006080;"&gt;"cmis:objectTypeId"&lt;/span&gt;).getFirstValue());&lt;br /&gt;    System.out.println(qr.getPropertyById(&lt;span style="color:#006080;"&gt;"cmis:name"&lt;/span&gt;).getFirstValue());&lt;br /&gt;    System.out.println(qr.getPropertyById(&lt;span style="color:#006080;"&gt;"cmis:createdBy"&lt;/span&gt;).getFirstValue());&lt;br /&gt;    System.out.println(qr.getPropertyById(&lt;span style="color:#006080;"&gt;"cmis:objectId"&lt;/span&gt;).getFirstValue());&lt;br /&gt;    System.out.println(qr.getPropertyById(&lt;span style="color:#006080;"&gt;"cmis:contentStreamFileName"&lt;/span&gt;)&lt;br /&gt;        .getFirstValue());&lt;br /&gt;    System.out.println(qr.getPropertyById(&lt;span style="color:#006080;"&gt;"cmis:contentStreamMimeType"&lt;/span&gt;)&lt;br /&gt;        .getFirstValue());&lt;br /&gt;    System.out.println(qr.getPropertyById(&lt;span style="color:#006080;"&gt;"cmis:contentStreamLength"&lt;/span&gt;)&lt;br /&gt;        .getFirstValue());&lt;br /&gt;    System.out.println(qr.getPropertyById(&lt;span style="color:#006080;"&gt;"cmis:contentStreamId"&lt;/span&gt;).getFirstValue());&lt;br /&gt;    System.out.println(&lt;span style="color:#006080;"&gt;"--------------------------------------------------------"&lt;/span&gt;);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt&lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;&lt;h5&gt;Insert a new document:&lt;/h5&gt;&lt;div style="BORDER-BOTTOM: silver 1px solid; TEXT-ALIGN: left; BORDER-LEFT: silver 1px solid; PADDING-BOTTOM: 4px; LINE-HEIGHT: 12pt; PADDING-LEFT: 4px; WIDTH: 97.5%; PADDING-RIGHT: 4px; DIRECTION: ltr; MAX-HEIGHT: 200px; OVERFLOW: auto; BORDER-TOP: silver 1px solid; CURSOR: text; BORDER-RIGHT: silver 1px solid; PADDING-TOP: 4px; BACKGROUND-: 20px 0px 10pxfont-family:'Courier New', courier, monospace;font-size:8pt;color:#f4f4f4;" id="codeSnippetWrapper"   &gt;&lt;br /&gt;&lt;pre style="BORDER-BOTTOM-STYLE: none; TEXT-ALIGN: left; PADDING-BOTTOM: 0px; LINE-HEIGHT: 12pt; BORDER-RIGHT-STYLE: none; BACKGROUND-COLOR: #f4f4f4; MARGIN: 0em; PADDING-LEFT: 0px; WIDTH: 100%; PADDING-RIGHT: 0px; DIRECTION: ltr; BORDER-TOP-STYLE: none; BORDER-LEFT-STYLE: none; OVERFLOW: visiblefont-size:8pt;color:black;" id="codeSnippet"  &gt;&lt;span style="color:#008000;"&gt;//Insert new document&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#0000ff;"&gt;try&lt;/span&gt; {&lt;br /&gt;    File file = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; File(&lt;span style="color:#006080;"&gt;"C:\\afile.pdf"&lt;/span&gt;);&lt;br /&gt;    Map&amp;lt;String, String&amp;gt; properties = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; HashMap&amp;lt;String, String&amp;gt;();&lt;br /&gt;    properties.put(PropertyIds.NAME, file.getName());&lt;br /&gt;    properties.put(PropertyIds.CHECKIN_COMMENT, &lt;span style="color:#006080;"&gt;""&lt;/span&gt;);&lt;br /&gt;    properties.put(PropertyIds.OBJECT_TYPE_ID, ObjectType.DOCUMENT_BASETYPE_ID);&lt;br /&gt;    ContentStream contentStream = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ContentStreamImpl(file.getName(),&lt;br /&gt;        BigInteger.valueOf(file.length()),&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; MimetypesFileTypeMap().getContentType(file), &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; FileInputStream(file));&lt;br /&gt;    session.createDocument(properties,&lt;br /&gt;    session.createObjectId(&lt;span style="color:#006080;"&gt;"workspace://SpacesStore/xxxxx-xxxx-xxxx-xxxx-xxxxxxx"&lt;/span&gt;),&lt;br /&gt;        contentStream, VersioningState.MAJOR, &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ArrayList(), &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ArrayList(),&lt;br /&gt;        &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; ArrayList());&lt;br /&gt;} &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt; (Exception e) {&lt;br /&gt;    e.printStackTrace();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;style type="text/css"&gt;&lt;br /&gt;&lt;br /&gt;.csharpcode, .csharpcode pre&lt;br /&gt;{&lt;br /&gt; font-size: small;&lt;br /&gt; color: black;&lt;br /&gt; font-family: consolas, "Courier New", courier, monospace;&lt;br /&gt; background-color: #ffffff;&lt;br /&gt; /*white-space: pre;*/&lt;br /&gt;}&lt;br /&gt;.csharpcode pre { margin: 0em; }&lt;br /&gt;.csharpcode .rem { color: #008000; }&lt;br /&gt;.csharpcode .kwrd { color: #0000ff; }&lt;br /&gt;.csharpcode .str { color: #006080; }&lt;br /&gt;.csharpcode .op { color: #0000c0; }&lt;br /&gt;.csharpcode .preproc { color: #cc6633; }&lt;br /&gt;.csharpcode .asp { background-color: #ffff00; }&lt;br /&gt;.csharpcode .html { color: #800000; }&lt;br /&gt;.csharpcode .attr { color: #ff0000; }&lt;br /&gt;.csharpcode .alt&lt;br /&gt;{&lt;br /&gt; background-color: #f4f4f4;&lt;br /&gt; width: 100%;&lt;br /&gt; margin: 0em;&lt;br /&gt;}&lt;br /&gt;.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;br /&gt;That’s all for the moment folks.&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;References&lt;/h5&gt;&lt;p&gt;CMIS Specification: &lt;a href="http://docs.oasis-open.org/cmis/CMIS/v1.0/cmis-spec-v1.0.pdf"&gt;http://docs.oasis-open.org/cmis/CMIS/v1.0/cmis-spec-v1.0.pdf&lt;/a&gt;&lt;br /&gt;Apache Chemistry: &lt;a href="https://cwiki.apache.org/CMIS/index.html"&gt;https://cwiki.apache.org/CMIS/index.html&lt;/a&gt;&lt;br /&gt;Alfresco: &lt;a href="http://cmis.alfresco.com/"&gt;http://cmis.alfresco.com/&lt;/a&gt;, &lt;a href="http://wiki.alfresco.com/wiki/CMIS"&gt;http://wiki.alfresco.com/wiki/CMIS&lt;/a&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-3459297543830099315?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/3459297543830099315/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2010/07/implementing-cmis.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/3459297543830099315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/3459297543830099315'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2010/07/implementing-cmis.html' title='Implementing CMIS'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_kBXpBgSenK0/TD19VXkM0bI/AAAAAAAAAFs/vZCAvebvkUg/s72-c/arch3_thumb4.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-3627213914155790879</id><published>2010-06-22T11:32:00.007+02:00</published><updated>2010-06-22T11:37:53.852+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='jbpm'/><category scheme='http://www.blogger.com/atom/ns#' term='mail'/><title type='text'>jBPM Custom Mail Producer</title><content type='html'>&lt;p&gt;As stated in the jBPM developers guide (&lt;a href="http://docs.jboss.com/jbpm/v4/devguide/html_single/#customproducers"&gt;13.4.1. Custom Producers&lt;/a&gt;) it is possible to plug in your own custom mail producer. &lt;/p&gt;&lt;p&gt;However, the topic in the developers guide is very brief and just by implementing the interface or extending the MailProducerImpl your code won’t work. &lt;/p&gt;&lt;p&gt;Option one: “Google”…. No luck this time - makes me wondering how many people really use jBPM 4? &lt;/p&gt;&lt;p&gt;Second option: diving into the source code myself and complete the puzzle on my own. After a couple of hours I came to a solutions that does the trick. &lt;/p&gt;&lt;p&gt;As you can see in the source code instantiating a mail provider is done in org.jbpm.jpdl.internal.xml.JpdlParser:&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh5.ggpht.com/_kBXpBgSenK0/TCCDFESE6hI/AAAAAAAAAEo/gakXU5Xrd1Y/s1600-h/C1%5B7%5D.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: 0px; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: 0px" title="C1" border="0" alt="C1" src="http://lh6.ggpht.com/_kBXpBgSenK0/TCCDGLn1QiI/AAAAAAAAAEs/ItSfVKKOX98/C1_thumb%5B5%5D.png?imgmax=800" width="299" height="143" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;So to enable a process to use a custom mail producer you extend the notification node with a class attribute as shown below: &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_kBXpBgSenK0/TCCDG0vOz8I/AAAAAAAAAEw/Nc2AwhXNHyE/s1600-h/J1%5B2%5D.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="J1" border="0" alt="J1" src="http://lh4.ggpht.com/_kBXpBgSenK0/TCCDHaA2dLI/AAAAAAAAAE0/uZuDfjhkJE8/J1_thumb.png?imgmax=800" width="244" height="128" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;So far, so good.&lt;br /&gt;Final step: writing your custom producer.&lt;br /&gt;I started simply by creating an empty class which extends from MailProducerImpl : &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh4.ggpht.com/_kBXpBgSenK0/TCCDHi3htUI/AAAAAAAAAE4/XYTSXxT2d-w/s1600-h/C2%5B2%5D.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="C2" border="0" alt="C2" src="http://lh4.ggpht.com/_kBXpBgSenK0/TCCDIrmBVvI/AAAAAAAAAE8/M3kuT75FzGE/C2_thumb.png?imgmax=800" width="256" height="40" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Running my code however resulted in the following error: &lt;em&gt;Exception in thread "main" java.lang.NullPointerException&lt;br /&gt;at org.jbpm.pvm.internal.email.impl.MailProducerImpl.fillFrom(MailProducerImpl.java:97)…&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_kBXpBgSenK0/TCCDJan88-I/AAAAAAAAAFA/Ebl_d9mju8M/s1600-h/C3%5B2%5D.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="C3" border="0" alt="C3" src="http://lh6.ggpht.com/_kBXpBgSenK0/TCCDKAA9MLI/AAAAAAAAAFE/WZgeFBBn-fY/C3_thumb.png?imgmax=800" width="244" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;It learned me that in case of specifying a custom mail producer a mail template is not set.&lt;br /&gt;org.jbpm.jpdl.internal.xml.JpdlParser:&lt;br /&gt;&lt;/p&gt;&lt;a href="http://lh5.ggpht.com/_kBXpBgSenK0/TCCDKcKvk_I/AAAAAAAAAFI/MROJzu0maGw/s1600-h/C4%5B2%5D.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="C4" border="0" alt="C4" src="http://lh3.ggpht.com/_kBXpBgSenK0/TCCDKyinZfI/AAAAAAAAAFM/OIdb_ITUhcU/C4_thumb.png?imgmax=800" width="244" height="103" /&gt;&lt;/a&gt; &lt;p&gt;&lt;/p&gt;&lt;p&gt;To solve this error adjust the constructor of the mail producer by adding the following code: &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_kBXpBgSenK0/TCCDLZPIVzI/AAAAAAAAAFQ/qJ_Nmpfvb-0/s1600-h/C5%5B2%5D.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="C5" border="0" alt="C5" src="http://lh6.ggpht.com/_kBXpBgSenK0/TCCDLxhqY8I/AAAAAAAAAFU/fMYhPiyFlIs/C5_thumb.png?imgmax=800" width="244" height="147" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;At the end this is how my &lt;a href="http://docs.google.com/leaf?id=0B_TOoce0vp06YTZkYTM2YTktNDcxNS00YTBhLTk1ZjMtZTQ2YzVmZTUxNjdk&amp;amp;hl=en"&gt;Mail producer&lt;/a&gt; looks like (it is still extended from the default mail producer but at this point just implementing the interface would probably do the trick)&lt;/p&gt;&lt;p&gt;Last thing I want to mention is the override of the produce method. In that method I retrieve the current task from the TaskContext. This opens the possibility to use it in the other methods of the class . (Below also a code snippet from the org.jbpm.jpdl.internal.activity.MailListener which is responsible for maintaining the TaskContext).&lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_kBXpBgSenK0/TCCDMD_hYtI/AAAAAAAAAFY/88SSeTOgmTs/s1600-h/C6%5B2%5D.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="C6" border="0" alt="C6" src="http://lh5.ggpht.com/_kBXpBgSenK0/TCCDNB-ce8I/AAAAAAAAAFc/30K3uREqsAc/C6_thumb.png?imgmax=800" width="244" height="68" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&lt;a href="http://lh6.ggpht.com/_kBXpBgSenK0/TCCDOSJ0S7I/AAAAAAAAAFg/Q5NZ9K2hyxQ/s1600-h/C7%5B2%5D.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="C7" border="0" alt="C7" src="http://lh5.ggpht.com/_kBXpBgSenK0/TCCDO-25IeI/AAAAAAAAAFk/0ud6EegCHZs/C7_thumb.png?imgmax=800" width="228" height="244" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Now you can spam yourself while testing and fine tuning your code :-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-3627213914155790879?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/3627213914155790879/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2010/06/jbpm-custom-mail-producer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/3627213914155790879'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/3627213914155790879'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2010/06/jbpm-custom-mail-producer.html' title='jBPM Custom Mail Producer'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_kBXpBgSenK0/TCCDGLn1QiI/AAAAAAAAAEs/ItSfVKKOX98/s72-c/C1_thumb%5B5%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-8291543738175008982</id><published>2010-06-09T14:36:00.003+02:00</published><updated>2010-06-09T14:39:13.215+02:00</updated><title type='text'>5 things you should know when developing products with ADF11g</title><content type='html'>I’m trying to get this talk into OOW via Oracle Mix. So If you want to see my talk: 5 things you should know when developing products with ADF11g you should take a minute or 2 and vote for it.&lt;br /&gt;&lt;br /&gt;&lt;a href="https://mix.oracle.com/oow10/proposals"&gt;https://mix.oracle.com/oow10/proposals&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-8291543738175008982?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/8291543738175008982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2010/06/5-things-you-should-know-when.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/8291543738175008982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/8291543738175008982'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2010/06/5-things-you-should-know-when.html' title='5 things you should know when developing products with ADF11g'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-3394016489108740509</id><published>2010-03-04T21:02:00.002+01:00</published><updated>2010-03-04T21:13:08.638+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='hotspot'/><category scheme='http://www.blogger.com/atom/ns#' term='garbage collection'/><title type='text'>Java Memory Management</title><content type='html'>When writing programs it’s always good to know what’s happing in the core of the Framework you’re using. This allow you to get a better idea why things happen in a certain way or what to do in case you receive an error.&lt;br /&gt;&lt;br /&gt;So if you’re a java programmer a good thing to read is &lt;a href="http://java.sun.com/javase/technologies/hotspot/gc/memorymanagement_whitepaper.pdf"&gt;this paper on memory management in the Virtual machine&lt;/a&gt;. It has a short introduction, a brief overview of the concepts and later on it dives a little deeper with an overview on the different garbage collectors and a chapter on ergonomics. At the end you get some tips and recommendations. &lt;br /&gt;&lt;br /&gt;Chapter 6 also contains the paragraph ‘What to Do about OutOfMemoryError’ helpful for us all I think :-) (especially when you’ve ever have used BufferedImage)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://java.sun.com/javase/technologies/hotspot/gc/index.jsp"&gt;Here&lt;/a&gt; you can find more information on Java HotSpot Garbage Collection.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-3394016489108740509?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/3394016489108740509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2010/03/java-memory-management.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/3394016489108740509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/3394016489108740509'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2010/03/java-memory-management.html' title='Java Memory Management'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-3281120878413429920</id><published>2010-02-22T01:33:00.001+01:00</published><updated>2010-02-22T02:07:20.753+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='deploy'/><category scheme='http://www.blogger.com/atom/ns#' term='adf'/><category scheme='http://www.blogger.com/atom/ns#' term='wlst'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><title type='text'>ADF automated deployment: Hudson and WLST</title><content type='html'>As I told in my previous post on Hudson I had the wish/idea to extend my Hudson build script in a way that it would fully automate the deployment of the ear file to a WebLogic server.&lt;br /&gt;&lt;br /&gt;So I gave it a try…&lt;br /&gt;&lt;br /&gt;With the help of a &lt;a href="http://jaysensharma.wordpress.com/2009/12/08/recursive-deployment-using-wlst/"&gt;blog post of Jay senSharma&lt;/a&gt;  it actually was quite an easy job.&lt;br /&gt;&lt;br /&gt;Step 1:&lt;br /&gt;I copied the MIDDLEWARE_HOME\wlserver_10.3\server\bin\setWLSEnv.cmd to C:\Hudson_Slave_Node\workspace, and renamed it to deployWLS.cmd&lt;br /&gt;&lt;br /&gt;Step 2&lt;br /&gt;I created a python script file called deployDummy.py and added it to the same directory.&lt;br /&gt;&lt;br /&gt;This is the content of the python file&lt;br /&gt;&lt;strong&gt;connect('weblogic','weblogic1','t3://localhost:7101')&lt;br /&gt;edit()&lt;br /&gt;startEdit()&lt;br /&gt;deploy('dummy_application1','C:\Hudson_Slave_Node\workspace\trunk\dummy.ear',targets='DefaultServer')&lt;br /&gt;save()&lt;br /&gt;activate()&lt;br /&gt;startApplication(' dummy_application1')&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_kBXpBgSenK0/S4HRKOCmZfI/AAAAAAAAADI/OSXkb-xyEis/s1600-h/ss4.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 194px;" src="http://2.bp.blogspot.com/_kBXpBgSenK0/S4HRKOCmZfI/AAAAAAAAADI/OSXkb-xyEis/s320/ss4.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5440859798338168306" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Step 3:&lt;br /&gt;I changed the bottom of deployWLS.cmd to look like:&lt;br /&gt;…&lt;br /&gt;@echo Your environment has been set.&lt;br /&gt;&lt;br /&gt;@echo Deploy to WLS&lt;br /&gt;&lt;strong&gt;java weblogic.WLST C:\Hudson_Slave_Node\workspace\deployDummy.py&lt;/strong&gt;&lt;br /&gt;@echo Deploy to WLS Finished&lt;br /&gt;&lt;br /&gt;:finish&lt;br /&gt;&lt;br /&gt;Step 4: &lt;br /&gt;I added a new ‘Windows batch command’ Build step in Hudson that executes the deployWLS.cmd file.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_kBXpBgSenK0/S4HWzZinb8I/AAAAAAAAADo/FT1yQQJBYVs/s1600-h/ss1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 82px;" src="http://4.bp.blogspot.com/_kBXpBgSenK0/S4HWzZinb8I/AAAAAAAAADo/FT1yQQJBYVs/s320/ss1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5440866003358019522" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Step 5:&lt;br /&gt;Grab a pint of (Belgium) Beer, sit down, relax and see how the job is now done for you... :-)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;If you receive the following error:&lt;br /&gt;&lt;br /&gt;weblogic.application.ModuleException: &lt;br /&gt;at weblogic.jdbc.module.JDBCModule.prepare(JDBCModule.java:290)&lt;br /&gt;at weblogic.application.internal.flow.ModuleListenerInvoker.prepare ModuleListenerInvoker.java:93)&lt;br /&gt;...&lt;br /&gt;at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)&lt;br /&gt;Caused by: weblogic.common.ResourceException: java.security.PrivilegedActionException: weblogic.common.ResourceException: java.security.PrivilegedActionException: weblogic.common.ResourceException: No credential mapper entry found for password indirection user=cm for data source CM&lt;br /&gt;at weblogic.jdbc.common.internal.DataSourceConnectionPoolConfig.getPoolProperties(DataSourceConnectionPoolConfig.java:84)&lt;br /&gt;...&lt;br /&gt;at weblogic.jdbc.module.JDBCModule.prepare(JDBCModule.java:252)&lt;br /&gt;&lt;br /&gt;You have to adjust your application properties in a way that they‘ll not include the weblogic-jdbc.xml. It’s not possible to automatically deploy your ear file with this option. So uncheck this option and add a DataSource with the correct JNDI name via the WLS console.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_kBXpBgSenK0/S4HTZzmGc8I/AAAAAAAAADY/gjxT6Ho8u6A/s1600-h/ss3.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 230px;" src="http://1.bp.blogspot.com/_kBXpBgSenK0/S4HTZzmGc8I/AAAAAAAAADY/gjxT6Ho8u6A/s320/ss3.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5440862265140474818" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_kBXpBgSenK0/S4HTaZfJMiI/AAAAAAAAADg/O9a1OgU4Jl4/s1600-h/ss2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 156px;" src="http://2.bp.blogspot.com/_kBXpBgSenK0/S4HTaZfJMiI/AAAAAAAAADg/O9a1OgU4Jl4/s320/ss2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5440862275311841826" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;References&lt;br /&gt;&lt;a href="http://jaysensharma.wordpress.com/"&gt;Jaysensharma's Blog&lt;/a&gt;&lt;br /&gt;&lt;a href="http://forums.oracle.com/forums/forum.jspa?forumID=598&amp;start=0"&gt;Forum: WebLogic Server - Upgrade / Install / Environment / Migration&lt;/a&gt; &lt;br /&gt;&lt;a href="http://forums.oracle.com/forums/message.jspa?messageID=4098206#4098206"&gt;Thread: WLST to deploy ear file&lt;/a&gt;&lt;br /&gt;&lt;a href="http://download-llnw.oracle.com/docs/cd/E12840_01/wls/docs103/config_scripting/using_WLST.html"&gt;Using the WebLogic Scripting Tool&lt;/a&gt;&lt;br /&gt;&lt;a href="http://download.oracle.com/docs/cd/E13222_01/wls/docs90/config_scripting/reference.html"&gt;WLST Command and Variable Reference&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-3281120878413429920?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/3281120878413429920/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2010/02/adf-automated-deployment-hudson-and.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/3281120878413429920'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/3281120878413429920'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2010/02/adf-automated-deployment-hudson-and.html' title='ADF automated deployment: Hudson and WLST'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kBXpBgSenK0/S4HRKOCmZfI/AAAAAAAAADI/OSXkb-xyEis/s72-c/ss4.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-5014338939320535272</id><published>2010-02-14T13:49:00.000+01:00</published><updated>2010-02-14T14:01:55.012+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='adf'/><category scheme='http://www.blogger.com/atom/ns#' term='methodology'/><category scheme='http://www.blogger.com/atom/ns#' term='customization'/><title type='text'>ADF Methodology: Customization</title><content type='html'>I started a &lt;a href="http://groups.google.com/group/adf-methodology/browse_thread/thread/3b92cc897e89763d"&gt;new thread&lt;/a&gt; in the &lt;a href="http://groups.google.com/group/adf-methodology"&gt;ADF Enterprise Methodology Group&lt;/a&gt; about customization.&lt;br /&gt;&lt;br /&gt;I’ll share my question also here on my blog. If you would like to comment on this subject I suggest you do it in the thread at the ADF Enterprise Methodology Group.&lt;br /&gt;&lt;br /&gt;This is the question...&lt;br /&gt;&lt;br /&gt;Hi All,&lt;br /&gt;We’re currently developing a product with ADF 11g technology (Rich Faces/BC).We already finished our first version and are busy with our first customer’s implementations. Since it’s a product it’s the idea to have the same basic product (core) installed for all the customers (for a specific version) and to do individual customizations (if necessary) for each one of them.&lt;br /&gt;&lt;br /&gt;For the customizations there are two important requirements:&lt;br /&gt;-The implementation has to be maintainable (we don’t’ want to do bugfixing for each individual implementation but only in our shared product core). So the implementations of the customizations have to guarantee not to pollute the product core.&lt;br /&gt;-Secondly our product has to remain upgradeable. If our product core evolves to a new version it has to be possible to do an upgrade without rewriting the customizations.&lt;br /&gt;&lt;br /&gt;To achieve this we already used the following strategy:&lt;br /&gt;-The use of flexible fields and flexible tab pages (which doesn’t require any coding)&lt;br /&gt;-The use of a Business rules engine&lt;br /&gt;-The use of a flexible BPM engine&lt;br /&gt;&lt;br /&gt;This makes it possible to reduce the amount of necessary customizations to a minimum but as always extra customization is sometimes needed. (For example the integration with another system, an extra application, ... )For these we still have two ideas/options:&lt;br /&gt;-Modularization (this  subject probably needs a thread for its own)&lt;br /&gt;-MDS: first consideration here is that every site customization is implemented in the same code base, so with every customization our core would grow bigger and bigger….and therefore MDS seems not to be an option.&lt;br /&gt;&lt;br /&gt;So the main question is how to approach customization? Are we making the wrong considerations? Are there other options?&lt;br /&gt;&lt;br /&gt;The ideal world would give us the possibility to have our core packaged in a separate install (ear file), and to lets us do our customizations in a separate workspace with the possibility to override most of the core functionality… Is this possible within ADF?&lt;br /&gt;&lt;br /&gt;Note: for clarity we are not speaking about personalization here (and the MDS possibilities for this issue).&lt;br /&gt;&lt;br /&gt;Regards,&lt;br /&gt;Gert&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-5014338939320535272?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/5014338939320535272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2010/02/adf-methodology-customization.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/5014338939320535272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/5014338939320535272'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2010/02/adf-methodology-customization.html' title='ADF Methodology: Customization'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-1824228247161818757</id><published>2010-02-12T18:37:00.000+01:00</published><updated>2010-02-12T18:57:34.560+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ojdeploy'/><category scheme='http://www.blogger.com/atom/ns#' term='hudson'/><category scheme='http://www.blogger.com/atom/ns#' term='jdeveloper'/><category scheme='http://www.blogger.com/atom/ns#' term='continuous integration'/><title type='text'>JDeveloper &amp; Hudson</title><content type='html'>Since a while I was looking for a description on how to do continuous integration with Hudson based on a JDeveloper project without any luck.&lt;br /&gt;&lt;br /&gt;Last Wednesday however I read the blog post of Geoff Waymark &lt;a href="http://geoffadf.blogspot.com/2010/02/ultra-quick-hudson-setup-to-build.html"&gt;‘Ultra quick Hudson setup to build a JDeveloper ADF application’&lt;/a&gt; and in no time I fished the job.&lt;br /&gt;Geoff’s blog post is very complete and detailed but since I was not familiar with Hudson and scripting at all, I’ will go on a bit more detail on Hudson’s workspace variable and ojdeploy.&lt;br /&gt;&lt;br /&gt;The %WORKSPACE% variable just represents the directory specified under ‘Remote FS root’ completed with your ‘Project name’.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/_kBXpBgSenK0/S3WV17za3EI/AAAAAAAAACo/3k8GPO1f0Iw/s1600-h/hudson+1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 99px;" src="http://1.bp.blogspot.com/_kBXpBgSenK0/S3WV17za3EI/AAAAAAAAACo/3k8GPO1f0Iw/s320/hudson+1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5437416878938709058" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_kBXpBgSenK0/S3WWCoe0_RI/AAAAAAAAACw/ObR52P9WM9U/s1600-h/hudson2.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 91px;" src="http://2.bp.blogspot.com/_kBXpBgSenK0/S3WWCoe0_RI/AAAAAAAAACw/ObR52P9WM9U/s320/hudson2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5437417097090366738" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So in my case C:\Hudson_Slave_Node\dummy-trunk&lt;br /&gt;&lt;br /&gt;Secondly to get the Windows batch command right I read Steve Muench blog post ‘&lt;a href="http://blogs.oracle.com/smuenchadf/2009/11/online_help_for_ojdeploy_utili.html"&gt;Online Help for ojdeploy Utility’ &lt;/a&gt;which brought me to the JDeveloper Help page ‘About Deploying from the Command Line’.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_kBXpBgSenK0/S3WWQUJLPGI/AAAAAAAAAC4/aUvUOMDd1gk/s1600-h/help.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 138px;" src="http://4.bp.blogspot.com/_kBXpBgSenK0/S3WWQUJLPGI/AAAAAAAAAC4/aUvUOMDd1gk/s320/help.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5437417332149009506" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;There you can find all the info you need to know about the ojdeploy utility.&lt;br /&gt;You find the profile parameter under ‘Application Properties ’ &gt; ‘Deploy’.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_kBXpBgSenK0/S3WWazKD_DI/AAAAAAAAADA/2Z67TXCp-pI/s1600-h/app_deploy.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 216px;" src="http://2.bp.blogspot.com/_kBXpBgSenK0/S3WWazKD_DI/AAAAAAAAADA/2Z67TXCp-pI/s320/app_deploy.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5437417512272919602" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is my batch code:&lt;br /&gt;del *.ear&lt;br /&gt;%OJDEPLOY% -profile dummy_application1 -workspace %WORKSPACE%\trunk\dummy.jws&lt;br /&gt;copy %WORKSPACE%\trunk\deploy\*.ear %WORKSPACE%&lt;br /&gt;rmdir /S /Q %WORKSPACE%\trunk&lt;br /&gt;&lt;br /&gt;Job’s done.&lt;br /&gt;&lt;br /&gt;Next thing on my wish list now is automatic deployment of my ear file to a WLS via the usage of WLST.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-1824228247161818757?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/1824228247161818757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2010/02/jdeveloper-hudson.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/1824228247161818757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/1824228247161818757'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2010/02/jdeveloper-hudson.html' title='JDeveloper &amp; Hudson'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kBXpBgSenK0/S3WV17za3EI/AAAAAAAAACo/3k8GPO1f0Iw/s72-c/hudson+1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-2118403336545880967</id><published>2010-02-08T23:40:00.000+01:00</published><updated>2010-02-14T14:04:23.174+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bejug'/><title type='text'>BeJUG</title><content type='html'>Oh yeah another thing, since I’m also a steering member of &lt;a href="http://www.bejug.org/"&gt;BeJUG&lt;/a&gt; (Belgian Java User Group) allow me to do some advertising…&lt;br /&gt;&lt;br /&gt;Since 2009 BeJUG organizes bi-weekly evening sessions (In Belgium of course).&lt;br /&gt;&lt;br /&gt;The first talks for our 2010 schedule are defined and can be found &lt;a href="http://www.bejug.org/confluenceBeJUG/display/BeJUG/Events"&gt;here&lt;/a&gt; &lt;br /&gt;As you can see the first one (on Google App Engine) is just in two days….&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-2118403336545880967?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/2118403336545880967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2010/02/bejug.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/2118403336545880967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/2118403336545880967'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2010/02/bejug.html' title='BeJUG'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-6998411643972614953</id><published>2010-02-08T22:34:00.000+01:00</published><updated>2010-02-14T14:05:23.205+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='adf'/><category scheme='http://www.blogger.com/atom/ns#' term='methodology'/><title type='text'>ADF Enterprise Methodology Group</title><content type='html'>Last December I visited the UK OUG conference at Birmingham, I focused my schedule on the ADF sessions en talks and saw some interesting stuff, but the peak for me was the discovery of the ‘&lt;a href="http://groups.google.be/group/adf-methodology"&gt;ADF Enterprise Methodology Group&lt;/a&gt;’ via a round table session I attended at the conference.&lt;br /&gt;&lt;br /&gt;So what is the aim of this group? Let me try to situate them a bit for you….&lt;br /&gt;&lt;br /&gt;At the one hand you have the &lt;a href="http://forums.oracle.com/forums/forum.jspa?forumID=83"&gt;JDeveloper and ADF forum&lt;/a&gt;, the blogs, otn, and a lot of other websites which all help you to solve your technical questions en issues.&lt;br /&gt;&lt;br /&gt;But me and my colleagues had some questions (more related to methodology and best practices) for which we didn’t found the answer and for which we didn’t found a forum to ask those questions. And that’s where the ‘ADF Enterprise Methodology Group’ comes into the picture. Here you can find very nice threads which try to solve all your other questions. Some examples:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Best Practice for Organizing Business Logic code for large applications &lt;li&gt;Back to the basic question: How big/ how small is my AM should be? &lt;li&gt;Best Practice for Organizing Business Logic code for large applications &lt;li&gt;AM pools, connections pools &amp;amp; ADF scalability &lt;li&gt;Design for Performance or Tune After development? &lt;li&gt;ADF Coding Standards 2010 &lt;li&gt;How many ADF library versions on one WLS installation? &lt;li&gt;ADF Applications Hardware Sizing? &lt;li&gt;...&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;So if you’re dealing with the same ‘ADF methodology‘ questions the ADF Methodology Google Group is the place to look for the answers…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-6998411643972614953?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/6998411643972614953/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2010/02/adf-enterprise-methodology-group.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/6998411643972614953'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/6998411643972614953'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2010/02/adf-enterprise-methodology-group.html' title='ADF Enterprise Methodology Group'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-1983365427176788006</id><published>2010-02-01T16:03:00.000+01:00</published><updated>2010-02-14T14:06:27.773+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='adf'/><category scheme='http://www.blogger.com/atom/ns#' term='product development'/><title type='text'>First Oracle ADF 11g based product release</title><content type='html'>&lt;a href="http://3.bp.blogspot.com/_kBXpBgSenK0/S2bty1HfZNI/AAAAAAAAACA/OZ1C9h53_4s/s1600-h/CaseManagement_1.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 149px;" src="http://3.bp.blogspot.com/_kBXpBgSenK0/S2bty1HfZNI/AAAAAAAAACA/OZ1C9h53_4s/s320/CaseManagement_1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5433291457976820946" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Since the beginning of last year we were working on a brand new ADF Based product for ‘Case Management’ called (surprisingly :-)  ) ‘Axi Case Management’. &lt;br /&gt;On the 18the of January we fished our first release and installed it for the first time at a client.&lt;br /&gt;The deadline for this release is mainly responsible for the small amount of blog posts I made the last months.&lt;br /&gt;The great news is that our product runs very fine in any way (performance, reliability,...).&lt;br /&gt;I hope i can post the customer case of this product development on the Oracle ADF website soon. In the meantime can you find a whitepaper &lt;a href="http://www.axi.be/sites/default/files/AXI_Case_Management_Leaflet_UK.pdf"&gt;here&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;JBoss&lt;/strong&gt;&lt;br&gt;&lt;br /&gt;Currently I’m also trying to run an ADF application on a JBoss server. No luck yet. But once I get this job done I promise to publish an overview of my work here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-1983365427176788006?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/1983365427176788006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2010/02/first-oracle-adf-11g-based-product.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/1983365427176788006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/1983365427176788006'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2010/02/first-oracle-adf-11g-based-product.html' title='First Oracle ADF 11g based product release'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kBXpBgSenK0/S2bty1HfZNI/AAAAAAAAACA/OZ1C9h53_4s/s72-c/CaseManagement_1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-3044742145331252138</id><published>2009-12-09T21:31:00.000+01:00</published><updated>2010-02-14T14:06:51.575+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bpm'/><category scheme='http://www.blogger.com/atom/ns#' term='weblogic'/><title type='text'>jBPM on Weblogic</title><content type='html'>Since I’m using ADF as the main technology for my current project and I wanted it to integrate with jBPM 4 I had no choice. WLS (Weblogic BEA) is currently the only platform which supports ADF 11g. So I had to get jBPM running on WLS.&lt;br /&gt;&lt;br /&gt;In this battle I had several barriers to take, some of those are more related to the ADF technology rather than to the WLS server.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 1: get rid of all the ‘unnecessary’ jar files&lt;/strong&gt;&lt;br /&gt;Since my jBPM integration is part of a web project I had to move all necessary libraries under the WEB-INF\lib folder. After a big clean up I ended up with these ones:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://3.bp.blogspot.com/_kBXpBgSenK0/SyAKSuV-jGI/AAAAAAAAABw/bdSLxTlcHWw/s1600-h/jbpm_libs.png"&gt;&lt;/a&gt;&lt;img id="BLOGGER_PHOTO_ID_5413338564649525074" style="DISPLAY: block; MARGIN: 0px auto 10px; WIDTH: 230px; CURSOR: hand; HEIGHT: 171px; TEXT-ALIGN: center" alt="" src="http://4.bp.blogspot.com/_kBXpBgSenK0/SyAKvlLbn1I/AAAAAAAAAB4/fQWh2BqpCFo/s320/jbpm_libs.png" border="0" /&gt;&lt;br /&gt;These are the ones you really need to get the jBPM engine running.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Step 2: be sure the right jar files are getting used&lt;br /&gt;&lt;/strong&gt;I suppose this step is more related to the use of ADF en JDeveloper but I share it with you anyway. Since there are already certain jBPM libraries present in JDeveloper and ADF those one are used by default rather than the one you specify in the WEB-INF lib folder. To tell your application server to prefer the ones you added in the WEB-INF\lib folder you have to add a deployment descriptor.&lt;br /&gt;For WLS add the Weblogic.xml deployment descriptor and add the following lines:&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;&amp;lt;container-descriptor&amp;gt;&lt;br /&gt;&amp;lt;prefer-web-inf-classes&amp;gt;true&amp;lt;/prefer-web-inf-classes&amp;gt;&lt;br /&gt;&amp;lt;/container-descriptor&amp;gt;&lt;br /&gt;&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;This option tells WLS to prefer the jar files specified in the WEB-INF\lib folder instead of the ones who are installed inside the application server. &lt;/p&gt;&lt;p&gt;Jobs done, now it should be possible to run jBPM inside your web application on Weblogic. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-3044742145331252138?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/3044742145331252138/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2009/12/jbpm-on-weblogic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/3044742145331252138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/3044742145331252138'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2009/12/jbpm-on-weblogic.html' title='jBPM on Weblogic'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kBXpBgSenK0/SyAKvlLbn1I/AAAAAAAAAB4/fQWh2BqpCFo/s72-c/jbpm_libs.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-5257894569681466230</id><published>2009-11-23T21:20:00.000+01:00</published><updated>2010-02-14T14:09:07.358+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='contentdelivery'/><category scheme='http://www.blogger.com/atom/ns#' term='lazyuncached'/><category scheme='http://www.blogger.com/atom/ns#' term='adf'/><category scheme='http://www.blogger.com/atom/ns#' term='popup'/><title type='text'>ADF: popup ‘ContentDelivery’ property with value ‘lazyUncached’</title><content type='html'>I have a case in which I have a servlet who renders an image from certain database values. The servlet is called from within an ADF popup.&lt;br /&gt;&lt;br /&gt;One of the properties of the popup is the property ‘ContentDelivery’ which default value is ‘lazy’. When this property is set to ‘lazyUncached’ the content of the popup window will be delivered fresh each time the window is shown according to the documentation.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Just what I needed!&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;But my experience taught me something else, the first time the image is rendered correctly as I expected but from that point on my servlet code is never called again and a cached image seems to be shown.&lt;br /&gt;&lt;br /&gt;The work around for this error is quite simple (and obvious if you’re familiar with ADF). Just put a partial submit on the buttons or components on the page that are responsible for the changes to the image (in my case via database manipulation) and add a partial trigger to the popup to this buttons or components.&lt;br /&gt;&lt;br /&gt;Jobs done, now when the popup is called after one of the partial submit buttons is clicked the image on the popup is rendered correctly.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-5257894569681466230?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/5257894569681466230/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2009/11/adf-popup-contentdelivery-property-with.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/5257894569681466230'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/5257894569681466230'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2009/11/adf-popup-contentdelivery-property-with.html' title='ADF: popup ‘ContentDelivery’ property with value ‘lazyUncached’'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-24471497323322440</id><published>2009-11-19T16:38:00.001+01:00</published><updated>2010-02-14T14:07:19.769+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='property editor'/><category scheme='http://www.blogger.com/atom/ns#' term='property inspector'/><title type='text'>Property editors/inspectors</title><content type='html'>Ooh yeah, another tip, if you have ever have to write your own property editor (or inspector or whatever you want to name it) Java Introspection works just fine. But to write your own property editor based on JavaBeans and BeanInfo Classes that’s just a pain in the ass…. Seeing Sun’s BeanBox I had an ‘aha phenomenon’ because I had just seen something that fulfilled all my needs. So I search for the code that could just render me a property editor just like the BeanBox does. But I can now say to you ‘bad approach’. So if you ever plan to write your own property editor based on Java Introspection, just write some simple classes who render a basic property editor without using custom property editors based on java.beans.PropertyEditorSupport, and other shit….&lt;br /&gt;&lt;br /&gt;Indeed it is ‘Quick &amp;amp; Dirty’ but the other way seems just to be too much work compared to the benefits it gives you…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-24471497323322440?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/24471497323322440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2009/11/ooh-yeah-another-tip-if-you-have-ever.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/24471497323322440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/24471497323322440'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2009/11/ooh-yeah-another-tip-if-you-have-ever.html' title='Property editors/inspectors'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-808130183756216637.post-6259096959677569310</id><published>2009-11-18T22:29:00.000+01:00</published><updated>2010-02-14T14:08:31.143+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='adf'/><title type='text'>ADF 11g the struggle :-)</title><content type='html'>Maybe a good opener: ‘Every technology is easy to use once you have the right knowledge’… And yes this is also the case for the Oracle ADF (11g) Framework which I’m currently using. The more I learn of this technology the more I love it, but to get at this level… man what a struggle, if I could suggest one thing to Oracle it would be: build a good knowledge base for ADF…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/808130183756216637-6259096959677569310?l=gleenders.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://gleenders.blogspot.com/feeds/6259096959677569310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://gleenders.blogspot.com/2009/11/adf-11g-struggle.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/6259096959677569310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/808130183756216637/posts/default/6259096959677569310'/><link rel='alternate' type='text/html' href='http://gleenders.blogspot.com/2009/11/adf-11g-struggle.html' title='ADF 11g the struggle :-)'/><author><name>Gert Leenders</name><uri>http://www.blogger.com/profile/12267941407961860686</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='26' height='32' src='http://1.bp.blogspot.com/_kBXpBgSenK0/SwVnYKgdYyI/AAAAAAAAABM/C3q5PxDIkdk/S220/glnd.png'/></author><thr:total>0</thr:total></entry></feed>
