<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0cCSX4zeip7ImA9WxNUE0g.&quot;"><id>tag:blogger.com,1999:blog-5743359</id><updated>2009-11-04T11:11:08.082-05:00</updated><title>Tom Jordahl's musings</title><subtitle type="html">Random thoughts about ColdFusion, Web Services, Apache Axis, LiveCycle Data Services, BlazeDS and other stuff</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://tjordahl.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>179</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><logo>http://www.feedburner.com/fb/images/pub/fb_pwrd.gif</logo><link rel="self" href="http://feeds.feedburner.com/TomJordahlsMusings" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;CUUASXs9fCp7ImA9WxNVGEg.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-1894672649396203321</id><published>2009-10-29T17:42:00.003-04:00</published><updated>2009-10-29T17:54:08.564-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-29T17:54:08.564-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Data Management" /><category scheme="http://www.blogger.com/atom/ns#" term="Flex" /><category scheme="http://www.blogger.com/atom/ns#" term="Data Services" /><title>Model Driven Delopment</title><content type="html">Wow, its been three months since my last posting.  I wish I could say that I have been using twitter to express all my thoughts to the web, but I don't use twitter so that wont work. :-)&lt;br /&gt;&lt;br /&gt;Anyway, we are on the cusp of releasing LiveCycle Data Services (LCDS) 3.0 which has some really exciting improvements in how you can create Flex applications that use the LCDS Data Management functionality.  I could wax poetic for a few hundred words, or you could watch &lt;a href="http://2009.max.adobe.com/online/session/277"&gt;Christophe Coenraets excellant MAX 2009 session&lt;/a&gt; on model driven development.  He really shows off why this is such a giant leap forward in productivity and usability.&lt;br /&gt;&lt;br /&gt;Dean Harmon and I did a very successful (I think, and the evaluations seem to agree) hands-on session about this same topic, but the hands-on sessions were not recorded.&lt;br /&gt;&lt;br /&gt;You can get the "almost final" &lt;a href="http://labs.adobe.com/technologies/livecycle_dataservices3/"&gt;LCDS 3.0 bits on Adobe Labs&lt;/a&gt; right now and give this stuff a try.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-1894672649396203321?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/NqxcpSxBj4I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/1894672649396203321/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=1894672649396203321" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/1894672649396203321?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/1894672649396203321?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/NqxcpSxBj4I/model-driven-delopment.html" title="Model Driven Delopment" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2009/10/model-driven-delopment.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ACRnw9cSp7ImA9WxJbEUQ.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-3349520518419509388</id><published>2009-07-21T14:01:00.003-04:00</published><updated>2009-07-21T14:09:27.269-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-07-21T14:09:27.269-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Data Management" /><title>LiveCycle Data Services 3.0 Beta videos</title><content type="html">We have just published a set of videos (9 so far) that show off some of the new features in the LCDS 3 beta that has been &lt;a href="http://labs.adobe.com/technologies/livecycle_dataservices3/"&gt;available up on Adobe Labs&lt;/a&gt; for the past few weeks.&lt;br /&gt;&lt;br /&gt;Of particular note is one that I recorded on &lt;a href="http://labs.adobe.com/technologies/livecycle_dataservices3/videos/extendingfiber_assembler/"&gt;how you can extend the new Fiber Assembler&lt;/a&gt; to customize the server side management of your data.&lt;br /&gt;&lt;br /&gt;Check all the videos out here: &lt;a href="http://labs.adobe.com/technologies/livecycle_dataservices3/videos/"&gt;http://labs.adobe.com/technologies/livecycle_dataservices3/videos/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-3349520518419509388?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/1ipi7E7voO4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/3349520518419509388/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=3349520518419509388" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/3349520518419509388?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/3349520518419509388?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/1ipi7E7voO4/livecycle-data-services-30-beta-videos.html" title="LiveCycle Data Services 3.0 Beta videos" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2009/07/livecycle-data-services-30-beta-videos.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4MQ3o7eyp7ImA9WxJWFE8.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-2555911386337865743</id><published>2009-06-19T09:49:00.003-04:00</published><updated>2009-06-19T11:06:22.403-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-19T11:06:22.403-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Data Management" /><title>LiveCycle Data Service 3.0 Beta available</title><content type="html">We launched LiveCycle Data Services (LCDS) 3 public beta yesterday on &lt;a href="http://labs.adobe.com/technologies/livecycle_dataservices3/"&gt;http://labs.adobe.com/technologies/livecycle_dataservices3/&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;We have beefed up tooling and simplified developing flex application development. You can now develop new fully functional flex applications with no server code in under 10 minutes.  We have a few videos to help people get started &lt;a href="http://labs.adobe.com/technologies/livecycle_dataservices3/videos/"&gt;http://labs.adobe.com/technologies/livecycle_dataservices3/videos/&lt;/a&gt;, and plan to add more (I am on the hook for one or two).&lt;br /&gt;&lt;br /&gt;Now is the chance for folks to try out the new Data Model development features we have added and give us some feedback.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-2555911386337865743?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/YUL2tytMKS0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/2555911386337865743/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=2555911386337865743" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/2555911386337865743?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/2555911386337865743?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/YUL2tytMKS0/livecycle-data-service-30-beta.html" title="LiveCycle Data Service 3.0 Beta available" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2009/06/livecycle-data-service-30-beta.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0IARHk-eip7ImA9WxJXFks.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-5744352988615295556</id><published>2009-06-10T15:15:00.002-04:00</published><updated>2009-06-10T15:19:05.752-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-10T15:19:05.752-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ColdFusion" /><title>ColdFusion 8 Performance Tuning</title><content type="html">Check out this new Dev Center article written by Kunal Saini - &lt;a href="http://www.adobe.com/devnet/coldfusion/articles/coldfusion_performance.html"&gt;Performance tuning for ColdFusion applications&lt;/a&gt;. Lots of good information on VM tuning, Administrator settings and CFML code writing.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-5744352988615295556?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/Jjk5BgzXzSs" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/5744352988615295556/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=5744352988615295556" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/5744352988615295556?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/5744352988615295556?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/Jjk5BgzXzSs/coldfusion-8-performance-tuning.html" title="ColdFusion 8 Performance Tuning" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2009/06/coldfusion-8-performance-tuning.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUEMQ3Y-eCp7ImA9WxJREU4.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-4620855629782149666</id><published>2009-05-12T10:10:00.002-04:00</published><updated>2009-05-12T10:14:42.850-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-05-12T10:14:42.850-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Data Management" /><category scheme="http://www.blogger.com/atom/ns#" term="ColdFusion" /><title>Brendan Meutzner on LCDS and CF</title><content type="html">I recently had an email exchange with &lt;a href="http://www.meutzner.com/blog/"&gt;Brendan Meutzner&lt;/a&gt; about a problem he was trying to solve when using an integrated ColdFusion and LiveCycle Data Services system.  He wanted some way to use dynamic data sources in his LCDS assembler CFC.  He blogged about his problem and the solution &lt;a href="http://www.meutzner.com/blog/index.cfm/2009/5/10/Dynamic-Datasources-with-Flex--LCDS"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-4620855629782149666?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/eUpdXm33Yow" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/4620855629782149666/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=4620855629782149666" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/4620855629782149666?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/4620855629782149666?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/eUpdXm33Yow/brendan-meutzner-on-lcds-and-cf.html" title="Brendan Meutzner on LCDS and CF" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2009/05/brendan-meutzner-on-lcds-and-cf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUYHQX48eSp7ImA9WxJTFU0.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-4281763160823019599</id><published>2009-04-23T11:53:00.003-04:00</published><updated>2009-04-23T12:12:10.071-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-23T12:12:10.071-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web Service" /><category scheme="http://www.blogger.com/atom/ns#" term="ColdFusion" /><title>Make ColdFusion 8 work with Apache CXF</title><content type="html">"Alan" left a comment on one of my older posts ("&lt;a href="http://tjordahl.blogspot.com/2007/09/coldfusion-8-getting-started-code.html"&gt;ColdFusion 8 Getting Started code available&lt;/a&gt;") detailing how to get ColdFusion 8 to work with Apache CXF.  I figured it would be useful to repost in its own entry.&lt;p&gt;&lt;/p&gt;DISCLAIMER: I have not tried this, nor do I make any guarantees that this wont do bad stuff to your server.  Try it on a Developer Edition on your desk before messing with any production server.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;If anyone is interested, I have been able to make ColdFusion 8 work with &lt;a href="http://cxf.apache.org/" rel="nofollow"&gt;Apache CXF&lt;/a&gt;, which supports a variety of web service standards and libraries - SOAP 1.1, SOAP 1.2, REST, etc.&lt;br /&gt;&lt;p&gt;Caveats: CF8 works with CXF in the sense that CXF objects can be instantiated as Java objects in CFML and their operations successfully invoked. It does NOT work as a native CF web service call using &lt;cfinvoke webservice="..."&gt; or CreateObject("webservice", "..."). Also, this technique requires some low-level changes to the default CF8 installation, so it is not for the faint of heart.&lt;br /&gt;&lt;/cfinvoke&gt;&lt;/p&gt;In general, the procedure is to grab the CXF libraries and get CF to recognize them. You can drop them directly into a /lib folder that's in the CF classpath, or if you want to be a bit more cautious you can point the CF classpath to the folder that contains the CXF JAR files.&lt;br /&gt;&lt;br /&gt;Detailed steps:&lt;br /&gt;&lt;ol&gt;&lt;li&gt; Download the latest CXF distribution and extract/install it somewhere. If your CXF root is /foo, then find /foo/lib. You'll see a bunch of JAR files, and your mission is to get CF to recognize these files and load the classes in them.&lt;/li&gt;&lt;br /&gt;&lt;li&gt; Stop the CF server.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;CF8 and the JRE that comes with it use an older, incompatible version of the JAXB library, so we need to get the newer one in place. Create /foo/lib/endorsed and copy the jaxb-api-&lt;i&gt;version&lt;/i&gt;.jar file into that folder.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Find jvm.config in your CF installation and open it in a text editor.  Append the following to the JVM arguments: &lt;b&gt;-Djava.endorsed.dirs=&lt;i&gt;path_to_foo&lt;/i&gt;/lib/endorsed -Djava.protocol.handler.pkgs=javax.net.ssl&lt;/b&gt;.  Find the string &lt;b&gt;-Dcoldfusion.classPath=&lt;/b&gt; in the JVM arguments and place the path to /foo/lib immediately after the equals sign (i.e., at the FRONT of the classpath), with a comma to separate it from the rest of the classpath entries. &lt;b&gt;Do not set the classpath using the CF administrator.&lt;/b&gt; It will not permit adding elements to the front of the classpath, and will in fact overwrite the classpath if it is used to change Java settings at any future point.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A suspected bug in the CF classloader causes the wrong part of the CF architecture to load the SAAJ classes. &lt;i&gt;[Tom Here: This isn't a bug, CF maintains absolute control over which classes it loads via its own classloader. A better workaround would be to edit the jrun.properties file in the WEB-INF/lib/cfmx_bootstrap.jar file and change the exceptions list]&lt;/i&gt;  Get around this by copying /foo/lib/saaj-api-&lt;i&gt;version&lt;/i&gt;.jar into {java.home}/lib of your CF installation.  Then delete or rename saaj-api-&lt;i&gt;version&lt;/i&gt;.jar in /foo/lib so it does not get loaded from that location. Also delete or rename saaj.jar from the main CF library location (ColdFusion8\lib on a Windows installation, standalone configuration).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Disable the native JAXB library in ColdFusion by deleting or renaming jaxb-impl.jar in the main CF library location.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Restart the CF server.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;With these steps, you will be able to invoke Java objects that serve as clients for the web service endpoints. These Java objects need to be created, compiled, and installed to a location in the CF classpath in order to be invoked. The CXF documentation describes ways to create the Java objects; wsdl2java might be your best bet. You can have it create classes that are SOAP 1.1 and SOAP 1.2 compatible, allowing you to call those services via the Java objects from inside ColdFusion files.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;After doing this, I did a cursory test of the native CF web service functionality (Axis 1.1) and it seems to work still, so existing code shouldn't be affected.&lt;br /&gt;&lt;/p&gt;&lt;hr /&gt;&lt;br /&gt;There ya go, I would be interested in posting an update if Alan or someone else figures out what the classloading issues with the SAAJ libraries are.&lt;br /&gt;Thanks Alan!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-4281763160823019599?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/w7U3vrX-Ob0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/4281763160823019599/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=4281763160823019599" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/4281763160823019599?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/4281763160823019599?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/w7U3vrX-Ob0/make-coldfusion-8-work-with-apache-cxf.html" title="Make ColdFusion 8 work with Apache CXF" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2009/04/make-coldfusion-8-work-with-apache-cxf.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkAGRXs7eyp7ImA9WxVXGU0.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-416526587380057678</id><published>2009-02-17T14:58:00.001-05:00</published><updated>2009-02-17T14:58:44.503-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-17T14:58:44.503-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="General" /><title>Contribute CS4 does blogs</title><content type="html">&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;I recently had to re-image my laptop (note to self: make sure disk de-fragmentation software is &lt;em&gt;known&lt;/em&gt; to work with exactly the version of disk encryption software you have installed on your system), so I had to re-install all of the software that I think I need to do my day-to-day. For me this includes development stuff like &lt;a href='http://www.jetbrains.com/idea/index.html'&gt;IntelliJ IDEA&lt;/a&gt;, &lt;a href='http://www.perforce.com/'&gt;Perforce&lt;/a&gt;, &lt;a href='http://www.eclipse.org/'&gt;Eclipse&lt;/a&gt;, &lt;a href='http://www.adobe.com/products/flex/features/flex_builder/'&gt;FlexBuilder&lt;/a&gt;, &lt;a href='http://www.adobe.com/go/coldfusion'&gt;ColdFusion&lt;/a&gt;, &lt;a href='http://tortoisesvn.tigris.org/'&gt;TortoiseSVN&lt;/a&gt;, etc, etc.&lt;/p&gt;    &lt;p&gt;Eventually I want to actually edit some HTML for some reason, so I need to get a copy of Dreamweaver.  Plus Homesite+ 'cause I am still old-school when I need to edit CFML.  I have a secret stash of Homesite+ (we haven't sold it as a product in quite a while), but I like to stay current on Dreamweaver cause they be adding in some good stuff that I'll probably never use, but I like to know that I have it.  So I went looking for the &lt;a href='http://www.adobe.com/products/creativesuite/web/'&gt;CS4 - Web Premium&lt;/a&gt; installer.&lt;/p&gt;    &lt;p&gt;I found it and after installing the &lt;em&gt;4 Gigabytes&lt;/em&gt; worth of software, I had my Dreamweaver CS4 along with ~10 other programs that all look really neat and that I will never use in my day job of writing Java server code.  But again, its nice to know that I have it and hey there are some perks to working at Adobe, like being able to install $10,000 worth of software you probably wont use on your Adobe laptop  (did I mention the disk encryption software?).&lt;/p&gt;    &lt;p&gt;To make a long story longer, one of the included programs was Contribute CS4.  I love Contribute and in fact have written lots of ColdFusion specifications using it (now we write specs in a Wiki, which is the spawn of the devil, but I think that is the topic for another post).  By this point, it should come to no surprise to those who have read the title of this entry that I am typing this very blog post in Contribute.  And I must say it's really nice.  It integrated with Blogger quickly with just the entry of my user name and password.  The editor grabs the look and feel of my pages and does a real nice job of showing me how the final post will look.  There are IE and Firefox plug-ins that give me one button access to create a new post.  All-in-all it is a very nice interface and the Contribute team has done a great job with this release.&lt;/p&gt;    &lt;p&gt;So I lied, maybe I will use some of the other software included in CS4.  Now if I could just figure out how to use Photoshop....&lt;/p&gt;    &lt;p&gt;&lt;br/&gt;              &lt;/p&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-416526587380057678?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/jCL5ek9tMmA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/416526587380057678/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=416526587380057678" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/416526587380057678?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/416526587380057678?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/jCL5ek9tMmA/contribute-cs4-does-blogs.html" title="Contribute CS4 does blogs" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2009/02/contribute-cs4-does-blogs.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8NQn85eip7ImA9WxVSFE4.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-5504373909899584318</id><published>2009-01-08T11:27:00.002-05:00</published><updated>2009-01-08T11:41:33.122-05:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-08T11:41:33.122-05:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="General" /><title>Happy New Year</title><content type="html">Happy New Year.  I realized I haven't posted anything for quite a while.  I have been heads down working on the next version of LiveCycle Data Services, which of course I can't talk about. :-)  So here is wishing you and yours a happy, healthy 2009.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-5504373909899584318?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/2QOxpipmEVE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/5504373909899584318/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=5504373909899584318" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/5504373909899584318?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/5504373909899584318?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/2QOxpipmEVE/happy-new-year.html" title="Happy New Year" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2009/01/happy-new-year.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUQBQHY5fip7ImA9WxRXF00.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-2204371498857973477</id><published>2008-10-22T15:14:00.003-04:00</published><updated>2008-10-22T15:22:31.826-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-10-22T15:22:31.826-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Data Management" /><category scheme="http://www.blogger.com/atom/ns#" term="BlazeDS" /><title>LiveCycle Data Services Capicity Planning Guide</title><content type="html">Adobe has published a Capacity Planning Guide white paper that gives guidance and test results on how LiveCycle Data Services scales up to to thousands of end users.&lt;br /&gt;&lt;br /&gt;Stealing from the introduction:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;This document presents the results of software benchmark tests performed by Adobe engineers in 2008. These tests show how LiveCycle Data Services 2.6 software can scale and perform under load using various messaging scenarios that represent real-world situations. The goal of this paper is to provide a starting point for those who need to plan a hardware and software infrastructure that can scale to meet peak demand.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Check it out here:  &lt;a href="http://www.adobe.com/go/lcds26_cap_planning_guide" target="_blank"&gt;Adobe LiveCycle Data Services 2.6 Capacity Planning Guide&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-2204371498857973477?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/newzgpk-A5s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/2204371498857973477/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=2204371498857973477" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/2204371498857973477?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/2204371498857973477?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/newzgpk-A5s/livecycle-data-services-capicity.html" title="LiveCycle Data Services Capicity Planning Guide" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/10/livecycle-data-services-capicity.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUEGSHg5cSp7ImA9WxRTEE8.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-482769338608753262</id><published>2008-08-29T11:20:00.003-04:00</published><updated>2008-08-29T11:27:09.629-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-29T11:27:09.629-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="BlazeDS" /><title>BlazeDS HTML LiveDocs updated</title><content type="html">The &lt;a href="http://livedocs.adobe.com/blazeds/1/blazeds_devguide"&gt;BlazeDS HTML Livedocs&lt;/a&gt; are now updated to match the &lt;a href="http://livedocs.adobe.com/blazeds/1/blazeds_devguide/blazeds_devguide.pdf"&gt;updated PDF&lt;/a&gt; files I&lt;a href="http://tjordahl.blogspot.com/2008/07/blazeds-documentation-update.html"&gt; posted about&lt;/a&gt; a while ago.  This brings the BlazeDS document up to date with the release of LCDS 2.6, including a much better organization of the chapters to explain the RPC and messaging concepts.&lt;br /&gt;&lt;br /&gt;I think most folks use the HTML version, not the PDF (I know I do), so it was pretty confusing having two different versions of the doc around, with the most popular being the out of date version.&lt;br /&gt;&lt;br /&gt;Thanks to the documentation team for responding to our complaints!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-482769338608753262?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/KvHuMr2m-o0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/482769338608753262/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=482769338608753262" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/482769338608753262?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/482769338608753262?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/KvHuMr2m-o0/blazeds-html-livedocs-updated.html" title="BlazeDS HTML LiveDocs updated" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/08/blazeds-html-livedocs-updated.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUBQnw8cSp7ImA9WxRTEE8.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-905434782518232846</id><published>2008-08-29T10:59:00.003-04:00</published><updated>2008-08-29T11:20:53.279-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-29T11:20:53.279-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ColdFusion" /><category scheme="http://www.blogger.com/atom/ns#" term="BlazeDS" /><title>Invoking Flash remoting requests using the Java AMF Library</title><content type="html">In a follow up to my &lt;a href="http://tjordahl.blogspot.com/2008/08/new-java-amf-client-feature-in-blazeds.html"&gt;recent post&lt;/a&gt; about the new &lt;a href="http://opensource.adobe.com/wiki/display/blazeds/Java+AMF+Client"&gt;Java AMF client&lt;/a&gt; available in BlazeDS, I was recently asked how to send a 'typical' flash remoting request to ColdFusion.&lt;br /&gt;&lt;br /&gt;Here is how you do that in Java:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;Object[] args = ...&lt;br /&gt;String sourceName = "my.cfc.path.Component";&lt;br /&gt;RemotingMessage message = new RemotingMessage();&lt;br /&gt;message.setMessageId(flex.messaging.util.UUIDUtils.createUUID()); &lt;br /&gt;message.setOperation("myCfcFunctionName");&lt;br /&gt;message.setBody(args);&lt;br /&gt;message.setSource(sourceName);&lt;br /&gt;message.setDestination("ColdFusion");&lt;br /&gt;Object returnValue = amfConnection.call(null, message);&lt;br /&gt;&lt;br /&gt;and accessing the body of the response like this.&lt;br /&gt;&lt;br /&gt;Object body = ((AcknowledgeMessage) returnValue).getBody();&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Not that the "args" variable is an array of the arguments you are passing to the CFC function. It can also be a Java List, or a simple object.  See the BlazeDS  &lt;a href="http://opensource.adobe.com/svn/opensource/blazeds/trunk/modules/core/src/java/flex/messaging/messages/RemotingMessage.java"&gt;  source for RemotingMessage.java&lt;/a&gt; for details.  This sends the same kind of message that the mx:RemoteObject tag does in MXML, so in ColdFusion terms you are using the "Flash Remoting Update".  If you use the 'raw' AMFConnection API, you would be using the "classic" Flash Remoting.  Both will work, but I recommend using the RemotingMessage style.&lt;br /&gt;&lt;br /&gt;What does this do for you?  Well if you are exclusively using Flex as a client, not much.  But if you would like to write Java code to invoke a CFC, this alows you to do that &lt;span style="font-style: italic;"&gt;very&lt;/span&gt; easily.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-905434782518232846?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/1TSEbo6-Tfk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/905434782518232846/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=905434782518232846" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/905434782518232846?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/905434782518232846?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/1TSEbo6-Tfk/invoking-flash-remoting-requests-using.html" title="Invoking Flash remoting requests using the Java AMF Library" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/08/invoking-flash-remoting-requests-using.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMGRXw-eyp7ImA9WxdbEEg.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-9113476895230805332</id><published>2008-08-06T16:06:00.003-04:00</published><updated>2008-08-06T16:27:04.253-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-08-06T16:27:04.253-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="BlazeDS" /><title>New Java AMF Client feature in BlazeDS</title><content type="html">You may not have noticed, (what, you aren't subscribed to the &lt;a href="http://www.adobeforums.com/webx/.3c061bb9/"&gt;BlazeDS commits forum&lt;/a&gt;?) but a few weeks ago Mete committed an enhancement that adds a Java AMF client API to the flex-messaging-core.jar file in BlazeDS.&lt;br /&gt;&lt;br /&gt;You can find a specification posted &lt;a href="http://opensource.adobe.com/wiki/display/blazeds/Java+AMF+Client"&gt;here&lt;/a&gt; and its linked from the &lt;a href="http://opensource.adobe.com/wiki/display/blazeds/Developer+Documentation"&gt;Developer Documentation&lt;/a&gt; page.&lt;br /&gt;&lt;br /&gt;What does this do?  Well, you can use this API to call (from Java) Flash Remoting end points in BlazeDS, LiveCycle Data Services, ColdFusion, PHP or whatever you have that supports AMF.   Which of course is a &lt;a href="http://opensource.adobe.com/wiki/download/attachments/1114283/amf3_spec_05_05_08.pdf?version=1"&gt;published specification&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This feature is available in any nightly build after 3.1.0.2602 or in the trunk nightly build.  Find those builds on the &lt;a href="http://opensource.adobe.com/wiki/display/blazeds/download+blazeds+3"&gt;BlazeDS build download page&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-9113476895230805332?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/IxLNY_Wxh7Y" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/9113476895230805332/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=9113476895230805332" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/9113476895230805332?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/9113476895230805332?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/IxLNY_Wxh7Y/new-java-amf-client-feature-in-blazeds.html" title="New Java AMF Client feature in BlazeDS" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">6</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/08/new-java-amf-client-feature-in-blazeds.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EGRXk7cCp7ImA9WxdUFUw.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-4093524867182600759</id><published>2008-07-31T11:48:00.002-04:00</published><updated>2008-07-31T11:53:44.708-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-31T11:53:44.708-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Data Management" /><category scheme="http://www.blogger.com/atom/ns#" term="BlazeDS" /><title>BlazeDS Documentation Update</title><content type="html">The documentation team has posted an update of the BlazeDS documentation that includes all of the relevant content from the &lt;a href="http://livedocs.adobe.com/livecycle/8.2/programLC/programmer/lcds/index.html"&gt;new LCDS 2.6 Developers Guide&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;By the way, here is a &lt;a href="http://www.adobe.com/support/documentation/en/livecycledataservices/"&gt;gateway page to all of the LCDS 2.6 documentation&lt;/a&gt;, which has been reorganized to be much easier to read and use.&lt;br /&gt;&lt;br /&gt;The HTML in Livedocs has not been updated yet, but a &lt;a href="http://livedocs.adobe.com/blazeds/1/blazeds_devguide/blazeds_devguide.pdf"&gt;new PDF version&lt;/a&gt; is available.&lt;br /&gt;&lt;br /&gt;See details on the Flex documentation blog &lt;a href="http://blogs.adobe.com/flexdoc/2008/07/blazeds_developer_guide_update.html"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-4093524867182600759?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/7leIu8Cgg-0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/4093524867182600759/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=4093524867182600759" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/4093524867182600759?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/4093524867182600759?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/7leIu8Cgg-0/blazeds-documentation-update.html" title="BlazeDS Documentation Update" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/07/blazeds-documentation-update.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EAR3s5eyp7ImA9WxdVF0g.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-6537711027791881905</id><published>2008-07-22T16:47:00.000-04:00</published><updated>2008-07-22T16:47:26.523-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-22T16:47:26.523-04:00</app:edited><title>AIR Data Synchronization via LiveCycle Data Services ES 2.6</title><content type="html">This is a nice article on the offline sync feature of LiveCycle Data Services 2.6 - &lt;a href="http://www.insideria.com/2008/07/air-data-synchronization-via-l.html"&gt;AIR Data Synchronization via LiveCycle Data Services ES 2.6&lt;/a&gt;.  It was written by John C. Bland II.&lt;br /&gt;&lt;br /&gt;I worked on this feature for LCDS 2.6 (which by the way just got released last week).  The &lt;a href="http://help.adobe.com/en_US/AIR/1.1/devappsflex/WS5b3ccc516d4fbf351e63e3d118666ade46-7d29.html"&gt;SQLite DB built in to AIR&lt;/a&gt; is really nice to work with and the &lt;a href="http://livedocs.adobe.com/flex/3/langref/flash/data/SQLConnection.html"&gt;Actionscript APIs&lt;/a&gt; for using it were nicely designed by Jason, one of my coworkers here at Adobe. &lt;br /&gt;&lt;br /&gt;I think the offline feature is pretty neat. There is still lots of room for improvement, but the basics that we do have are pretty powerful.   We are in the planning stages for the next LCDS release and I expect that improving our offline story, particularly for AIR, will be on the list.&lt;br /&gt;&lt;br /&gt;Check it out!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-6537711027791881905?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/v9GwPMvfvbA" height="1" width="1"/&gt;</content><link rel="related" href="http://www.insideria.com/2008/07/air-data-synchronization-via-l.html" title="AIR Data Synchronization via LiveCycle Data Services ES 2.6" /><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/6537711027791881905/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=6537711027791881905" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/6537711027791881905?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/6537711027791881905?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/v9GwPMvfvbA/air-data-synchronization-via-livecycle.html" title="AIR Data Synchronization via LiveCycle Data Services ES 2.6" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/07/air-data-synchronization-via-livecycle.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUMARXY-eip7ImA9WxdWGE0.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-5089541834586219070</id><published>2008-07-11T14:59:00.003-04:00</published><updated>2008-07-11T15:10:44.852-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-11T15:10:44.852-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Event Gateway" /><category scheme="http://www.blogger.com/atom/ns#" term="ColdFusion" /><title>Setting optional parameters in the SMS Gateway</title><content type="html">&lt;a href="http://www.sustainablegis.com/blog/cfg11n/index.cfm"&gt;Paul Hastings&lt;/a&gt; sent me a questions yesterday about the ColdFusion SMS Event Gateway.  He wanted to know how users could set their own optional parameters in the text messages sent from the gateway. He &lt;a href="http://www.sustainablegis.com/blog/cfg11n/index.cfm?mode=entry&amp;amp;entry=0E42140A-20ED-7DEE-2AA35B56931A402D"&gt;blogged my answer&lt;/a&gt;, which means I can just link to it without writing it up myself.&lt;br /&gt;&lt;br /&gt;A few notes: If the gateway &lt;span style="font-style: italic;"&gt;receives&lt;/span&gt; optional parameters in a message, it will be included in the data struct that is returned to the onIncomingMessage CFC function under the "optionalParameters" key.  CFDump to a file or console is your friend in these cases.&lt;br /&gt;&lt;br /&gt;If you do not format the key (has to be able to be parsed by the Java Short.decode(String) function) or the value (must be a byte[], which in CFML is a "binary object") correctly the setting is silently ignored.&lt;br /&gt;&lt;br /&gt;This functionality has been in the SMS Gateway since 7.0.2.  It is not in the 7 or 8 documentation, which is bad, but we will correct this moving forward.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-5089541834586219070?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/mJwQq7112-0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/5089541834586219070/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=5089541834586219070" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/5089541834586219070?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/5089541834586219070?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/mJwQq7112-0/setting-optional-parameters-in-sms.html" title="Setting optional parameters in the SMS Gateway" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/07/setting-optional-parameters-in-sms.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0cGRnc7fyp7ImA9WxdWEEg.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-3835760819564866907</id><published>2008-07-02T22:26:00.003-04:00</published><updated>2008-07-02T23:17:07.907-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-02T23:17:07.907-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web Service" /><category scheme="http://www.blogger.com/atom/ns#" term="ColdFusion" /><title>Special Axis types and ColdFusion</title><content type="html">A mere hours after I &lt;a href="http://tjordahl.blogspot.com/2008/07/for-some-reason-i-havent-actually-even.html"&gt;posted&lt;/a&gt; about how to figure out why CF does not like the arguments you are passing to invoke an operation in a web service, Sean Corfield pinged me with a problem exactly like that.  Feeling pretty good, I pointed him to the post I made hours before.  He of course had already tried the wsdl2java trick and still could not get CF to do the deed.&lt;br /&gt;&lt;br /&gt;He sent me the WSDL and his test and everything looked OK.  It was a pretty complex input to an operation (names changed to protect privacy):&lt;br /&gt;&lt;tt&gt;    public com.example.RegisterResponse register(com.example.RegisterRequest parameters)&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;The RegisterRequest was a JavaBean that included the following members:&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;    private java.lang.String sessionID;&lt;br /&gt;    private com.example.ThingyType importantThing;&lt;br /&gt;    private com.example.ThingyType otherThingy;&lt;br /&gt;    private com.example.ThingsILike likeList;&lt;br /&gt;    private org.apache.axis.types.UnsignedInt duration;&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;Fun stuff.  Sean had done all the right things creating CFML structs that matched each of the JavaBean types (ThingyType, and ThingsILike).  ThingsILike was interesting because it contained a single item that was an array.  His code was right on the money here, notice that the ThingsILike object had a single member named "things" that was the array.  Here is what he did and (rightfully) expected to work:&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;thing1 = { name = "bobby", location = "Portland" };&lt;br /&gt;thing2 = { name = "sally", location = "Boston" };&lt;br /&gt;iLike = { things = ["Bunnies", "Kittens", "Koalas", "ColdFusion"] };&lt;br /&gt;args = { sessionID = 0, importantThing = thing1, otherThingy = thing2, likeList = iLike, duration = 60 };&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;Bonus points to Sean for using the new ColdFusion 8 syntax to create arrays and structures.  So the array wasn't the problem.  What was?  Well you may have noticed that duration is listed in the Java function as being of type org.apache.axis.types.UnsignedInt.  this is because the XMl Schema type in the WSDL says that the number is an Unsigned Integer:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;  &amp;lt;xsd:element name="Duration" type="xsd:unsignedInt" /&amp;gt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;As an aside here, XML Schema has &lt;a href="http://www.w3.org/TR/xmlschema-2/#built-in-derived"&gt;a lot of different types&lt;/a&gt; that elements can be.  Things like NonNegativeInteger, nonPositiveInteger and other slightly wacky things.  Java on the other hand doesn't have any of these.  So the Axis folks (which included me) came up with a set of classes that would enforce the limitations of the Schema types and allow you to 'round trip' a service that you generated from a WSDL, then deployed and allowed Axis to create the WSDL from the Java.  This is good, and when you are writing Java directly against the WSDL2Java generated code no big deal because you can pretty quickly notice that you need one of these types and make one.&lt;br /&gt;&lt;br /&gt;But back to ColdFusion.  In order for the "60" given in the code to turn in to the class UnsignedInt, ColdFusion has to be smart about how to construct this object.  It's not.  However there is a simple work around - create the object yourself.  Here is how that would look:&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;duration = CreateObject("java", "org.apache.axis.types.UnsignedInt").init(60);&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Notice that I call init(60), which invokes the constructor of the class.  Setting this object as the value of duration in our argument structure works like a charm. So problem solved, and I hope that we can make CF smarter about these types in a future release, but encountering these XML Schema types in the wild is pretty rare so I don't expect you will need this workaround much if at all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-3835760819564866907?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/hQQ24uO_Ny4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/3835760819564866907/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=3835760819564866907" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/3835760819564866907?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/3835760819564866907?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/hQQ24uO_Ny4/special-axis-types-and-coldfusion.html" title="Special Axis types and ColdFusion" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/07/special-axis-types-and-coldfusion.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4CQH87cCp7ImA9WxdWEEw.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-6736360774867903907</id><published>2008-07-02T10:56:00.006-04:00</published><updated>2008-07-02T11:52:41.108-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-02T11:52:41.108-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web Service" /><category scheme="http://www.blogger.com/atom/ns#" term="ColdFusion" /><title>Using WSDL2Java to figure out CFML arguments to a Web Service</title><content type="html">For some reason I haven't actually even written up the procedure I use to figure out how to invoke a web service from ColdFusion when people ask me what CFML structures they need to pass in so CF can match the arguments to a function in the Apache Axis stub it generated from the WSDL.&lt;br /&gt;&lt;br /&gt;I encourage you to read the reprint of &lt;a href="http://tjordahl.blogspot.com/2008/04/reprint-consuming-web-service-complex.html"&gt;Consuming Web Service complex types in ColdFusion&lt;/a&gt; which goes in to some great detail on how to figure this out.  This posting is going to be the cheat sheet version of that.&lt;br /&gt;&lt;br /&gt;First, if you can't figure out why CF gives you an error about not finding the right function to invoke, you probably aren't passing in the right arguments.  How do you figure these out? You run the WSDL2Java command in Apache Axis, and take a look at the Java code CF is trying to invoke.  Here's a batch script for Windows and ColdFusion 8:&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;set CFLIB=c:\ColdFusion8\lib&lt;br /&gt;set CLASSPATH=%CFLIB%\axis.jar;%CFLIB%\wsdl4j-1.5.1.jar;%CFLIB%\log4j-1.2.12.jar;%CFLIB%\commons-logging.1.0.4.jar;%CFLIB%\commons-discovery-0.2.jar;%CFLIB%\xercesImpl.jar;%CFLIB%\xml-apis.jar;%CFLIB%\saaj.jar;%CFLIB%\jaxrpc.jar;%CFLIB\..\runtime\lib\jrun.jar&lt;br /&gt;&lt;br /&gt;java org.apache.axis.wsdl.WSDL2Java %1 %2 %3 %4 %5 %6 %7 %8 %9&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Save this as "wsdl2java.bat". This will also work with ColdFusion MX 7.  You will need to change the log4j-1.2.12.jar file to be just log4j.jar.&lt;br /&gt;&lt;br /&gt;Change to an empty directory.  Wsdl2Java is going to spew directories and files all over the current directory, so I find its best to create something like c:\temp\x and run the command from there.  Otherwise you can give the -o option and specify the output directory.&lt;br /&gt;&lt;br /&gt;&lt;tt&gt;wsdl2java.bat -v -o c:\temp\x http://example.com/path/to/wsdl&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;The -v is the verbose argument.  I like to see all the files that are being created.&lt;br /&gt;&lt;br /&gt;Now you can start browsing through the Java files and see what we have to work with.  Look for a file named the same as the "portType" name in your WSDL.  For instance, if your WSDL contains a portType that looks like this:&lt;br /&gt;&lt;tt&gt;&amp;lt;wsdl:portType name="CodexWS"&amp;gt;&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;Then you would look for CodexWS.java.  This will be the &lt;i&gt;interface&lt;/i&gt; of the service, and you should be able to see each of the operations in your service, and the Java objects that ColdFusion will be trying to create to call them.&lt;br /&gt;&lt;br /&gt;How do you create the CFML to pass to the operation?  Simple.  Most likely there will be &lt;a href="http://en.wikipedia.org/wiki/JavaBeans"&gt;JavaBeans&lt;/a&gt; created from the XML Schema in the WSDL.  These aren't that big of a deal, basically they are structures with name/value pairs, which is why you will need to make a CFML structure with the &lt;i&gt;same&lt;/i&gt; names in it.&lt;br /&gt;&lt;br /&gt;Check out this Bean:&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;public class AddThingRequest  implements java.io.Serializable {&lt;br /&gt;  private java.lang.String manifestfile;&lt;br /&gt;  private java.lang.String uri;&lt;br /&gt;  private java.lang.String certlevel;&lt;br /&gt;  private java.lang.String statusname;&lt;br /&gt;  private com.adobe.Ldapcredentials ldapcredentials;&lt;br /&gt;  ...&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;There would be a getManifest() and setManifest() function in the bean also, along with a get and set function for each one of the other bean &lt;i&gt;properties&lt;/i&gt;.  These only matter because this is what CF will look for when it finds a "manifest" entry in your CFML structure.  So what would we pass in to an operation that takes an "AddThingRequest" object as an argument?  Something like this:&lt;br /&gt;&lt;tt&gt;&lt;br /&gt;atr = StructNew();&lt;br /&gt;atr.manifestfile = "foo";&lt;br /&gt;atr.uri = "uri:gimme";&lt;br /&gt;atr.certlevel = "high";&lt;br /&gt;atr.statusname = "Alert";&lt;br /&gt;art.ldapcredentials = mycreds;&lt;br /&gt;&lt;/tt&gt;&lt;br /&gt;But wait, you say, what is "mycreds"?  Well, the process just repeats here - we would go find the com.adobe.Ldapcredentials Java object, look at the properties it contains and make a CFML structure (mycreds in this example above) that matches it.&lt;br /&gt;&lt;br /&gt;So that's all (ha!) there is to it.  You now have the magic to invoke almost any web service out there.  This isn't exactly "making the hard stuff easy" (that would be that WSDL2CFML tool I haven't written yet), but once you understand how the process works, you should very rarely have to resort to grunging through the Java code generated from a WSDL to construct the right CFML inputs.  My opinion is that Web Services should be designed to present an easy to use interface, simple inputs with only reasonably complex outputs.  I know that isn't the case for many services out there that you are forced to used.  But with this technique you should be able to easily figure out how to use the more complex ones.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-6736360774867903907?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/Gv-Uoa_b4PQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/6736360774867903907/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=6736360774867903907" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/6736360774867903907?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/6736360774867903907?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/Gv-Uoa_b4PQ/for-some-reason-i-havent-actually-even.html" title="Using WSDL2Java to figure out CFML arguments to a Web Service" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/07/for-some-reason-i-havent-actually-even.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEAFR3w4fip7ImA9WxdXFk0.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-2921762574850156205</id><published>2008-06-27T17:28:00.004-04:00</published><updated>2008-06-27T17:38:36.236-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-06-27T17:38:36.236-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Data Management" /><category scheme="http://www.blogger.com/atom/ns#" term="CFUnited" /><category scheme="http://www.blogger.com/atom/ns#" term="BlazeDS" /><title>CFUnited LiveCycle and ColdFusion session online</title><content type="html">For those who were unable to attend my session at CFUnited this year, the &lt;a href="http://cfunited.com/blog/"&gt;CFUnited blog&lt;/a&gt; has&lt;a href="http://cfunited.com/blog/index.cfm/2008/6/19/Keynote-and-other-presos-on-Connect"&gt; posted the URLs&lt;/a&gt; of many of the sessions that got recorded via Adobe Connect.  My session was recorded and is now online &lt;a href="https://admin.adobe.acrobat.com/_a561260173/p61233987/"&gt;here&lt;/a&gt;.  This talk has some new content about the difference between BlazeDS and LiveCycle Data Services.&lt;br /&gt;&lt;br /&gt;The audio is very "hot" - when setting up the microphone the output from the in-room audio system was just super loud so I am distorted, but I think the session is still tolerably understandable.  I am much better in person however.  See you at MAX 2008. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-2921762574850156205?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/1RIPzYR2J-M" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/2921762574850156205/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=2921762574850156205" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/2921762574850156205?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/2921762574850156205?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/1RIPzYR2J-M/cfunited-livecycle-and-coldfusion.html" title="CFUnited LiveCycle and ColdFusion session online" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/06/cfunited-livecycle-and-coldfusion.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUNRn08eSp7ImA9WxdSGUU.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-8722873838347780370</id><published>2008-05-28T09:52:00.003-04:00</published><updated>2008-05-28T10:01:37.371-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-28T10:01:37.371-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Data Management" /><category scheme="http://www.blogger.com/atom/ns#" term="MAX" /><category scheme="http://www.blogger.com/atom/ns#" term="ColdFusion" /><title>MAX 2008 registration is now open</title><content type="html">MAX 2008 registration is now open.  Check out more information at the MAX web site &lt;a href="http://max.adobe.com/blog/"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;MAX is the descendant of the Allaire ColdFusion Developers Conference, which turned in to the Macromedia DevCon, which morphed in to Macromedia MAX and is now Adobe MAX.  This year it is going to be in San Francisco, which will be great.  Not as great as MAX 2006  in Las Vegas IMHO, but SF is a fun place to visit. :-)&lt;br /&gt;&lt;br /&gt;I will be giving a session on Livecycle Data Services and BlazeDS deployment, probably with a slant toward integrating with ColdFusion.  But anyone who is interested in learning more about Data Services, BlazeDS and how they can leverage the power of these technologies in to their web applications using Flex should get a lot out of it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-8722873838347780370?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/hNQh5l3_hGQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/8722873838347780370/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=8722873838347780370" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/8722873838347780370?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/8722873838347780370?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/hNQh5l3_hGQ/max-2008-registration-is-now-open.html" title="MAX 2008 registration is now open" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/05/max-2008-registration-is-now-open.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE8AR3s6eyp7ImA9WxdSEkQ.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-3210882061206943245</id><published>2008-05-20T10:10:00.004-04:00</published><updated>2008-05-20T10:14:06.513-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-20T10:14:06.513-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="AIR" /><category scheme="http://www.blogger.com/atom/ns#" term="Data Management" /><title>Offline sync sample application</title><content type="html">&lt;a href="http://coenraets.org/blog/"&gt;Christophe &lt;/a&gt;has posted another great LCDS sample application that uses the offline synchronization feature of Data Services to good effect.  This is one of the features that I worked on for the upcoming &lt;a href="http://labs.adobe.com/technologies/livecycle_dataservices2_6/"&gt;LiveCycle Data Services 2.6&lt;/a&gt; release, which is in beta right now up on Adobe Labs.  Check it out &lt;a href="http://coenraets.org/blog/2008/05/insync-automatic-offline-data-synchronization-in-air-using-lcds-26/"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-3210882061206943245?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/Q45VqgBIRPo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/3210882061206943245/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=3210882061206943245" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/3210882061206943245?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/3210882061206943245?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/Q45VqgBIRPo/offline-sync-sample-application.html" title="Offline sync sample application" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/05/offline-sync-sample-application.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUUBQn47fCp7ImA9WxdTE0s.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-2624927880266854350</id><published>2008-05-09T15:37:00.003-04:00</published><updated>2008-05-09T16:00:53.004-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-09T16:00:53.004-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Flex" /><title>New blog on FlexBuilder 4 features</title><content type="html">Scott Evans, a lead engineer on the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;FlexBulder&lt;/span&gt; team, has started a new blog - &lt;a href="http://gettingandsetting.com/"&gt;Getting and Setting &lt;/a&gt; that will be for public discussion of new &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;FlexBuilder&lt;/span&gt; 4 &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;IDE&lt;/span&gt; features.  I am really excited by some of the "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;IDE&lt;/span&gt; Maturity" features that I've seen on the drawing boards for the next &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;FlexBuilder&lt;/span&gt;.  As an &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_5"&gt;avid&lt;/span&gt; &lt;a href="http://www.jetbrains.com/idea/index.html"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;InteilliJ&lt;/span&gt; IDEA&lt;/a&gt; user for my Java development, my tumultuous affair with builder has been a tough ride.  I am drooling over most of the improvements that I see coming.&lt;br /&gt;&lt;br /&gt;He starts out with his &lt;a href="http://gettingandsetting.com/2008/05/09/accesor-methods-actionscript-and-you/"&gt;lead post&lt;/a&gt; asking about how you use &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Actionscript&lt;/span&gt; "&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;getters&lt;/span&gt;" and "setters".  Do you use a special prefix for your class member variables?  Do you create functions as a matter of course?  Or only when you actually need them?  Post a comment and let Scott know.&lt;br /&gt;&lt;br /&gt;I also encourage you to check out Tim &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Buntel's&lt;/span&gt; &lt;a href="http://www.buntel.com/blog/index.cfm/2008/4/25/100-feature-test-for-expert-developers"&gt;$100 test&lt;/a&gt; posting asking for feedback on what feature you think are worth investing our resources in.  He has recently posted an &lt;a href="http://www.buntel.com/blog/index.cfm/2008/4/28/100-test-results-so-far"&gt;update on the results&lt;/a&gt;, which, I pointed out to Scott, valued the getter/setter generation very high on the list.  Of course improving the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;MXML&lt;/span&gt; compiler speed was at the top of many folks lists.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-2624927880266854350?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/4d8vvV-Z9u0" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/2624927880266854350/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=2624927880266854350" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/2624927880266854350?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/2624927880266854350?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/4d8vvV-Z9u0/new-blog-on-flexbuilder-4-features.html" title="New blog on FlexBuilder 4 features" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/05/new-blog-on-flexbuilder-4-features.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08HRXY7eCp7ImA9WxdTEEQ.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-6393088887454754968</id><published>2008-05-06T13:27:00.004-04:00</published><updated>2008-05-06T14:50:34.800-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-05-06T14:50:34.800-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Data Management" /><category scheme="http://www.blogger.com/atom/ns#" term="ColdFusion" /><title>Conflict bug in ColdFusion Extensions for Eclipse</title><content type="html">If you are trying to use ColdFusion as the back end to a LiveCycle Data Services Data Management application, you should know about the extensions to Eclipse/FlexBuilder that ship with ColdFusion 8 (and 7.0.2).  You can download them from the CF download page &lt;a href="http://www.adobe.com/support/coldfusion/downloads.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;One of the great features of these extensions is the ability to use the RDS Dataview window to generate CFCs and Actionscript classes from your database tables, saving you lots of tedious typing.  To do this go to Window -&gt; Show View -&gt; Other... -&gt; ColdFusion -&gt; RDS Dataview.  This will open the panel that allows you to browse your data sources via RDS.  Right click on the panel and select "RDS Configuation" to open the settings dialog and configure your RDS server.  For instance I have my local CF server configured as:&lt;br /&gt; Description: localhost&lt;br /&gt; Host Name: 127.0.0.1&lt;br /&gt; Port Number: 8500&lt;br /&gt;&lt;br /&gt;I am using the built in web server (port 8500) and the stand alone configuration, so there is no context root.  You must have RDS turned on in your installation (see technote &lt;a href="http://www.adobe.com/go/tn_17276"&gt;here &lt;/a&gt;for details) .&lt;br /&gt;&lt;br /&gt;Once you have the panel open and have access to your ColdFusion data sources, you can open up a DSN, open the "Tables" folder and right-click on a table name.  You can show the contents of the table or open up the Query Viewer (on Windows) and run an arbitrary query.  At the bottom of the context menu you should see "ColdFusion Wizards".  Select that and the sub menu is "Create CFC".&lt;br /&gt;&lt;br /&gt;This gives you a dialog that allows you to create CFCs that correspond to this table in your database.  Not only that, it will create either "Active Record" or "Bean/DAO" style CFCs that know how to create, read, update and delete (CRUD) themselves!  This is pretty cool in an of itself, but if you are using LCDS to write a Data Management application, this wizard can also write the Assembler CFC (the component that has the required methods for LCDS) for you.  This selection is named "LiveCycle Data Services Assembler CFC's".  It will generate the Bean CFC (representing 1 row of data), the Data Access Object (DAO) CFC, which has read/write/update/delete methods and the Assembler CFC itself, which uses the Bean and the DAO CFCs to do its work.&lt;br /&gt;&lt;br /&gt;Neat, huh?&lt;br /&gt;&lt;br /&gt;You can even create the Actionscript class that is used in the Flex application to represent your data when it gets to the client.&lt;br /&gt;&lt;br /&gt;This code will work right out of the gate if you have a simple single table application.  You can use it as a jump start for more complex applications that have multiple assemblers and a more complex data dependencies.&lt;br /&gt;&lt;br /&gt;Unfortunately, there is a bug in the generated code when it comes to conflict detection.  As part of the "sync" method, there are private functions which perform the create, update and delete operations (named doCreate, doUpdate and doDelete respectively).  If you examine the doUpdate and doDelete methods, you will see a &lt;span style="font-style: italic;"&gt;cfcatch &lt;/span&gt;clause with &lt;span style="font-weight: bold;"&gt;type="conflict".&lt;/span&gt;  This calls the &lt;a href="http://livedocs.adobe.com/livecycle/es/sdkHelp/programmer/lcdsjavadoc/flex/data/ChangeObject.html#conflict%28java.lang.Object%29"&gt;ChangeObject's &lt;span style="font-style: italic;"&gt;conflict()&lt;/span&gt;&lt;/a&gt; function.  This function takes as its argument the server's version of the object we are trying to update or delete, so the client application will have all three versions of the data - old, new and the server version:&lt;br /&gt;&lt;br /&gt;    &amp;lt;!--- If there was a conflict, mark the change object.&lt;br /&gt;             Include the current version of the record ---&amp;gt;&lt;br /&gt;    &amp;lt;cfcatch type="conflict"&amp;gt;&lt;br /&gt;        &amp;lt;cfset variables.dao.read(id=new.getARTISTID()))&amp;gt;&lt;br /&gt;    &amp;lt;/cfcatch&amp;gt;&lt;br /&gt;          &lt;br /&gt;&lt;br /&gt;The problem is that the code is using the DAO read() method to get the server's version of the object.  If you take a look at the DAO code, the return type is defined to be this:&lt;br /&gt;   &amp;lt;cffunction name="read" output="false" access="public" returntype="src.com.ARTISTS[]"&amp;gt;&lt;br /&gt;&lt;br /&gt;This is an array, which is &lt;span style="font-style: italic;"&gt;not&lt;/span&gt; what we want to put in the ChangeObject for LCDS.  What we really want to put in this object is a single record and to do this, we have to unwrap the array returned by &lt;span style="font-style: italic;"&gt;read()&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;    &amp;lt;cfcatch type="conflict"&amp;gt;&lt;br /&gt;        &amp;lt;cfset readresult = variables.dao.read(id=new.getARTISTID())&amp;gt;&lt;br /&gt;        &amp;lt;cfset serverversion = readResult[1]&amp;gt;&lt;br /&gt;        &amp;lt;cfset co.conflict(serverVersion)&amp;gt;&lt;br /&gt;    &amp;lt;/cfcatch&amp;gt;&lt;br /&gt;&lt;br /&gt;You may want to include some error checking code in here to verify that the call to &lt;span style="font-style: italic;"&gt;read()&lt;/span&gt; has returned exactly one result (it should as in the case ARTISTID is the primary key in the table).  You also may want to "&lt;span style="font-style: italic;"&gt;var&lt;/span&gt;" the readResult and serverVersion variables at the top of the function to keep them local (yes, this is annoying, yes we need to fix that).&lt;br /&gt;&lt;br /&gt;An alternative approach is to invoke the &lt;span style="font-style: italic;"&gt;get()&lt;/span&gt; method on the Assembler itself, which will take care of unwrapping the array and throwing errors if there is a problem.  In order to do this you would need to create a Struct that contained "ARTISTID" as the &lt;span style="font-style: italic;"&gt;get() &lt;/span&gt;function takes a map of name/value pairs to support the possibility of multiple primary keys.  So this fix would look like this:&lt;br /&gt;&lt;br /&gt;    &amp;lt;cfcatch type="conflict"&amp;gt;&lt;br /&gt;       &amp;lt;cfset uid = {ARTISTID=new.getARTISTID()}&amp;gt;&lt;br /&gt;       &amp;lt;cfset serverVersion = read(uid)&amp;gt;&lt;br /&gt;       &amp;lt;cfset co.conflict(serverVersion)&amp;gt;&lt;br /&gt;   &amp;lt;/cfcatch&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Notice the use of the new ColdFusion 8 structure initialization!&lt;br /&gt;&lt;br /&gt;I can't believe we (specifically I) didn't notice this problem before, but as it turns out my conflict functions did not make use of the server version of the records in all of the applications I have written so I (and I guess our QA folks) didn't notice the problem until just recently.  On the bright side, this should be an easy thing to fix (and hopefully we will fix it in future releases of the Eclipse extensions) and gives me an opportunity to talk about this really helpful feature of the Extensions.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-6393088887454754968?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/y0foq0nx-94" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/6393088887454754968/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=6393088887454754968" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/6393088887454754968?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/6393088887454754968?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/y0foq0nx-94/conflict-bug-in-coldfusion-extensions.html" title="Conflict bug in ColdFusion Extensions for Eclipse" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/05/conflict-bug-in-coldfusion-extensions.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUASX04cSp7ImA9WxZbE0s.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-1901235234495842571</id><published>2008-04-16T11:33:00.003-04:00</published><updated>2008-04-16T11:37:28.339-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-16T11:37:28.339-04:00</app:edited><title>About me updated</title><content type="html">I realized that my "&lt;a href="http://tjordahl.blogspot.com/2003/08/about-me.html"&gt;About Me&lt;/a&gt;" link article hadn't been updated in quite a while, so I added some recent information and filled in my resume (such as it is) for the time &lt;span style="font-style: italic;"&gt;before &lt;/span&gt;I worked at Allaire/Macromedia/Adobe.  It was hard for me to remember (I've been here for 11 years last month!) but I found out you can &lt;a href="http://www.opengroup.org/dce/"&gt;download DCE&lt;/a&gt; as open source, and that there isn't really much &lt;a href="http://en.wikipedia.org/wiki/OSF/1"&gt;information about OSF/1&lt;/a&gt; out on the web.  This is a real shame since I still am very proud of what I was part of waaaay back in 1990. :-)&lt;br /&gt;&lt;br /&gt;Enjoy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-1901235234495842571?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/mZPyy-GUPbk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/1901235234495842571/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=1901235234495842571" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/1901235234495842571?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/1901235234495842571?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/mZPyy-GUPbk/about-me-updated.html" title="About me updated" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/04/about-me-updated.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEENRncyfCp7ImA9WxZUGEg.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-9107464752033990966</id><published>2008-04-10T11:22:00.005-04:00</published><updated>2008-04-10T15:44:57.994-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-10T15:44:57.994-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Web Service" /><title>Reprint: Consuming Web Service complex types in ColdFusion</title><content type="html">&lt;p&gt;In previous posts I have referenced an excellent article written by Doug James and Larry Afrin from the University of South Carolina.  The link for that article has since gone dead, but someone helpfully posted a link to the article via a web archive. I am going to reproduce it here so I have an easy reference for it and so its close to my &lt;a href="http://tjordahl.blogspot.com/2008/04/array-types-in-coldfusion-web-services.html"&gt;earlier post&lt;/a&gt; on array types.&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Notes on Interfacing ColdFusion MX to External Web Services Requiring Complex-within-Complex XML Documents as Input&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;Authors:&lt;br /&gt;Doug James (jamesd@musc.edu)&lt;br /&gt;Larry Afrin, MD (afrinl@musc.edu)&lt;br /&gt;Hollings Cancer Center&lt;br /&gt;&lt;br /&gt;Medical University of South Carolina&lt;br /&gt;March 31, 2005&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;cfacknowledgement&amp;gt;&lt;br /&gt;The authors would like to acknowledge Macromedia's Tom Jordahl (who we understand is sort&lt;br /&gt;of the principal developer and "guru" of ColdFusion's web services functionality) both for his&lt;br /&gt;assistance in helping them understand how ColdFusion handles certain complex web service&lt;br /&gt;interactions and for his critical review of the following document.&lt;br /&gt;&amp;lt;/cfacknowledgement&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;cfdisclaimer&amp;gt;&lt;br /&gt;While the authors have tried to ensure the accuracy and utility of the information below, they&lt;br /&gt;offer the following information with no warranties whatsoever and hereby explicitly state that their employer has had absolutely nothing to do with the development of this document and&lt;br /&gt;therefore also bears no liabilities with regard to how the information presented here may be used.&lt;/p&gt;&lt;p&gt;The authors are also quite sure that despite Tom Jordahl's review of this document, Macromedia&lt;br /&gt;takes no responsibility for this information, either.  By their posting of this information, the&lt;br /&gt;authors are not offering themselves as support resources for other developers wrestling with the&lt;br /&gt;problems addressed herein.  Requests for assistance in this area that are communicated to the&lt;br /&gt;authors may or may not be acknowledged or answered, solely at the authors' whim.  After all, we&lt;br /&gt;do have to attend first to our day jobs (which often spill over into our night jobs, too.)  ;-)&lt;br /&gt;&amp;lt;/cfdisclaimer&amp;gt;&lt;/p&gt;=======================================================&lt;br /&gt;&lt;p&gt;CFMX is able to communicate with web services hosted in arbitrary computing environments as long as the SOAP standards are followed.  The SOAP standards require that all input arguments to a web service be passed as XML documents.  The expected format of the XML document for any given input argument is defined either directly in the service's WSDL (Web Services Description Language) document, or by reference in that WSDL document to another data element definition document.&lt;/p&gt;&lt;p&gt;Before proceeding further to discuss how CFMX handles "complex"-type web service input arguments, it is helpful to review how CFMX handles a &amp;lt;cfinvoke&amp;gt; (or equivalent) request in general.  CFMX first retrieves the target service's WSDL, then runs this WSDL through the WSDL2Java tool (see below for more information), which outputs Java code defining Java-based classes equivalent to the XML data structures defined in the WSDL.  This Java code is then compiled.  The input arguments provided to &amp;lt;cfinvoke&amp;gt; are then mapped to the Java types generated by the compilation, and finally the Java stub functions for those types are called.  In this fashion, CFMX *automatically* converts input values referenced in &amp;lt;cfinvoke&amp;gt; or&lt;br /&gt;&amp;lt;cfinvokeargument&amp;gt; tags to XML documents of the appropriate formats based on input argument format information provided in the service's WSDL.  The burden on the coder, of&lt;br /&gt;course, is to ensure the input values are structured in accordance with what CFMX expects to&lt;br /&gt;find based on the translation by WSDL2Java from an XML-based data structure to a Java-based&lt;br /&gt;data structure.&lt;/p&gt;A similar process is followed to handle the service's return value and other output arguments.&lt;br /&gt;&lt;p&gt;This process is quite straightforward for "simple" type input arguments, such as simple strings or numeric values.  Because ColdFusion variables, strictly speaking, are untyped, CFMX&lt;br /&gt;automatically converts simple input ColdFusion variables to the equivalent string-based simple&lt;br /&gt;XML structures.&lt;/p&gt;&lt;p&gt;However, some web service input arguments are XML documents of "complex" type.  As briefly&lt;br /&gt;described in the ColdFusion MX 7 documentation at: &lt;a href="http://livedocs.macromedia.com/coldfusion/7/htmldocs/00001554.htm"&gt;http://livedocs.macromedia.com/coldfusion/7/htmldocs/00001554.htm &lt;/a&gt;for complex-type arguments, CFMX expects to find a ColdFusion structure provided as the value for the input argument.  Unfortunately, the ColdFusion MX documentation only provides clear examples of how to compose a ColdFusion structure that corresponds merely to a relatively simple form of a "complex" XML document in which the child elements of an outer "complex" parent element are simple scalar values, as illustrated in Example 1:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---------Example 1:------------------------------------&lt;br /&gt;WSDL snippet:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;s:complexType name="Employee"&amp;gt;&lt;br /&gt; &amp;lt;s:sequence&amp;gt;&lt;br /&gt;   &amp;lt;s:element minOccurs="1" maxOccurs="1" name="fname" type="s:string" /&amp;gt;&lt;br /&gt;   &amp;lt;s:element minOccurs="1" maxOccurs="1" name="lname" type="s:string" /&amp;gt;&lt;br /&gt;   &amp;lt;s:element minOccurs="1" maxOccurs="1" name="age" type="s:int" /&amp;gt;&lt;br /&gt;&amp;lt;/s:sequence&amp;gt;&lt;br /&gt;&amp;lt;/s:complexType&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Sample XML document:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;Employee&amp;gt;&lt;br /&gt;&amp;lt;fname&amp;gt;John&amp;lt;/fname&amp;gt;&lt;br /&gt;&amp;lt;lname&amp;gt;Smith&amp;lt;/fname&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;age&amp;gt;25&amp;lt;/age&amp;gt;&lt;br /&gt;&amp;lt;/Employee&amp;gt;&lt;br /&gt;&lt;/pre&gt;CFML snippet:&lt;br /&gt;&lt;pre&gt;&amp;lt;!--- Create a structure using CFScript, then call the web service. ---&amp;gt;&lt;br /&gt;&amp;lt;cfscript&amp;gt;&lt;br /&gt;stUser = structNew();&lt;br /&gt;stUser.fname = "John";&lt;br /&gt;stUser.lname = "Smith";&lt;br /&gt;stUser.age = 23;&lt;br /&gt;ws = createObject("webservice", "http://somehost/echosimple.asmx?wsdl");&lt;br /&gt;ws.echoStruct(stUser);&lt;br /&gt;&lt;br /&gt;&amp;lt;/cfscript&amp;gt;&lt;br /&gt;&lt;/pre&gt;-------------------------------------------------------&lt;br /&gt;&lt;p&gt;While the above is helpful for "simple" complex-type input arguments, the ColdFusion MX&lt;br /&gt;documentation provides no examples of how to compose a ColdFusion structure that corresponds to a more complex form of a complex-type XML document in which the child elements of an outer "complex" parent element are themselves "complex" parent elements (so-called "complex-within-complex" XML documents), as illustrated in Example 2:&lt;/p&gt;---------Example 2:------------------------------------&lt;br /&gt;&lt;p&gt;WSDL snippet:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;&amp;lt;s:complexType name="Employee"&amp;gt;&lt;br /&gt; &amp;lt;s:sequence&amp;gt;&lt;br /&gt;    &amp;lt;s:element minOccurs="1" maxOccurs="1" name="fname" type="s:string" /&amp;gt;&lt;br /&gt;    &amp;lt;s:element minOccurs="1" maxOccurs="1" name="lname" type="s:string" /&amp;gt;&lt;br /&gt;    &amp;lt;s:element minOccurs="0" maxOccurs="unbounded" name="nickname" type="s:nickname" /&amp;gt;&lt;br /&gt;    &amp;lt;s:element minOccurs="1" maxOccurs="1" name="age" type="s:int" /&amp;gt;&lt;br /&gt;    &amp;lt;s:element ref="s:address" minOccurs="0" maxOccurs="unbounded" name="address" /&amp;gt;&lt;br /&gt; &amp;lt;/s:sequence&amp;gt;&lt;br /&gt; &amp;lt;xsd:attribute name="employeeGender" type="string" use="required"/&amp;gt;&lt;br /&gt;&amp;lt;/s:complexType&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;s:complexType name="nickname"&amp;gt;&lt;br /&gt;  &amp;lt;s:simpleContent&amp;gt;&lt;br /&gt;      &amp;lt;s:extension base="string" /&amp;gt;&lt;br /&gt;  &amp;lt;/s:simpleContent&amp;gt;&lt;br /&gt;&amp;lt;/s:complexType&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;s:complexType name="address"&amp;gt;&lt;br /&gt; &amp;lt;s:sequence&amp;gt;&lt;br /&gt;    &amp;lt;s:element minOccurs="1" maxOccurs="1" name="street" type="s:string" /&amp;gt;&lt;br /&gt;    &amp;lt;s:element minOccurs="1" maxOccurs="1" name="street" type="s:string" /&amp;gt;&lt;br /&gt;    &amp;lt;s:element minOccurs="1" maxOccurs="1" name="state" type="s:state" /&amp;gt;&lt;br /&gt;    &amp;lt;s:element minOccurs="1" maxOccurs="1" name="zip" type="s:zip" /&amp;gt;&lt;br /&gt; &amp;lt;/s:sequence&amp;gt;&lt;br /&gt; &amp;lt;xsd:attribute name="addressType" type="string" use="required"/&amp;gt;&lt;br /&gt;&amp;lt;/s:complexType&amp;gt;&lt;br /&gt;&lt;/pre&gt;Sample XML document:&lt;br /&gt;&lt;pre&gt;&amp;lt;Employee employeeGender="Male"&amp;gt;&lt;br /&gt; &amp;lt;fname&amp;gt;John&amp;lt;/fname&amp;gt;&lt;br /&gt; &amp;lt;lname&amp;gt;Smith&amp;lt;/fname&amp;gt;&lt;br /&gt; &amp;lt;nickname&amp;gt;Jack&amp;lt;/nickname&amp;gt;&lt;br /&gt; &amp;lt;nickname&amp;gt;Johnny&amp;lt;/nickname&amp;gt;&lt;br /&gt; &amp;lt;age&amp;gt;25&amp;lt;/age&amp;gt;&lt;br /&gt; &amp;lt;address addressType="Home"&amp;gt;&lt;br /&gt;    &amp;lt;street&amp;gt;25 Main Street&amp;lt;/street&amp;gt;&lt;br /&gt;    &amp;lt;city&amp;gt;Townville&amp;lt;/street&amp;gt;&lt;br /&gt;    &amp;lt;state&amp;gt;Anystate&amp;lt;/state&amp;gt;&lt;br /&gt;    &amp;lt;zip&amp;gt;99999&amp;lt;/zip&amp;gt;&lt;br /&gt; &amp;lt;/address&amp;gt;&lt;br /&gt;&amp;lt;/Employee&amp;gt;&lt;br /&gt;&lt;/pre&gt;CFML snippet:&lt;br /&gt;&lt;pre&gt;&amp;lt;!--- Create a structure using CFScript, then call the web service. ---&amp;gt;&lt;br /&gt;&amp;lt;cfscript&amp;gt;&lt;br /&gt; stUser = structNew();&lt;br /&gt; stUser.fname = "John";&lt;br /&gt; stUser.lname = "Smith";&lt;br /&gt; stUser.age = 23;&lt;br /&gt; &amp;lt;!--- If .x corresponds to *element* &amp;lt;x&amp;gt;, then what syntax is used to specify an *attribute*?&lt;br /&gt;       How should employeeGender get set up in this struct?  Read on to find out.            ---&amp;gt;&lt;br /&gt; &amp;lt;!--- And what about the *two* nicknames?  stUser.nickname = ... clearly won't work.&lt;br /&gt;       Read on to find out how this is handled.                                              ---&amp;gt;&lt;br /&gt; &amp;lt;!--- And what about &amp;lt;address&amp;gt;?  Does that get coded simply as stUser.address = structNew(),&lt;br /&gt;       stUser.address.street = "25 Main Street", etc. etc.?????  The answer is "No."&lt;br /&gt;       Read on to find out more.                                                             ---&amp;gt;&lt;br /&gt; ws = createObject("webservice", "http://somehost/echosimple.asmx?wsdl");&lt;br /&gt; ws.echoStruct(stUser);&lt;br /&gt;&amp;lt;/cfscript&amp;gt;&lt;br /&gt;&lt;/pre&gt;-------------------------------------------------------&lt;br /&gt;There are just a few key (pardon the pun) principles you need to understand in order to determine how to compose a CF structure that CFMX will map to the properly formatted XML document needed as an input argument to an arbitrary web service:&lt;br /&gt;&lt;p&gt;(1) Principle #1: Any given key in a CF structure will be mapped by CFMX into *either* an&lt;br /&gt;element name *or* an attribute name depending on what role the WSDL says that particular&lt;br /&gt;name should play at that level in the document.  In other words, you do not need to differentiate&lt;br /&gt;between attributes and elements in the CFML structure you create; ColdFusion will automatically&lt;br /&gt;handle for you the proper mapping of each key into either an attribute or element as required by&lt;br /&gt;the WSDL.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Following along with Example 2 above, then, stUser.age will get translated into an &amp;lt;age&amp;gt; child *element* within the &amp;lt;Employee&amp;gt; parent element, and stUser.employeeGender will get translated as the employeeGender *attribute* within the &amp;lt;Employee&amp;gt; element.&lt;/p&gt;(2) Elements in a WSDL that can occur more than once (cf. the "address" element in Example 2 above) are represented in the CF struct as an array.  OK, but an array of what?  Well, it depends on how the WSDL defines the subelements.&lt;br /&gt;&lt;p&gt;Again, following along with Example 2 above, &amp;lt;address&amp;gt; would be coded into the stUser&lt;br /&gt;structure as follows:&lt;br /&gt;&lt;/p&gt;&lt;pre&gt;  stUser.address = arrayNew(1);&lt;br /&gt; stUser.address[1] = structNew();&lt;br /&gt; stUser.address[1].street = "25 Main Street";&lt;br /&gt; stUser.address[1].city = "Townville";&lt;br /&gt; stUser.address[1].state = "Anystate";&lt;br /&gt; stUser.address[1].zip = "99999";&lt;br /&gt; stUser.address[1].addressType = "Home";&lt;br /&gt;&lt;/pre&gt;and the nicknames would be coded as follows:&lt;br /&gt;&lt;pre&gt;  stUser.nickname = arrayNew(1);&lt;br /&gt; stUser.nickname[1].value = "Jack";&lt;br /&gt; stUser.nickname[2].value = "Johnny";&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;Hey!  Where did ".value" come from?  Read on:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;(3) As the complexity of the format of the required input XML document increases, it may&lt;br /&gt;become increasingly difficult to "guess," using the above two principles, how the corresponding CF structure should be coded.  (Similarly, when working with web service return variables, or&lt;br /&gt;output arguments, of complex-within-complex type, it may become difficult understanding why&lt;br /&gt;CFMX has translated the output into the rather complex structure revealed by &amp;lt;cfdump&amp;gt;.)  To help work through this, the coder should apply the WSDL2Java tool (see below for more&lt;br /&gt;information) against the target service's WSDL and carefully examine the output of this tool.&lt;br /&gt;WSDL2Java is an open source utility that takes a WSDL as input and outputs the Java beans&lt;br /&gt;corresponding to the methods of the web service described by the provided WSDL; importantly,&lt;br /&gt;the inputs and outputs for these methods are also defined in the corresponding beans.  Upon&lt;br /&gt;careful examination, the WSDL2Java output -- i.e., the Java code defining each bean -- clearly&lt;br /&gt;identifies the expected layouts of the CF structures corresponding to the inputs and outputs of the service's various methods.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;For example, one of the things that becomes clear upon examining the WSDL2Java output has to&lt;br /&gt;do with the use of ".value" above.  This is complicated, so read carefully: If an element (or&lt;br /&gt;sub-element) of an input argument defined in the WSDL is declared in the WSDL to be of&lt;br /&gt;"complex" type, but the corresponding definition in the WSDL of that complex datatype declares&lt;br /&gt;that the value of that datatype is in fact only a simple scalar value, then CFMX assumes the value to be passed as input for that element (i.e., the value placed between the &amp;lt;x&amp;gt; and &amp;lt;/x&amp;gt; tags) will be found in the corresponding CF structure (at the appropriate level) in association with a key named "value".&lt;/p&gt;Below is another example of a web service input argument formatting problem that was solved by examining the output of the WSDL2Java tool.  This is a real-world example of using CFMX to interface to a UDDI server.  UDDI stands for Universal Data Discovery &amp;amp; Integration.  UDDI servers are sort of the Domain Name System (DNS) of the web services world.  UDDI servers store information about web services, including their addresses.  A given web service could have many implementations around the world.  An application that wants to make use of these implementations doesn't have to know their addresses as long as (1) the service and its implementations are registered in UDDI, and (2) the application knows the address of at least one UDDI server (part of the UDDI standard includes, a la the Network News Transport Protocol (NNTP, used by Usenet discussion groups), a replication protocol so that UDDI servers exchange database updates with each other in order for them all to stay in sync).  UDDI servers can have a number of programmatic interfaces (e.g., URL-parameterized HTTP GETs), but the most robust interface they support is a web service interface.  That's right: you can use web services to query UDDI servers about web services.  However, the WSDL for the web service one uses to query a UDDI server is quite complex.  More information about UDDI can be found at &lt;a href="http://uddi.org/"&gt;http://uddi.org&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Here's an example of using the "find_business" method defined in the UDDI WSDL to retrieve information from the target UDDI server about the first 50 businesses known to that server whose names begin with "A":&lt;br /&gt;&lt;p&gt;---------Example 3:------------------------------------&lt;/p&gt;WSDL snippet:&lt;br /&gt;&lt;pre&gt;&amp;lt;xsd:complexType name="find_business"&amp;gt;&lt;br /&gt;  &amp;lt;xsd:sequence&amp;gt;&lt;br /&gt;      &amp;lt;xsd:element ref="uddi:name" minOccurs="0" maxOccurs="unbounded"/&amp;gt;&lt;br /&gt;      &amp;lt;xsd:element ref="uddi:identifierBag" minOccurs="0"/&amp;gt;&lt;br /&gt;      &amp;lt;xsd:element ref="uddi:categoryBag" minOccurs="0"/&amp;gt;&lt;br /&gt;      &amp;lt;xsd:element ref="uddi:tModelBag" minOccurs="0"/&amp;gt;&lt;br /&gt;      &amp;lt;xsd:element ref="uddi:discoveryURLs" minOccurs="0"/&amp;gt;&lt;br /&gt;      &amp;lt;xsd:element ref="uddi:findQualifiers" minOccurs="0"/&amp;gt;&lt;br /&gt;  &amp;lt;/xsd:sequence&amp;gt;&lt;br /&gt;  &amp;lt;xsd:attribute name="generic" type="string" use="required"/&amp;gt;&lt;br /&gt;  &amp;lt;xsd:attribute name="maxRows" type="int" use="optional"/&amp;gt;&lt;br /&gt;&amp;lt;/xsd:complexType&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;xsd:complexType name="name"&amp;gt;&lt;br /&gt;  &amp;lt;xsd:simpleContent&amp;gt;&lt;br /&gt;      &amp;lt;xsd:extension base="string"&amp;gt;&lt;br /&gt;          &amp;lt;xsd:attribute ref="xml:lang" use="optional"/&amp;gt;&lt;br /&gt;      &amp;lt;/xsd:extension&amp;gt;&lt;br /&gt;  &amp;lt;/xsd:simpleContent&amp;gt;&lt;br /&gt;&amp;lt;/xsd:complexType&amp;gt;&lt;br /&gt;&lt;/pre&gt;CFML snippet:&lt;br /&gt;&lt;pre&gt;&amp;lt;cfscript&amp;gt;&lt;br /&gt; // define the main outer structure, findBiz in this case, can be named anything one chooses&lt;br /&gt; findBiz = structNew();&lt;br /&gt;&lt;br /&gt; //generic and maxRows are attributes (required and optional, respectively) of the uddi:find_business tag&lt;br /&gt; findBiz.generic = "2.0";&lt;br /&gt; findBiz.maxRows = 50;&lt;br /&gt;&lt;br /&gt; //uddi:find_business tag accepts one *or more* "name" values, so an array is used&lt;br /&gt; findBiz.name = arrayNew(1);&lt;br /&gt; findBiz.name[1] = structNew();&lt;br /&gt;&lt;br /&gt; //uddi:name tag is a complex type with a string value, so 'value' is used as the key to the structure&lt;br /&gt; findBiz.name[1].value = "A";&lt;br /&gt;&amp;lt;/cfscript&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!---&lt;br /&gt;  Important note:&lt;br /&gt;  In the &amp;lt;cfinvoke&amp;gt; below, the URL to the UDDI WSDL is the value of the "webservice"&lt;br /&gt;parameter; the "method" parameter specifies the UDDI inquiry method called "find_business",&lt;br /&gt;which returns a uddi:businessList object in the returnVariable "busList".&lt;br /&gt;&lt;br /&gt;  In the UDDI WSDL, the "find_business" method is defined as requiring an input parameter&lt;br /&gt;named "body" of complex type "find_business" which is also defined in the WSDL.  The&lt;br /&gt;parameter name "body" shown in the &amp;lt;cfinvoke&amp;gt; below could also have been set up as a&lt;br /&gt;&amp;lt;cfinvokeargument name="body" value="#findBiz#"&amp;gt; tag within the &amp;lt;cfinvoke&amp;gt;.&lt;br /&gt;&lt;br /&gt;  The actual version 2.0 UDDI WSDL is at &lt;a href="http://uddi.org/wsdl/inquire_v2.wsdl"&gt;http://uddi.org/wsdl/inquire_v2.wsdl&lt;/a&gt;.  This address&lt;br /&gt;cannot be referenced as the "webservice" parameter in the &amp;lt;cfinvoke&amp;gt; tag because this particular&lt;br /&gt;WSDL does not define the addresses of any actual UDDI servers.  Thus, to query a UDDI server,&lt;br /&gt;one has to copy this "generic" WSDL to somewhere else and modify it by adding in the proper&lt;br /&gt;WSDL code to identify at least one actual UDDI server.  The &amp;lt;cfinvoke&amp;gt; is then pointed at this&lt;br /&gt;modified WSDL.  CFMX will read the modified WSDL from this location, and in this modified&lt;br /&gt;WSDL CFMX will find where it has to go to contact the actual UDDI service being targeted by&lt;br /&gt;the coder.&lt;br /&gt;&lt;br /&gt;  The WSDL code that identifies an actual UDDI server is as follows.  This happens to be the&lt;br /&gt;real code for pointing at the main IBM UDDI server.  This code gets inserted just ahead of the&lt;br /&gt;closing &amp;lt;/definitions&amp;gt; tag of the "generic" UDDI WSDL.&lt;br /&gt;&lt;br /&gt; &lt;span&gt;          &lt;/span&gt;&amp;lt;service name="InquireSoap"&amp;gt;&lt;br /&gt;&lt;span&gt;                        &lt;/span&gt;&amp;lt;port name="InquireSoap" binding="tns:InquireSoap"&amp;gt;&lt;br /&gt;&lt;span&gt;                                    &lt;/span&gt;&amp;lt;soap:address location="&lt;a href="http://uddi.ibm.com/ubr/inquiryapi"&gt;http://uddi.ibm.com/ubr/inquiryapi&lt;/a&gt;" /&amp;gt;&lt;br /&gt;&lt;span&gt;                        &lt;/span&gt;&amp;lt;/port&amp;gt;&lt;br /&gt;&lt;span&gt;            &lt;/span&gt;&amp;lt;/service&amp;gt;&lt;br /&gt;---&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;cfinvoke&lt;br /&gt; webservice = "http://www.webhost.com/modified_uddi_v2.wsdl"&lt;br /&gt; method = "find_business"&lt;br /&gt; body = #findBiz#&lt;br /&gt; returnvariable="busList"&amp;gt;&lt;br /&gt;&amp;lt;/cfinvoke&amp;gt;&lt;br /&gt;&lt;/pre&gt;-------------------------------------------------------&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;And another example from the world of UDDI, this time using the get_businessDetail method:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;---------Example 4:------------------------------------&lt;/p&gt;WSDL snippet:&lt;br /&gt;&lt;pre&gt;&amp;lt;xsd:complexType name="get_businessDetail"&amp;gt;&lt;br /&gt;  &amp;lt;xsd:sequence&amp;gt;&lt;br /&gt;      &amp;lt;xsd:element ref="uddi:businessKey" maxOccurs="unbounded"/&amp;gt;&lt;br /&gt;  &amp;lt;/xsd:sequence&amp;gt;&lt;br /&gt;  &amp;lt;xsd:attribute name="generic" type="string" use="required"/&amp;gt;&lt;br /&gt;&amp;lt;/xsd:complexType&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;xsd:simpleType name="businessKey"&amp;gt;&lt;br /&gt;  &amp;lt;xsd:restriction base="string"/&amp;gt;&lt;br /&gt;&amp;lt;/xsd:simpleType&amp;gt;&lt;br /&gt;&lt;/pre&gt;CFML snippet:&lt;br /&gt;&lt;pre&gt;&amp;lt;cfscript&amp;gt;&lt;br /&gt; // busDetail is outer main structure&lt;br /&gt; busDetail = structNew();&lt;br /&gt;&lt;br /&gt; // generic is the required attribute of the "get_businessDetail" tag&lt;br /&gt; busDetail.generic = "2.0";&lt;br /&gt;&lt;br /&gt; //businessKey tag can occur many times, so it is mapped to an array&lt;br /&gt; busDetail.businessKey = arrayNew(1);&lt;br /&gt;&lt;br /&gt; /*&lt;br /&gt;  Because the "get_businessDetail" tag has attributes and sub-elements, the sub-elements have to&lt;br /&gt;  be mapped into structures as well, and, similar to the uddi:name above, the sub-element&lt;br /&gt;  "businessKey" just contains a string, so the key name 'value' is used. */&lt;br /&gt;&lt;br /&gt; for (x = 1; x LTE arrayLen(busKeys); x = x + 1) {&lt;br /&gt;    busDetail.businessKey[x] = structNew();&lt;br /&gt;    busDetail.businessKey[x].value = busKeys[x];   //busKeys is an array predefined from another process&lt;br /&gt; }&lt;br /&gt;&amp;lt;/cfscript&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!---&lt;br /&gt;  As in Example 3, the UDDI WSDL declares that an input parameter named "body", of&lt;br /&gt;complex type "get_businessDetail", is required for the "get_businessDetail" method.&lt;br /&gt;---&amp;gt;&lt;br /&gt;&amp;lt;cfinvoke&lt;br /&gt; webservice = "http://www.webhost.com/modified_uddi_v2.wsdl"&lt;br /&gt; method = "get_businessDetail"&lt;br /&gt; body = #busDetail#&lt;br /&gt; returnvariable="busEntity"&amp;gt;&lt;br /&gt;&amp;lt;/cfinvoke&amp;gt;&lt;br /&gt;&lt;/pre&gt;-------------------------------------------------------&lt;br /&gt;&lt;p&gt;MORE INFORMATION ABOUT WSDL2Java:&lt;/p&gt;WSDL2Java is a Java program that was created by the Apache group and is included in the CFMX distribution with the Axis package, the Apache group's implementation of the W3C SOAP standard.&lt;br /&gt;&lt;p&gt;To run WSDL2Java from the command line:&lt;br /&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;The current directory needs to be the ColdFusion installation's 'lib' directory:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Windows: C:\CFusionMX\lib&lt;br /&gt;&lt;/li&gt;&lt;li&gt;RedHat Linux: /opt/coldfusionmx/lib&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Set classpath to include the following jar files:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;RedHat Linux:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;axis.jar&lt;br /&gt;&lt;/li&gt;&lt;li&gt;saaj.jar&lt;br /&gt;&lt;/li&gt;&lt;li&gt;jaxrpc.jar&lt;br /&gt;&lt;/li&gt;&lt;li&gt;xercesImpl.jar&lt;br /&gt;&lt;/li&gt;&lt;li&gt;wsdl4j.jar&lt;br /&gt;&lt;/li&gt;&lt;li&gt;commons-logging-1.0.2.jar&lt;br /&gt;&lt;/li&gt;&lt;li&gt;commons-discovery.jar&lt;br /&gt;&lt;/li&gt;&lt;li&gt;xml-apis.jar&lt;br /&gt;&lt;/li&gt;&lt;li&gt;activation.jar (This jar file can be found by adding runtime/lib/jrun.jar to the end of the classpath.  Alternatively, it can be downloaded from Sun's Java Activation Framework web site.)&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Windows:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;SET&lt;br /&gt;CLASSPATH=axis.jar;saaj.jar;jaxrpc.jar;xercesImpl.jar;wsdl4j.jar;commons-logging-1.0.2.jar;commons-discovery.jar;activation.jar;xml-apis.jar&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Run the WSDL2Java program:&lt;br /&gt;&lt;pre&gt;   Usage:  java org.apache.axis.wsdl.WSDL2Java [options] WSDL-URI&lt;br /&gt;      '-v' option prints informational messages&lt;br /&gt;      '-o' option is the output directory for emitted files.&lt;br /&gt;      WSDL-URI can be either local or remote&lt;br /&gt;&lt;br /&gt;   &lt;br /&gt;  Example: java org.apache.axis.wsdl.WSDL2Java -v -o C:\wsdl2java_output http://uddi.org/wsdl/inquire_v2.wsdl&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;More information about WSDL2Java can be found on the Apache Web Service web site, currently &lt;a href="http://ws.apache.org/axis/java/user-guide.html#WSDL2JavaBuildingStubsSkeletonsAndDataTypesFromWSDL"&gt;http://ws.apache.org/axis/java/user-guide.html#WSDL2JavaBuildingStubsSkeletonsAndDataTypesFromWSDL&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-9107464752033990966?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/2HvmGnJ7u4Q" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/9107464752033990966/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=9107464752033990966" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/9107464752033990966?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/9107464752033990966?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/2HvmGnJ7u4Q/reprint-consuming-web-service-complex.html" title="Reprint: Consuming Web Service complex types in ColdFusion" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/04/reprint-consuming-web-service-complex.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak4DR3g9fSp7ImA9WxZUGE4.&quot;"><id>tag:blogger.com,1999:blog-5743359.post-3085251670964028951</id><published>2008-04-10T10:40:00.004-04:00</published><updated>2008-04-10T10:49:36.665-04:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-04-10T10:49:36.665-04:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Data Management" /><title>LiveCycle Data Services 2.6 Public Beta</title><content type="html">We are close to releasing LiveCycle Data Services version 2.6, which is the technology that allows you to do some really cool stuff with &lt;a href="http://opensource.adobe.com/wiki/display/flexsdk/Flex+SDK"&gt;Flex 3&lt;/a&gt; data driven applications.  This release is based on the &lt;a href="http://opensource.adobe.com/wiki/display/blazeds/BlazeDS"&gt;BlazeDS 3.0&lt;/a&gt; open source technology, which includes RPC and Messaging technologies for Flex, but in addition gives you better scalability by including RTMP based channels, a new scalable HTTP based channel technology and some very powerful abilities to manage datasets, including automatic synchronization of changes, conflict detection, paging and support for Flex and AIR offline data caching.&lt;br /&gt;&lt;br /&gt;In preparation for the final release, we &lt;a href="http://labs.adobe.com/technologies/livecycle_dataservices2_6/"&gt;released a public beta&lt;/a&gt; (we call it beta 2) on Adobe Labs last night.&lt;br /&gt;&lt;br /&gt;Check out details at &lt;a href="http://labs.adobe.com/technologies/livecycle_dataservices2_6/"&gt;http://labs.adobe.com/technologies/livecycle_dataservices2_6/&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5743359-3085251670964028951?l=tjordahl.blogspot.com'/&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/TomJordahlsMusings/~4/LWEINQlaeDQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://tjordahl.blogspot.com/feeds/3085251670964028951/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5743359&amp;postID=3085251670964028951" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/3085251670964028951?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5743359/posts/default/3085251670964028951?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/TomJordahlsMusings/~3/LWEINQlaeDQ/livecycle-data-services-26-public-beta.html" title="LiveCycle Data Services 2.6 Public Beta" /><author><name>Tom</name><uri>http://www.blogger.com/profile/02008328853735352613</uri><email>noreply@blogger.com</email><gd:extendedProperty name="OpenSocialUserId" value="13647662388650932222" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://tjordahl.blogspot.com/2008/04/livecycle-data-services-26-public-beta.html</feedburner:origLink></entry></feed>
