<?xml version="1.0"?>
<!-- RSS generated by Radio UserLand v8.2.1 on Mon, 11 Sep 2006 13:11:49 GMT -->
<rss version="2.0">
	<channel>
		<title>David Black: ws</title>
		<link>http://radio.weblogs.com/0146416/categories/ws/</link>
		<description>Web Services and Service-oriented programming</description>
		<language>en</language>
		<copyright>Copyright 2006 David Black</copyright>
		<lastBuildDate>Mon, 11 Sep 2006 13:11:49 GMT</lastBuildDate>
		<docs>http://backend.userland.com/rss</docs>
		<generator>Radio UserLand v8.2.1</generator>
		<managingEditor>dblack@codecurl.org</managingEditor>
		<webMaster>dblack@codecurl.org</webMaster>
		<category domain="http://www.weblogs.com/rssUpdates/changes.xml">rssUpdates</category> 
		<skipHours>
			<hour>23</hour>
			<hour>0</hour>
			<hour>1</hour>
			<hour>2</hour>
			<hour>3</hour>
			<hour>4</hour>
			<hour>5</hour>
			<hour>6</hour>
			</skipHours>
		<cloud domain="radio.xmlstoragesystem.com" port="80" path="/RPC2" registerProcedure="xmlStorageSystem.rssPleaseNotify" protocol="xml-rpc"/>
		<ttl>60</ttl>
		<item>
			<title>Refactoring SOA Artifacts - Part 1</title>
			<description>One of the key features that first hooked me on Eclipse was its (Java) refactoring capabilities. Refactoring is an indispensable tool in the Java code jockeys toolbox, and Eclipse makes it easy. The &lt;a href=&quot;http://www.eclipse.org/articles/Article-LTK/ltk.html&quot;&gt;Eclipse Language Toolkit&lt;/a&gt; (LTK) provides a framework within which to build refactorings.&lt;br&gt;&lt;br&gt;As we move into the realm of service-oriented programming, developing services that can be deployed on Enterprise Service Buses, I&apos;d like to see the same level of refactoring available for SOA artifacts. By SOA artifacts I mean things like WSDL, BPEL, deployment descriptors, as well as Java classes and other language files. At the detail level, the relationships between these artifacts can be complex.&lt;br&gt;&lt;br&gt;With WSDL described services, when the WSDL changes some refactoring often happens automatically i.e. tooling can regenerate the proxy code for a service when the WSDL describing the service changes. But beyond this kind of thing, more sophisticated refactoring is required. In fact, whether this refactoring is done explicitly by the user, or implicitly by the tooling reacting to changes in WSDL and automatically altering other artifacts, much of what needs to be done is the same.&lt;br&gt;&lt;br&gt;The use case I&apos;m starting with is a simple one. A BPEL script implements a service defined using WSDL. The BPEL script invokes another service also defined in WSDL. It should be possible to rename a portType operation by highlighting the operation in the WTP WSDL Editor in Eclipse, right clicking and choosing Refactor | Rename. I&apos;m considering both the cases of the service implemented and the service invoked. &lt;br&gt;&lt;br&gt;It is worth noting that the WSDL editor in Eclipse 3.2 provides a basic rename refactoring feature, but to date I think its pretty limited.&lt;br&gt;&lt;br&gt;The LTK provides a high level framework for refactoring, within which I&apos;m going to put the framework for SOA artifact refactoring. The basic steps are something like this:&lt;br&gt;&lt;br&gt;&lt;ol&gt;&lt;li&gt;Identify the refactoring the user wishes to perform e.g. renaming a WSDL portType operation.&lt;/li&gt;&lt;li&gt;Find all the projects and artifacts in the workspace that should be changed.&lt;/li&gt;&lt;li&gt;Perform the initial sanity check.&lt;/li&gt;&lt;li&gt;Ask the user for more information if necessary.&lt;/li&gt;&lt;li&gt;Calculate the changes required to each artifact.&lt;/li&gt;&lt;li&gt;Check that each artifact will still be valid after the changes.&lt;/li&gt;&lt;li&gt;Present the changes to the user for acceptance or alteration.&lt;/li&gt;&lt;li&gt;Commit the changes.&lt;br&gt;&lt;/li&gt;&lt;/ol&gt;Lets have a look at a snippet from a really simple WSDL file, &lt;span style=&quot;font-style: italic;&quot;&gt;HelloWorld.wsdl&lt;/span&gt;, that shows an operation called &lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;sayHello&lt;/span&gt;:&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;wsdl:portType name=&quot;HelloWorld&quot;&gt;&lt;/wsdl:portType&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;wsdl:portType 
name=&quot;HelloWorld&quot;&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp; &amp;lt;wsdl:operation 
name=&quot;sayHello&quot;&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;wsdl:input&amp;nbsp; 
message=&quot;tns:sayHelloRequest&quot;/&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;wsdl:output 
message=&quot;tns:sayHelloResponse&quot;/&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp; 
&amp;lt;/wsdl:operation&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;/wsdl:portType&amp;gt;&lt;/span&gt;&lt;br style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;  &lt;wsdl:operation name=&quot;sayHello&quot;&gt;&lt;/wsdl:operation&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;wsdl:input message=&quot;tns:sayHelloRequest&quot;&gt;&lt;/wsdl:input&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;wsdl:output message=&quot;tns:sayHelloResponse&quot;&gt;&lt;/wsdl:output&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;/span&gt;&lt;br&gt;Lets suppose this WSDL operation has a SOAP binding. The operation name also appears in the binding and in the soapAction attribute in the binding:&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;wsdl:binding name=&quot;HelloWorldBinding&quot; type=&quot;tns:HelloWorld&quot;&gt;&lt;/wsdl:binding&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;wsdl:binding 
name=&quot;HelloWorldBinding&quot; type=&quot;tns:HelloWorld&quot;&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp; &amp;lt;soap:binding 
style=&quot;rpc&quot; transport=&quot;http://schemas.xmlsoap.org/soap/http&quot;/&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp; &amp;lt;wsdl:operation 
name=&quot;sayHello&quot;&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;soap:operation 
soapAction=&quot;cc:HelloWorldService:HelloWorld#sayHello&quot;/&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ...&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp; 
&amp;lt;/wsdl:operation&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;/wsdl:binding&amp;gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;As in the example, by convention message names often follow the form: &lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;operation&gt;Request&lt;/operation&gt;&lt;/span&gt;, &lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;operation&gt;Response&lt;/operation&gt;&lt;/span&gt;. It would be great if the user could choose to also rename these as an optional part of renaming the operation name.&lt;br&gt;&lt;br&gt;One of the Eclipse plugins I&apos;m going to develop will house the framework core. The implementations of the various parts of the framework can be contributed via extension points.&lt;br&gt;&lt;br&gt;Lets consider the problem of finding all the relevant artifacts and the projects that house them across the Eclipse workspace. While this first use case considers just WSDL and BPEL, the search-for-artifacts step, at a high level, is general enough. &lt;br&gt;&lt;br&gt;The job of the Artifact Finders is to find projects and their artifacts that require changing in response to the operation rename.&lt;br&gt;&lt;br&gt;Consider the case where the &lt;span style=&quot;font-style: italic;&quot;&gt;HelloWorld.wsdl&lt;/span&gt; file lives in one project, some projects have a link to it and others have a copy of it. The projects with a link to it are easy enough to find. Any projects that contain a file called &lt;span style=&quot;font-style: italic;&quot;&gt;HelloWorld.wsdl&lt;/span&gt; are also candidates, but just because one WSDL file has the same name as another does not mean they represent the same service, or the same version of the service. A trickier case again is where the WSDL file is indirectly referenced e.g. it is imported by another WSDL file, or referenced in a descriptor file. For these latter cases we may require some deep searching, which could be time consuming, so we need to bear that in mind.&lt;br&gt;&lt;br&gt;Artifact Finders are one element of the framework. The Artifact Finder interface will look something like this:&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;public interface IArtifactFinder {&lt;/span&gt;&lt;br style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;  public RefactoringParticipant[] findArtifacts(SOAArtifactRefactoringArguments args); &lt;/span&gt;&lt;br style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;}&lt;/span&gt;&lt;br style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;br&gt;And the extension point is defined like this: &lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;extension point=&quot;org.codecurl.soa.refactor.finders&quot;&gt;&lt;/extension&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;extension 
point=&quot;org.codecurl.soa.refactor.finders&quot;&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp; &amp;lt;artifact-finder 
&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; id=&quot;foo.id&quot; &lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; name=&quot;Foo Refactor BPEL 
Artifact Finder&quot; &lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
class=&quot;org.codecurl.soa.refactor.finders.FooFinderImpl&quot;/&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;/extension&amp;gt;&lt;br&gt;&lt;br&gt;&lt;/span&gt;Lets look next at the changes required to the BPEL script, considering first the case where the BPEL service implements the interface defined by the &lt;span style=&quot;font-style: italic;&quot;&gt;HelloWorld.wsdl&lt;/span&gt; file. The variable definitions for the input and output messages may need be to changed (if the user has chosen to also rename the input and output message types):&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;bpws:variable name=&quot;sayHelloRequest&quot; messagetype=&quot;ns:sayHelloRequest&quot;&gt;&lt;/bpws:variable&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;bpws:variable 
name=&quot;sayHelloRequest&quot; messageType=&quot;ns:sayHelloRequest&quot;/&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;bpws:variable 
name=&quot;sayHelloResponse&quot; messageType=&quot;ns:sayHelloResponse&quot;/&amp;gt;&lt;/span&gt;&lt;br style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;bpws:variable name=&quot;sayHelloResponse&quot; messagetype=&quot;ns:sayHelloResponse&quot;&gt;&lt;/bpws:variable&gt;&lt;/span&gt;&lt;br&gt;For consistency, we should allow the user to rename the variables too if the message type names are changing. The receive starts the process:&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;bpws:receive partnerlink=&quot;HelloWorld&quot; porttype=&quot;ns:HelloWorld&quot;&gt;&lt;/bpws:receive&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;bpws:receive 
partnerLink=&quot;HelloWorld&quot; portType=&quot;ns:HelloWorld&quot;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp; operation=&quot;sayHello&quot; 
variable=&quot;sayHelloRequest&quot;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp; 
createInstance=&quot;yes&quot;&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;/bpws:receive&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;So the operation name is changing and maybe also the variable name. And the process ends with a reply:&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;bpws:reply partnerlink=&quot;HelloWorld&quot; porttype=&quot;ns:HelloWorld&quot;&gt;&lt;/bpws:reply&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;bpws:reply 
partnerLink=&quot;HelloWorld&quot; portType=&quot;ns:HelloWorld&quot;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp; operation=&quot;sayHello&quot; 
variable=&quot;sayHelloResponse&quot;&amp;gt; &lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;/bpws:reply&amp;gt;&lt;/span&gt;&lt;br&gt;&lt;br&gt;Again, the operation name and possibly the variable name will change.&lt;br&gt;&lt;br&gt;In the case where the BPEL process is invoking the &lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;HelloWorld&lt;/span&gt; service, we need to consider the invoke element. The operation name attribute value will change, and the &lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;inputVariable&lt;/span&gt; and &lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;outputVariable&lt;/span&gt; attribute values may change:&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;bpws:invoke partnerlink=&quot;HelloWorld&quot; porttype=&quot;ns:HelloWorld&quot;&gt;&lt;/bpws:invoke&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;bpws:invoke 
partnerLink=&quot;HelloWorld&quot; portType=&quot;ns:HelloWorld&quot;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp; operation=&quot;sayHello&quot; 
inputVariable=&quot;sayHelloRequest&quot;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp; 
outputVariable=&quot;sayHelloResponse&quot;&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;/bpws:invoke&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;br&gt;We need to set up the invoke call by populating the &lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;sayHelloRequest&lt;/span&gt; message, so we should look for assign elements that use the variables:&lt;br&gt;&lt;br&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;bpws:assign&gt;&lt;/bpws:assign&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;bpws:assign&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp; 
&amp;lt;bpws:copy&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&amp;lt;bpws:from&amp;gt;&amp;lt;xs:string&amp;gt;Bob&amp;lt;/xs:string&amp;gt;&amp;lt;/bpws:from&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;bpws:to 
variable=&quot;sayHelloRequest&quot;/&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;nbsp;&amp;nbsp; 
&amp;lt;/bpws:copy&amp;gt;&lt;/span&gt;&lt;br style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&lt;span style=&quot;color: rgb(51, 0, 153); font-family: Courier;&quot;&gt;&amp;lt;/bpws:assign&amp;gt;&lt;/span&gt;&lt;br style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;span style=&quot;font-family: Courier; color: rgb(51, 0, 153);&quot;&gt;&lt;/span&gt;&lt;br&gt;Callbacks (onMessage) also need to be considered.&lt;br&gt;&lt;br&gt;One of things I want is APIs for refactoring the various models (WSDL, BPEL, whatever). I like to start with a &quot;perfect&quot; API for something like this, and then implement that with off the shelf components (like &lt;a href=&quot;http://sourceforge.net/projects/wsdl4j&quot;&gt;WSDL4J&lt;/a&gt;) and whatever additional code is required.&lt;br&gt;&lt;br&gt;Once I have the framework plugin working for this simple example, I will look at contributing to the appropriate Eclipse project/area. Maybe the &lt;a href=&quot;http://www.eclipse.org/stp/&quot;&gt;SOA Tools Platform&lt;/a&gt; and/or the LTK.&lt;br&gt;&lt;br&gt;&lt;br&gt;</description>
			<guid>http://radio.weblogs.com/0146416/categories/ws/2006/08/18.html#a51</guid>
			<pubDate>Fri, 18 Aug 2006 07:29:26 GMT</pubDate>
			<comments>http://radiocomments2.userland.com/comments?u=146416&amp;amp;p=51&amp;amp;link=http%3A%2F%2Fradio.weblogs.com%2F0146416%2F2006%2F08%2F18.html%23a51</comments>
			</item>
		</channel>
	</rss>
