<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4038331289687265045</id><updated>2011-11-28T01:45:41.998+02:00</updated><category term='civil self-organisation'/><category term='tech -ing'/><category term='tools'/><category term='SOA'/><category term='BPEL'/><category term='AIs'/><category term='ESB'/><category term='Open Source'/><title type='text'>evolving through ...</title><subtitle type='html'>Posts regarding the evolution of thoughts, ideas, technology and everything that can be a step further.

Considerations over any kind of emergence ..</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>39</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-2364414997284176774</id><published>2009-03-13T15:34:00.001+02:00</published><updated>2010-03-07T11:57:10.212+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech -ing'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>Applications architecture and the S.O.A. alternative</title><content type='html'>&lt;p align="justify"&gt;Observing the developments on IT areas the last few years (no more than 10), one will conclude that the definition of ‘application' is rapidly changing. As the industry is moving from using an application-centric architecture to a Service Oriented Architecture (S.O.A.), the focus for building functionality is moving to Service Oriented Business Applications ( a nice description about that, except from the various posts in “evolving through …” you can find in &lt;a href="http://www.theenterprisearchitect.eu/archive/2008/05/19/architecture-requirements-for-service-oriented-business-applications"&gt;SOBA&lt;/a&gt; more concentrated). &lt;/p&gt;  &lt;p align="justify"&gt;The above view, could provide the alternative to view applications as a set of services and components working together in fulfilling a certain business need. The technology, specifications, and standards for specifying these components and services may vary, and the choice is up to you, and of coarse your environment as a whole. &lt;/p&gt;  &lt;p align="justify"&gt;In various post here, I propose and expose from time to time this kind of approach, creating therefore any needed components and services in a model driven way and always having in mind an S.O.A. extension. However, even in that case you'll need some kind of programming model that defines interfaces, implementations, and references. The pros of this alternative is that when building an application or solution based on services, these services can be both created specifically for the application and reused from existing systems and applications. The discussions behind these, is known as Service Component Architecture (&lt;a href="http://en.wikipedia.org/wiki/Service_component_architecture"&gt;SCA&lt;/a&gt;), meaning the programming model that specifies how to create and implement services, how to reuse them and how to assemble or compose services into solutions. &lt;/p&gt;  &lt;p align="justify"&gt;The reason for this post, was an interesting project that an involved-in friend, asked for my opinion. The project is the &lt;a href="http://wiki.aspire.objectweb.org/xwiki/bin/view/Main/WebHome"&gt;AspireRFID&lt;/a&gt; an (one of the very-very few) &lt;a href="http://en.wikipedia.org/wiki/RFID"&gt;RFID&lt;/a&gt; implementations that run over the Open Source community and therefore a candidate new niche for that domain. Although the existing approach is very interesting and very well analysed, I couldn't stop myself on telling that a more Service Oriented approach should be taken. This alternative might seem a little obscure, from the point of view that the technicalities and area of RFIDs might relate with a different business model than the well known explored ‘B’ in the SOBA. Actually, this is not the case. And the reason is that this area is promising candidate for that ‘B’ because the limited relations toy ERPs, CRMs or what ever, are the until know the well defined areas and developments of the various alternatives of open source that could be used on (aka &lt;a href="http://www.osgi.org/"&gt;OSGi&lt;/a&gt;, &lt;a href="http://servicemix.apache.org/"&gt;ServiceMix&lt;/a&gt;, &lt;a href="http://fusesource.com/products/enterprise-servicemix"&gt;FUSE&lt;/a&gt;,&amp;#160; &lt;a href="http://camel.apache.org/"&gt;Camel&lt;/a&gt;, &lt;a href="http://newton.codecauldron.org/site/index.html"&gt;Newton&lt;/a&gt;, &lt;a href="http://www.jini.org/wiki/Main_Page"&gt;Jini&lt;/a&gt;, &lt;a href="http://tuscany.apache.org/"&gt;Tuscany&lt;/a&gt; etc). So, in that case the solution might not be a S.O.A. a S.O.A. towards one.&lt;/p&gt;  &lt;h5&gt;who’s and why’s of &lt;a name="#introducingsca"&gt;Service Component Architecture (SCA)&lt;/a&gt;&lt;/h5&gt;  &lt;p align="justify"&gt;As has been stated in &lt;a href="http://dimosthenes.blogspot.com/2009/01/soa-marketing-and-expenses-on.html"&gt;here&lt;/a&gt; and &lt;a href="http://dimosthenes.blogspot.com/2009/01/on-reference-architecture-for-soa.html"&gt;here&lt;/a&gt;, mentioning of an alternative is a crucial concern when there is the involvement of the meaning that one gives to S.O.A.. The SCA models the &amp;quot;A&amp;quot; in S.O.A. (and therefore not SOA). It provides a model for service construction, service assembly, and deployment. The SCA supports components defined in multiple languages, deployed in multiple container technologies, and with multiple service access methods. This means that with the SCA approach, we have a set of specifications, addressing both runtime v&lt;a href="http://wikiatic.com/wikisearch/search?q=SCA%20provides%20a%20set%20of%20specifications,%20addressing%20both%20runtime%20v"&gt;&lt;/a&gt;&lt;a href="http://wikiatic.com/wikisearch/search?q=SCA%20provides%20a%20set%20of%20specifications,%20addressing%20both%20runtime%20v"&gt;&lt;/a&gt;&lt;a href="http://wikiatic.com/wikisearch/search?q=SCA%20provides%20a%20set%20of%20specifications,%20addressing%20both%20runtime%20v"&gt;&lt;/a&gt;endors and enterprise developers/architects, for building service-oriented enterprise applications. &lt;/p&gt;  &lt;p align="justify"&gt;The SCA specifications try to define a model for building Service-Oriented (Business) Applications (SOBA). These specifications are based on the following design principles: &lt;/p&gt;  &lt;h5&gt;&lt;img style="display: inline; margin-left: 0px; margin-right: 0px" title="OSOA" alt="OSOA" align="right" src="http://www.theenterprisearchitect.eu/images/osoa.gif" /&gt;&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;Independent of programming language or underlying implementation. &lt;/li&gt;    &lt;li&gt;Independent of host container technology. &lt;/li&gt;    &lt;li&gt;Loose coupling between components. &lt;/li&gt;    &lt;li&gt;Metadata vendor-independence. &lt;/li&gt;    &lt;li&gt;Security, transaction and reliability modelled as policies. &lt;/li&gt;    &lt;li&gt;Recursive composition. &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;The first draft of SCA was published in November 2005 by the &lt;a href="http://www.osoa.org/"&gt;Open SOA Collaboration (OSOA)&lt;/a&gt;. OSOA is a consortium of vendors and companies interest in supporting or building a SOA. Among them are IBM, Oracle, SAP, Sun, and Tibco. In March 2007 the 1.0 final set of specifications was released. In July 2007 the specifications were adopted by OASIS and they are developed further in the &lt;a href="http://www.oasis-opencsa.org/"&gt;OASIS Open Composite Services Architecture (Open CSA)&lt;/a&gt; member section. &lt;/p&gt;  &lt;blockquote&gt;   &lt;h6&gt;Concluding - Current SCA Specifications at OpenCSA&lt;/h6&gt; &lt;/blockquote&gt;  &lt;p&gt;The current set of SCA specifications hosted on the OSOA site includes,    &lt;br /&gt;&lt;a href="http://osoa.org/download/attachments/35/SCA_AssemblyModel_V100.pdf?version=1"&gt;SCA Assembly Model&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://osoa.org/download/attachments/35/SCA_Policy_Framework_V100.pdf?version=1"&gt;SCA Policy Framework&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://osoa.org/download/attachments/35/SCA_JavaComponentImplementation_V100.pdf?version=1"&gt;SCA Java Client &amp;amp; Implementation&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://osoa.org/download/attachments/35/SCA_ClientAndImplementationModelforBPEL_V100.pdf?version=1l"&gt;SCA BPEL Client &amp;amp; Implementation&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://osoa.org/download/attachments/35/SCA_SpringComponentImplementationSpecification-V100.pdf?version=1"&gt;SCA Spring Client &amp;amp; Implementation&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://osoa.org/download/attachments/35/SCA_ClientAndImplementationModel_Cpp-V100.pdf?version=2"&gt;SCA C++ Client &amp;amp; Implementation&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://osoa.org/download/attachments/35/SCA_WebServiceBinding_V100.pdf?version=2"&gt;SCA Web Services Binding&lt;/a&gt;     &lt;br /&gt;&lt;a href="http://osoa.org/download/attachments/35/SCA_JMSBinding_V100.pdf?version=2%22"&gt;SCA JMS Binding&lt;/a&gt; &lt;/p&gt;  &lt;p align="justify"&gt;The important element within the SCA approach, is that for the first time we have a set of specifications that address how S.O.A. can be built rather than what S.O.A. is about. Lets have a bird's eye view of SCA as a technology.&lt;/p&gt;  &lt;h5&gt;The four main elements of the SCA, aka the related&lt;a name="scaspecs"&gt; specifications&lt;/a&gt; to start with&lt;/h5&gt;  &lt;p align="justify"&gt;The set of specifications can be split into four main elements: the assembly model specification, component implementation specifications, binding specifications, and the policy framework specification. Therefore, these might be a good starting/guiding point upon the need of analysis and/or re-engineer needed for the project or the solution-application at hand.&lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Assembly model&lt;/strong&gt; specification: this model defines how to specify the structure of a composite application. It defines what services are assembled into a SOBA and with which components these services are implemented. Each component can be a composite itself and be implemented by combining the services of one of more other components (i.e. recursive composition). So, in short, the assembly model specifies the components, the interfaces (services) for each component, and the references between components, in a unified, language independent-way.&amp;#160; The assembly model is defined with XML files. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.osoa.org/download/attachments/35/SCA_AssemblyModel_V100.pdf?version=1"&gt;SCA Assembly Model V1.00&lt;/a&gt; (PDF) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.osoa.org/xmlns/sca/1.0/sca-core.xsd"&gt;SCA Core XML Schema V1.0&lt;/a&gt; (XSD file) &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;Using the SCA assembly model, we have to define firstly the recursive assembly of components into services. Recursive assembly allows fine-grained components to be wired into what in SCA terms is called composites. These composites than can be used as components in higher-level composites and applications. The type of a component generally defines the services exposed by the component, properties that can be configured on the components and dependencies the component has on services exposed by other components. &lt;/p&gt;  &lt;p&gt;An example of an SCA assembly model, is shown in the diagram bellow:&lt;/p&gt;  &lt;p&gt;&lt;img title="sca-assemblymodeldiagram-image-1.jpeg" alt="sca-assemblymodeldiagram-image-1.jpeg" src="http://weblogs.java.net/blog/meeraj/archive/images/sca-blog-image-1.jpeg" width="667" height="491" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;Diagram 1: SCA assembly model&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;In the diagram above Composite X is composed of two components Component Y and Component Z, which themselves are composites. Composite X exposes its service using web services. &lt;/p&gt;  &lt;p align="justify"&gt;Composite Y is composed of a Java component, a Groovy component and a Jython component. The service offered by Java component is promoted outside the composite. The Java component depends on services offered by the Groovy and Jython components. In SCA terminology these dependencies are called references. All the references for the Java component are satisfied by services offered by other components within the same composite. However, the reference on the Groovy component has been promoted outside the composite and will have to be satisfied in a context within which Composite Y is used as a component. In the diagram above this is achieved using the service promoted by Composite Z. &lt;/p&gt;  &lt;p align="justify"&gt;Composite Z is composed of a Java component, a BPEL component and a Spring component, the service offered by the BPEL component is promoted to be used when the composite is used as a component in a higher level composite. &lt;/p&gt;  &lt;p align="justify"&gt;As you can see SCA allows building of compositional service-oriented applications using components built on heterogeneous technologies and platforms. SCA assembly model is generally expressed in an XML based language called Service Component Description Language (SCDL). &lt;/p&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Component implementation&lt;/strong&gt; specifications&lt;strong&gt;:&lt;/strong&gt; these specifications define how a component is actually written in a particular programming language. Components are the main building blocks for an application build using SCA. A component is a running instance of an implementation that has been appropriately configured. The implementation provides the actual function of the component and can be defined with a Java class, BPEL process, Spring bean, and C++ or C code. Several containers implementing the SCA standard (meaning that they can run SCA components) support additional implementation types like .Net, OSGI bundles, etc. In theory a component can be implemented with any technology, as long as it relies on a common set of abstractions, e.g. services, references, properties, and bindings. &lt;/p&gt;  &lt;p&gt;The following component implementation technologies are currently described: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.osoa.org/download/attachments/35/SCA_JavaComponentImplementation_V100.pdf?version=1"&gt;SCA Java Component Implementation V1.00&lt;/a&gt; (PDF), &lt;a href="http://www.osoa.org/xmlns/sca/1.0/sca-implementation-java.xsd"&gt;XSD file&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.osoa.org/download/attachments/35/SCA_SpringComponentImplementationSpecification-V100.pdf?version=1"&gt;SCA Spring Component Implementation V1.00&lt;/a&gt; (PDF) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.osoa.org/download/attachments/35/SCA_ClientAndImplementationModelforBPEL_V100.pdf?version=1"&gt;SCA BPEL Client and Implementation V1.00&lt;/a&gt; (PDF) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.osoa.org/download/attachments/35/SCA_ClientAndImplementationModel_Cpp-V100.pdf?version=2"&gt;SCA C++ Client and Implementation V1.00&lt;/a&gt; (PDF), &lt;a href="http://www.osoa.org/xmlns/sca/1.0/sca-implementation-cpp.xsd"&gt;XSD file&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.osoa.org/download/attachments/35/SCA_ClientAndImplementationModelforCOBOL_V1.00.pdf?version=2"&gt;SCA COBOL Client and Implementation V1.00&lt;/a&gt; (PDF) &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.osoa.org/download/attachments/35/SCA_ClientAndImplementationModelforC_V100.pdf?version=1"&gt;SCA C Client and Implementation V1.00&lt;/a&gt; (PDF) &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Binding&lt;/strong&gt; specifications:&lt;strong&gt; &lt;/strong&gt;these specifications define how the services published by a component can be accessed. Binding types can be configured for both external systems and internal wires between components. The current binding types described by OSOA are bindings using SOAP (web services binding), JMS, EJB, and JCA. Several containers implementing the SCA standard support additional binding types like RMI, Atom, JSON, etc. An SCA runtime should at least implement the SCA service and web service binding types. The SCA service binding type should only be used for communication between composites and components within an SCA domain. The way in which this binding type is implemented is not defined by the SCA specification and it can be implemented in different ways by different SCA runtimes. It is not intended to be interoperable. For interoperability the standardized binding types like web services have to be used. &lt;/p&gt;  &lt;p&gt;Officially described binding types: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.osoa.org/download/attachments/35/SCA_WebServiceBinding_V100.pdf?version=2"&gt;SCA Web Services Binding V1.00&lt;/a&gt; (PDF), &lt;a href="http://www.osoa.org/xmlns/sca/1.0/sca-binding-webservice.xsd"&gt;XSD file&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.osoa.org/download/attachments/35/SCA_JMSBinding_V100.pdf?version=2"&gt;SCA JMS Binding V1.00&lt;/a&gt; (PDF), &lt;a href="http://www.osoa.org/xmlns/sca/1.0/sca-binding-jms.xsd"&gt;XSD file&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.osoa.org/download/attachments/35/SCA_EJBSessionBeanBinding_V100.pdf?version=1"&gt;SCA EJB Session Bean Binding V1.00&lt;/a&gt; (PDF), &lt;a href="http://www.osoa.org/xmlns/sca/1.0/sca-binding-ejb.xsd"&gt;XSD file&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.osoa.org/download/attachments/35/SCA_JCABindings_V1_00.pdf?version=2"&gt;SCA JCA Binding V1.00&lt;/a&gt; (PDF) &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;&lt;strong&gt;Policy framework &lt;/strong&gt;specification: for describing how to add non-functional requirements to services. Two kinds of policies exist: interaction and implementation policies. Interaction policies affect the contract between a service requestor and a service provider. Examples of such policies are message protection, authentication, and reliable messaging. Implementation policies affect the contract between a component and its container. Examples of such policies are authorization and transaction strategies. &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.osoa.org/download/attachments/35/SCA_Policy_Framework_V100.pdf?version=1"&gt;SCA Policy Framework V1.00&lt;/a&gt; (PDF), &lt;a href="http://www.osoa.org/xmlns/sca/1.0/sca-policy.xsd"&gt;XSD file&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.osoa.org/download/attachments/35/SCA_TransactionPolicy_V1.0.pdf?version=1"&gt;SCA Transaction Policy V1.00&lt;/a&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;h4&gt;&lt;a href="http://wikiatic.com/wikisearch/search?q=Current%20SCA%20Specifications%20at%20OpenCSAThe%20current%20set%20of%20SCA%20specifications%20hosted%20on%20the%20OSOA%20site%20includes,SCA%20Assembly%20ModelSCA%20Policy%20FrameworkSCA%20Java%20Client%20&amp;amp;%20ImplementationSCA%20BPEL%20Client%20&amp;amp;%20ImplementationSCA%20Spring%20Client%20&amp;amp;%20ImplementationSCA%20C++%20Client%20&amp;amp;%20ImplementationSCA%20Web%20Services%20BindingSCA%20JMS%20Binding"&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h4&gt;Summary&lt;/h4&gt;  &lt;p&gt;SCA provides a set of specifications, addressing both runtime vendors and enterprise developers/architects, for building service-oriented enterprise applications. For the first time we have a set of specifications that address how SOA can be built rather than what SOA is about. I have provided a bird's eye view of SCA as a technology.&lt;/p&gt;  &lt;h5&gt;The related c&lt;a name="scaconcepts"&gt;oncepts in detail&lt;/a&gt; &lt;/h5&gt;  &lt;p align="justify"&gt;As stated before the main building block of a Service-Oriented Business Application is the component. Figure 1 exhibits the elements of a component. A component consists of a configured piece of implementation providing some business function. An implementation can be specified in any technology, including other SCA composites. The business function of a component is published as a service. The implementation can have dependencies on the services of other components, we call these dependencies references. Implementations can have properties which are set by the component (i.e. they are set in the XML configuration of a component). &lt;/p&gt;  &lt;h5&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="SCA Component diagram" alt="SCA Component diagram" src="http://www.theenterprisearchitect.eu/images/component.gif" /&gt;&lt;/h5&gt;  &lt;p&gt;&lt;em&gt;Figure 1 - SCA Component diagram (taken from the &lt;a href="http://www.osoa.org/download/attachments/35/SCA_AssemblyModel_V100.pdf?version=1"&gt;SCA Assembly Model specification&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Components can be combined into assemblies, thereby forming a business solution. So from this point we get the meaning of ‘B’ for in what Business may refer to. The SCA calls these assemblies composites. As shown in figure 2 a composite consists of multiple components connected by wires. Wires connect a reference and a service and specify a binding type for this connection. Services of components can be promoted, i.e. they can be defined as a service of the composite. The same holds for references. So, in principle a composite is a component implemented with other components and wires. As stated before, components can in their turn be implemented with composites thereby providing a way for a hierarchical construction of a business solution, where high-level services (often indicated as composite services) are implemented internally by sets of lower-level services.&amp;#160; &lt;/p&gt;  &lt;h5&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="SCA Composite diagram" alt="SCA Composite diagram" src="http://www.theenterprisearchitect.eu/images/composite.gif" /&gt;&lt;/h5&gt;  &lt;p&gt;&lt;em&gt;Figure 2 - SCA Composite diagram (taken from the &lt;a href="http://www.osoa.org/download/attachments/35/SCA_AssemblyModel_V100.pdf?version=1"&gt;SCA Assembly Model specification&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;The service (or interface if you like) of a component can be specified with a Java interface or a WSDL PortType. Such a service description specifies what operations can called on the composite, including their parameters and return types. For each service the method of access can be defined. As seen before, the SCA calls this a binding type.&amp;#160; &lt;/p&gt;  &lt;h5&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="Example XML structure defining a composite" alt="Example XML structure defining a composite" src="http://www.theenterprisearchitect.eu/images/composite_xml.gif" /&gt;&lt;/h5&gt;  &lt;p&gt;&lt;em&gt;Figure 3 - Example XML structure defining a composite&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;Figure 3 exhibits an example XML structure defining an SCA composite. It's not completely filled in, but it gives a rough idea what the configuration looks like. The implementation tag of a component can be configured based on the chosen implementation technology, e.g. Java, BPEL, etc. In case of Java the implementation tag defines the Java class implementing the component. &lt;/p&gt;  &lt;h5&gt;&lt;a name="scadeployment"&gt;Deployment and the Service Component Architecture contributions, clouds, and nodes&lt;/a&gt; &lt;/h5&gt;  &lt;p align="justify"&gt;SCA composites are deployed within an SCA domain. An SCA Domain (as shown in Figure 4) represents a set of services providing an area of business functionality that is controlled by a single organization. A single SCA domain defines the boundary of visibility for all SCA mechanisms. For example, SCA service bindings (recall the earlier explained SCA binding types) do only work within a single SCA domain. Connections to services outside the domain must use the standardized binding types like web service technology. The SCA policy definitions do also only work within the context of a single domain. In general, external clients of a service that is developed and deployed using SCA should not be able to tell that SCA was used to implement the service, it is an implementation detail. &lt;/p&gt;  &lt;h5&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="SCA Domain diagram" alt="SCA Domain diagram" src="http://www.theenterprisearchitect.eu/images/domain.gif" /&gt;&lt;/h5&gt;  &lt;p&gt;&lt;em&gt;Figure 4 - SCA Domain diagram (taken from the &lt;a href="http://www.osoa.org/download/attachments/35/SCA_AssemblyModel_V100.pdf?version=1"&gt;SCA Assembly Model specification&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;  &lt;p align="justify"&gt;An SCA domain is usually configured using XML files. However, an SCA runtime may also allow the dynamic modification of the configuration at runtime. &lt;/p&gt;  &lt;p align="justify"&gt;An SCA domain may require a large number of different artifacts in order to work. In general, these artifacts consists of the XML configuration of the composites, components, wires, services, and references. We of course also need the implementations of the components specified in all kinds of technologies (e.g. Java, C++, BPEL, etc.). To bundle these artifacts the SCA defines an interoperable packaging format for contributions (ZIP). SCA runtimes may also support other packaging formats like JAR, EAR, WAR, OSGi bundles, etc. Each contribution at least complies to the following characteristics: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;It must be possible to present the artifacts of the packaging to SCA as a hierarchy of resources based off of a single root. &lt;/li&gt;    &lt;li&gt;A directory resource should exist at the root of the hierarchy named META-INF. &lt;/li&gt;    &lt;li&gt;A document should exist directly under the META-INF directory named ‘sca-contribution.xml' which lists the SCA Composites within the contribution that are runnable. &lt;/li&gt; &lt;/ul&gt;  &lt;p align="justify"&gt;A goal of the SCA approach to deployment is that the contents of a contribution should not need to be modified in order to install and use the contents of the contribution in a domain. &lt;/p&gt;  &lt;p align="justify"&gt;An SCA domain can be distributed over a series of interconnected runtime nodes, i.e. it is possible to define a distributed SCA domain. This enables the creation of a cloud consisting of different nodes each running a contribution within the same SCA domain. Nodes can run on separate physical systems. Composites running on nodes can dynamically connect to other composites based on the composite name instead of its location (no matter in which node the other composite lives), because they all run in the same domain. This also allows for dynamic scaling, load balancing, etc. Figure 5 shows an example distributed SCA domain, running on three different nodes. In reality you don't need different nodes (and even different components) for this example, but it makes the idea clear. &lt;/p&gt;  &lt;h5&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" title="A distributed SCA domain running on multiple nodes" alt="A distributed SCA domain running on multiple nodes" src="http://www.theenterprisearchitect.eu/images/domain_distributed.png" /&gt;&lt;/h5&gt;  &lt;p&gt;&lt;em&gt;Figure 5 - A distributed SCA domain running on multiple nodes (taken from the &lt;a href="http://tuscany.apache.org/distributed-sca-domain.html"&gt;Tuscany documentation&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;  &lt;h5&gt;&lt;/h5&gt;  &lt;h5&gt;&lt;a name="scaimplementations"&gt;Implementations of the Service Component Architecture&lt;/a&gt; &lt;/h5&gt;  &lt;p align="justify"&gt;The SCA is broadly supported with both commercial and open source implementations.&amp;#160; &lt;/p&gt;  &lt;blockquote&gt;   &lt;h5&gt;Open source implementations: &lt;/h5&gt; &lt;/blockquote&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://tuscany.apache.org/"&gt;Apache Tuscany&lt;/a&gt; (official reference implementation). The current version is 1.4, released in January 2009. They are also working on a &lt;a href="http://apache-tuscany.blogspot.com/2009/02/apache-tuscany-sca-20-m1-released.html"&gt;2.0 version&lt;/a&gt; which they aim to run in an &lt;a href="http://apache-tuscany.blogspot.com/2009/03/closer-look-osgi-enablement-for-tuscany.html"&gt;OSGi enabled environment&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://newton.codecauldron.org/"&gt;The Newton Project&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.fabric3.org/index.html"&gt;Fabric3&lt;/a&gt;. A platform for developing, assembling and managing distributed applications on SCA standards.Fabric3 leverages SCA to provide a standard, simplified programming model for creating services and assembling them into applications. &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;   &lt;blockquote&gt;     &lt;p&gt;Commercial implementations: &lt;/p&gt;   &lt;/blockquote&gt; &lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://www.tibco.com/software/soa/activematrix_service_grid/default.jsp"&gt;ActiveMatrix Service Grid from TIBCO&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.oracle.com/technology/products/tuxedo/index.html"&gt;Oracle Tuxedo&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;&lt;a href="https://www14.software.ibm.com/iwm/web/cc/earlyprograms/websphere/soawas61/"&gt;IBM WebSphere Application Server Feature Pack for SCA&lt;/a&gt;. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h5&gt;&lt;em&gt;&lt;/em&gt;&lt;/h5&gt;  &lt;h5&gt;&lt;em&gt;Concluding…&lt;/em&gt;&amp;#160;&lt;/h5&gt;  &lt;p align="justify"&gt;Concluding with the analysis of this kind of alternative, concerning the SCA in combination with the overall and therefore holistic &lt;a href="http://dimosthenes.blogspot.com/2009/01/on-reference-architecture-for-soa.html"&gt;Reference Architecture for S.O.A.&lt;/a&gt;, we have expose a step toward for a complete Architectural Design and a Guide to implement the proper scheme concerning the case that should be applicable in the case at hand. Both the concerns covered in the Reference Architecture approach and the SCA approach here, in hand with the strategic decisions that the organisation or the project has in ‘mind’ would be able to provide specific specifications (in the technical, business and conceptual analysis) about the meanings and approaches that the approach is aiming to take. The definition of ‘B’s and ‘A’s is therefore the mission of these approaches and the clearance of the meaning for the entities involved from a context based view.&amp;#160; &lt;/p&gt;  &lt;p align="justify"&gt;So, as far as concerning the S.O.A. ‘infects’ that have to do with the proper definition of Architecture, we may have a logical solution from divide and conquer. Having as a next step after the Reference Architecture’s decisions, the Service Component Architecture (SCA) which provides the means for analysing and decomposing the Service Oriented Business Applications (SOBA) involved, we have a clearer decomposition and definition of the ‘B’ (– business meaning in case at hand) from the ‘A’ (– of the whole architecture and organisation or project).&lt;/p&gt;  &lt;hr /&gt;   &lt;div class="blogger-post-footer" align="justify"&gt;&lt;font size="1"&gt;&lt;font face="Times New Roman"&gt;&lt;strong&gt;&lt;em&gt;notation &amp;amp; listings:&lt;/em&gt;&lt;/strong&gt; The background information for this post, comes from &lt;/font&gt;&lt;/font&gt;&lt;a href="http://www.theenterprisearchitect.eu/archive/2008/05/19/architecture-requirements-for-service-oriented-business-applications"&gt;&lt;font size="1" face="Times New Roman"&gt;SOBA&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Times New Roman"&gt; (nice post), &lt;/font&gt;&lt;a href="http://www.theenterprisearchitect.eu/archive/2009/03/11/what-every-architect-should-now-know-about-the-service-component-architecture-sca"&gt;&lt;font size="1" face="Times New Roman"&gt;What every architect should now about sca&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Times New Roman"&gt; (well form structure and the initiation point for enhancing the thoughts), &lt;/font&gt;&lt;a href="http://wiki.aspire.objectweb.org/xwiki/bin/view/Main/WebHome"&gt;&lt;font size="1" face="Times New Roman"&gt;AspireRFID&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Times New Roman"&gt; (as the reason for expressing the need for alternative SOA case), the &lt;/font&gt;&lt;a href="http://blogs.sun.com/dennisding/entry/service_component_architecture_sca_standard"&gt;&lt;font size="1" face="Times New Roman"&gt;(SCA) Standard&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Times New Roman"&gt; post, the &lt;/font&gt;&lt;a href="http://blogs.sun.com/dennisding/entry/service_component_architecture_sca_standard"&gt;&lt;font size="1" face="Times New Roman"&gt;SCA Raining on the JBI parade&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Times New Roman"&gt; (for JBI relation with SCA as well for the movement behind SCA) side by side with the &lt;/font&gt;&lt;a href="http://blogs.sun.com/soaeverywhere/entry/jbi_sca"&gt;&lt;font size="1" face="Times New Roman"&gt;JBI?SCA&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Times New Roman"&gt; and the what’s &lt;/font&gt;&lt;a href="http://blogs.sun.com/rtenhove/entry/what_s_wrong_with_sca"&gt;&lt;font size="1" face="Times New Roman"&gt;wrong&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Times New Roman"&gt; &amp;amp; &lt;/font&gt;&lt;a href="http://blogs.sun.com/rtenhove/entry/what_s_right_with_sca"&gt;&lt;font size="1" face="Times New Roman"&gt;right&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Times New Roman"&gt; with SCA (specially the second post for the useful features of SCA). Of coarse the &lt;a href="http://tuscany.apache.org/"&gt;Apache Tuscany&lt;/a&gt;, &lt;a href="http://www.tibco.com/software/soa/activematrix_service_grid/default.jsp"&gt;TIBCO&lt;/a&gt;, &lt;a href="https://www14.software.ibm.com/iwm/web/cc/earlyprograms/websphere/soawas61/"&gt;IBM&lt;/a&gt;, &lt;a href="http://www.osoa.org/"&gt;OSOA&lt;/a&gt; and &lt;a href="http://www.oasis-opencsa.org/"&gt;OASIS &lt;/a&gt;links mentioned in the post. &lt;/font&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer" align="justify"&gt;&lt;font size="1" face="Times New Roman"&gt;&lt;/font&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer" align="justify"&gt;&lt;font size="1" face="Times New Roman"&gt;The rationale of the above entry of &lt;em&gt;notation &amp;amp;listings&lt;/em&gt; was added in order to avoid any misleading commenting from various ‘bored’ readers whereas avoiding seen the obvious, may insult me or any of the involved linked parties with fault information or conclusions. The opinions expressed here are of my own, are not necessarily reviewed in advance by anyone but me, and neither the associated companies nor any other party (mentioned here) necessarily agrees with them. &lt;/font&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer" align="justify"&gt;&lt;font size="1" face="Times New Roman"&gt;No content coming outside &lt;/font&gt;&lt;a href="http://dimosthenes.blogspot.com"&gt;&lt;font size="1" face="ti"&gt;evolving through...&lt;/font&gt;&lt;/a&gt;&lt;font size="1" face="Times New Roman"&gt; belongs to confidential or private materials.All is freely available to anyone in the web.&lt;/font&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer" align="justify"&gt;&lt;font size="1" face="Times New Roman"&gt;Opinions or statements of other parties mentioned in the main content of this post (referred through links or clearly stated in the text) express their owns opinions.&lt;/font&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;   &lt;hr /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;hr /&gt;  &lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4038331289687265045-2364414997284176774?l=dimosthenes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/2364414997284176774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4038331289687265045&amp;postID=2364414997284176774' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/2364414997284176774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/2364414997284176774'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/2009/03/applications-architecture-and-soa.html' title='Applications architecture and the S.O.A. alternative'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-7789082971349166910</id><published>2009-02-05T10:47:00.001+02:00</published><updated>2009-02-05T10:47:27.104+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech -ing'/><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>The Class Casting Exception in OSGi Environments</title><content type='html'>&lt;p align="justify"&gt;In previous posts, i have deal with the OSGi approach on building services, either the general &lt;a href="http://dimosthenes.blogspot.com/2009/01/osgi-and-services-issue.html"&gt;approach&lt;/a&gt; or&amp;#160; &lt;a href="http://dimosthenes.blogspot.com/2009/01/alternative-on-building-osgi-service.html"&gt;using iPOJO&lt;/a&gt;. These are ok, if one is willing to implement a startup of services bundles or some project from the start, or to develop a solution with a nature of separation or independency on existing IT assets. Unfortunately, this is rarely the case. Usually, there is either the need to consume some objects from existing applications or to just the other way around,&amp;#160; to consume objects created in the OSGi environment. And real life, demands both. The first issue is normally easy to deal with. Actually, this is the way you should go on. Having in mind the S.O.A. enabling that your project, solution,architecture, code etc, should comply with,&amp;#160; there is an issue in the horizon.&lt;/p&gt;  &lt;h6&gt;&lt;strong&gt;Demystifying the Issue one level down &lt;/strong&gt;&lt;/h6&gt;  &lt;p align="justify"&gt;Consider the common condition: You have a non-OSGi Java Application in which an OSGi-based application is embedded. You want to consume objects created in the OSGi-based application (an OSGi Service for example). &lt;/p&gt;  &lt;p align="justify"&gt;The above condition will provide us a problem issue: When you try to consume (invoking methods, assigning to local variables, etc.) the objects created inside the OSGi Environment from the non-OSGi application you get Class Casting Exception. &lt;/p&gt;  &lt;p align="justify"&gt;The reason for getting this exception, is that any class loaded inside the OSGi Environment is loaded from a special class loader provided by the OSGi Framework which is different from the class loader used by the non-OSGi application. So even if the class of the non-OSGi application is exactly the same as the one of the OSGi-based application, the objects will still be treated as of different types since their classes were loaded using different class loaders. &lt;/p&gt;  &lt;h6&gt;Getting around&lt;/h6&gt;  &lt;p align="justify"&gt;If you want to perform on the object a single method invocation or two without passing parameters of conflicting types (the classes that loaded from different class loaders) just invoke the method using reflection, if you have a more complex case then use utilities that would allow you to bridge the classes.Here comes another key resource place for the OSGi’s: &lt;a href="http://www.dynamicjava.org/"&gt;DynamicJava&lt;/a&gt;. You can overcome the above exception with the help of&amp;#160; &lt;a href="http://www.dynamicjava.org/projects/api-bridge"&gt;API-Bridge&lt;/a&gt; for instance, which provides such capabilities. Actually, this API was created to address this problem specifically. &lt;/p&gt;  &lt;p align="justify"&gt;&lt;em&gt;Bridge objects act as their type is of the target class loader,&lt;/em&gt; so when the non-OSGi application works with the bridged object it will seem to it that it was loaded from the same class loader. Lets see an example that clarifies how &lt;i&gt;API-Bridge&lt;/i&gt; functions. &lt;/p&gt;  &lt;h6&gt;API-Bridge &lt;/h6&gt;  &lt;p&gt;Below is a code snippet that loads the same class using two different class loaders and then bridges them using the &lt;em&gt;API-Bridge&lt;/em&gt; provided by DynamicJava resources. &lt;/p&gt;  &lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;   &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;     &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; testApiBridge() throws Exception {  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;      &lt;span style="color: #008000"&gt;/// Class A which implements interface AInterface is loaded by two   &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;      &lt;span style="color: #008000"&gt;/// different class loaders so they are treated as different examples  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;      Class aClass1 = getClassLoader1().loadClass(&lt;span style="color: #006080"&gt;&amp;quot;org.test.A&amp;quot;&lt;/span&gt;);  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;      Class aClass2 = getClassLoader2().loadClass(&lt;span style="color: #006080"&gt;&amp;quot;org.test.A&amp;quot;&lt;/span&gt;);  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;      Class aInterface1 = getClassLoader1().loadClass(&lt;span style="color: #006080"&gt;&amp;quot;org.test.AInterface&amp;quot;&lt;/span&gt;);  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;      Class aInterface2 = getClassLoader2().loadClass(&lt;span style="color: #006080"&gt;&amp;quot;org.test.AInterface&amp;quot;&lt;/span&gt;);  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;        &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;      &lt;span style="color: #008000"&gt;/// Objects of AImplementation class loaded from Class Loader 1 are not  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;      &lt;span style="color: #008000"&gt;/// assignable from objects loaded from Class Loader 2.  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;      assertFalse(aInterface1.isAssignableFrom(aInterface2));  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;        &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;      Object a2 = aClass2.newInstance();  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;        &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt;      &lt;span style="color: #008000"&gt;/// The object is not castable since it's an instance of a class  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt;      &lt;span style="color: #008000"&gt;/// that was loaded using a different class loader.  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt;      assertFalse(aInterface1.isInstance(a2));  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt;        &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  19:&lt;/span&gt;      &lt;span style="color: #008000"&gt;/// We create an API Bridge that bridges classes (their fields,  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  20:&lt;/span&gt;      &lt;span style="color: #008000"&gt;/// method parameters, etc.) of the &amp;quot;org.test&amp;quot; package to  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  21:&lt;/span&gt;      &lt;span style="color: #008000"&gt;/// the class loader 1.  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  22:&lt;/span&gt;      ApiBridge apiBridge = ApiBridge.getApiBridge(getClassLoader1(), &lt;span style="color: #006080"&gt;&amp;quot;org.test&amp;quot;&lt;/span&gt;);  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  23:&lt;/span&gt;        &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  24:&lt;/span&gt;      Object bridgedA2 = apiBridge.bridge(a2);  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  25:&lt;/span&gt;      &lt;span style="color: #008000"&gt;/// The bridged a2 object is now castable  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  26:&lt;/span&gt;      assertTrue(aInterface1.isInstance(bridgedA2));  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  27:&lt;/span&gt;  }  &lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;Although the example doesn't look very clear at first glance, it's important to note that we wrote only 2 lines of code to bridge the API. What we did up there is that we bridged an object and verified the fact is that it's castable to the &lt;i&gt;AInterface&lt;/i&gt; of a different class loader. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;While API-Bridge supports classes when used as implementations, super classes and method parameters, casting is only supported for interfaces. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h6&gt;Real World &lt;/h6&gt;&lt;br /&gt;&lt;br /&gt;&lt;p align="justify"&gt;An example of this problem is a Java Web Application run in an OSGi-oblivious Servlet Container (Tomcat for example), the Web Application has an OSGi-based application embedded inside of it. The OSGi-based application registers an OSGi Service that implements the &lt;i&gt;javax.servlet.Servlet&lt;/i&gt; interface. The Web Application has a &lt;i&gt;Delegator Servlet&lt;/i&gt; which delegates requests to the registered OSGi Service. The problem with this application is that the Web Application can't consume the Servlet object since it's loaded by a class loader of the OSGi Environment, the fact that causes &lt;i&gt;ClassCastException&lt;/i&gt; to be thrown. To overcome this problem, I used the API-Bridge to bridge the Servlet API. Below is the &lt;i&gt;ServletDelegator&lt;/i&gt; class which delegates requests to the OSGi Service and uses the API-Bridge to bridge the Servlet objects&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-bottom: gray 1px solid; border-left: gray 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; max-height: 200px; font-size: 8pt; overflow: auto; border-top: gray 1px solid; cursor: text; border-right: gray 1px solid; padding-top: 4px"&gt;&lt;br /&gt;  &lt;div style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DelegatorServlet extends HttpServlet {  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;       &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     &lt;span style="color: #cc6633"&gt;@Override&lt;/span&gt;  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; doGet(HttpServletRequest request, HttpServletResponse response)  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;             throws ServletException, IOException {  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;         BundleContext bundleContext = getBundleContext();  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (bundleContext != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) {  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;             ServiceReference servletServiceRef = bundleContext.getServiceReference(  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;                     Servlet.&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;.getName());  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;             &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (servletServiceRef != &lt;span style="color: #0000ff"&gt;null&lt;/span&gt;) {  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;/// We can't write a line like:  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;/// Servlet servletObject =  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;///     (Servlet)bundleContext.getService(servletServiceRef);  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;/// because a class casting exception will be thrown since the  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;/// Servlet class in this code is loaded by Tomcat class loader   &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;/// while the retrieved Servlet by the OSGi Class Loader.  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt;                 Object servletObject = bundleContext.getService(servletServiceRef);  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt;                   &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  19:&lt;/span&gt;                 ApiBridge apiBridge = ApiBridge.getApiBridge(  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  20:&lt;/span&gt;                         Thread.currentThread().getContextClassLoader(),  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  21:&lt;/span&gt;                        &lt;span style="color: #006080"&gt;&amp;quot;javax.servlet&amp;quot;&lt;/span&gt;, &lt;span style="color: #006080"&gt;&amp;quot;javax.servlet.http&amp;quot;&lt;/span&gt;);  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  22:&lt;/span&gt;                 Servlet servlet = (Servlet)apiBridge.bridge(servletObject);  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  23:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;/// Note that method parameters will be bridged too by API Bridge,  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  24:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;/// so they could be passed to the OSGi Environment.  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  25:&lt;/span&gt;                 servlet.service(request, response);  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  26:&lt;/span&gt;             } &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; {  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  27:&lt;/span&gt;                 printHtml(&lt;span style="color: #006080"&gt;&amp;quot;Error: A Servlet OSGi Service was not found.&amp;quot;&lt;/span&gt;,  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  28:&lt;/span&gt;                         response);  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  29:&lt;/span&gt;             }  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  30:&lt;/span&gt;         } &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; {  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  31:&lt;/span&gt;             printHtml(&lt;span style="color: #006080"&gt;&amp;quot;Error: Bundle Context was not found in the ServletContext.&amp;quot;&lt;/span&gt;,  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  32:&lt;/span&gt;                     response);  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  33:&lt;/span&gt;         }  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  34:&lt;/span&gt;     }  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  35:&lt;/span&gt;       &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  36:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; BundleContext getBundleContext() {  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  37:&lt;/span&gt;         &lt;span style="color: #008000"&gt;/// Here we retrieve the Bundle Context of the OSGi-based application  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  38:&lt;/span&gt;     }  &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  39:&lt;/span&gt;       &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  40:&lt;/span&gt;     &lt;span style="color: #008000"&gt;/// ... Other supportive code  &lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  41:&lt;/span&gt;       &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="border-bottom-style: none; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060"&gt;  42:&lt;/span&gt; }  &lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;hr /&gt;  &lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4038331289687265045-7789082971349166910?l=dimosthenes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/7789082971349166910/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4038331289687265045&amp;postID=7789082971349166910' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/7789082971349166910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/7789082971349166910'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/2009/02/class-casting-exception-in-osgi.html' title='The Class Casting Exception in OSGi Environments'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-3734213288054207690</id><published>2009-01-23T17:20:00.001+02:00</published><updated>2009-01-23T17:20:04.655+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>Alternative on Building OSGi service: build using iPOJO</title><content type='html'>&lt;p align="justify"&gt; Continuing from a previous &lt;a href="http://dimosthenes.blogspot.com/2009/01/osgi-and-services-issue.html"&gt;post&lt;/a&gt; on creating OSGi services, this posting, is making thinks more adaptable. The adaptation key here, is in iPOJO.&amp;#160; &lt;a href="http://felix.apache.org/"&gt;iPOJO&lt;/a&gt; stands for injected POJO. It’s a component model from Apache on top of OSGi. It is very flexible, extensible and easy to adapt as already mentioned. It is a try to remove the overhead of developer’s handling services in OSGi. So, as &lt;a href="http://dimosthenes.blogspot.com/2009/01/osgi-and-services-issue.html"&gt;before&lt;/a&gt;, let’s build a simple service using iPOJO and consume it.&lt;/p&gt;  &lt;p align="justify"&gt;OSGi is about modularizing your application. In this demo, we will have three projects (or three bundles) that will be deployed on Apache Felix. The needed ingredients are:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;     &lt;div&gt;&lt;a href="http://felix.apache.org/"&gt;Apache Felix&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;&lt;a href="http://felix.apache.org/"&gt;iPOJO library&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;&lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt;&lt;/div&gt;   &lt;/li&gt;    &lt;li&gt;     &lt;div&gt;&lt;a href=" http://www.aqute.biz/Code/Bnd"&gt;Bnd tool&lt;/a&gt; from aQute        &lt;br /&gt;        &lt;br /&gt;&lt;/div&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;Problem Statement&lt;/h2&gt;  &lt;p&gt;The problem is very simple: Our service is a simple OSGi service that will display the string “Hi There!”.&lt;/p&gt;  &lt;h2&gt;Getting Started&lt;/h2&gt;  &lt;p&gt;Like any OSGi service, our service is represented as an interface:&lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;package hi.service;&lt;br /&gt;public interface HiService {&lt;br /&gt;       public String sayHi();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p align="justify"&gt;This will be our first project or first bundle. The bundle will have just the interface. Please note that you will have to export hi.service package when building the bundle. To make this task easy, use the bnd tool to create the jar. I have used Ant script to compile and package the projects. Once bundle is ready, you will use it as a dependency library for compiling other projects.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;h2&gt;Service Implementation&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&lt;br /&gt;    &lt;br /&gt;The next step is to implement our service. We will create a new project with previous projects jar file as a dependency. The service implementation is also POJO and there is no mention of OSGi service in the code. Let’s have a look at our implementation: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;package hi.component;&lt;br /&gt;import hi.service.HiService;&lt;br /&gt;public class HiComponent implements HiService {&lt;br /&gt;       String message = &amp;quot;Hi There!&amp;quot;;      &lt;br /&gt;       public String sayHi() {&lt;br /&gt;         return message;&lt;br /&gt;       }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p align="justify"&gt;Now we define that we have a iPOJO component. This is done through a xml that is placed along with the project. The xml defines that, we have a component of the class hi.component.HiComponent. The example below is a very simple one, you can have call backs, properties set etc in this xml using different xml elements. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&amp;lt;ipojo&amp;gt;&lt;br /&gt;&amp;lt;component classname=&amp;quot;hi.component.HiComponent&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;provides/&amp;gt;&lt;br /&gt;&amp;lt;/component&amp;gt;&lt;br /&gt;&amp;lt;instance component=&amp;quot;hi.component.HiComponent&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/ipojo&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;We will compile this project into another bundle that will be deployed in the runtime.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;h2&gt;Using the Service&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p align="justify"&gt;This is the final project. This project will be consuming the service we created above. The client can be a POJO or a Activator class. Like the service implementation code, we do not code for a service. Instead we go about and code as if the implementation is available to us. iPOJO framework would take care of the rest. Here is our &amp;quot;Hi there!&amp;quot; client: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;package hi.client;&lt;br /&gt;import hi.service.HiService;&lt;br /&gt;&lt;br /&gt;public class HiClient {&lt;br /&gt;    &lt;br /&gt;     private HiService m_hi;&lt;br /&gt;&lt;br /&gt;    public HiClient() {&lt;br /&gt;        super();&lt;br /&gt;        System.out.println(&amp;quot;Hi There Client constructor...&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public void start() {&lt;br /&gt;        System.out.println(&amp;quot;Starting client...&amp;quot;);&lt;br /&gt;        System.out.println(&amp;quot;Service: &amp;quot; + m_hi.sayHi()); &lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    public void stop() {&lt;br /&gt;        System.out.println(&amp;quot;Stoping client...&amp;quot;);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;I have some sys outs to see how our client work. Just like the service project, we have a xml that will define what is the required service, callback functions etc. Have a look at the xml: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;&amp;lt;ipojo&amp;gt;&lt;br /&gt;&amp;lt;component classname=&amp;quot;hi.client.HiClient&amp;quot;&amp;gt;&lt;br /&gt; &amp;lt;requires field=&amp;quot;m_hi&amp;quot;/&amp;gt;&lt;br /&gt; &amp;lt;callback transition=&amp;quot;validate&amp;quot; method=&amp;quot;start&amp;quot;/&amp;gt;&lt;br /&gt; &amp;lt;callback transition=&amp;quot;invalidate&amp;quot; method=&amp;quot;stop&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/component&amp;gt;&lt;br /&gt;&amp;lt;instance component=&amp;quot;hi.client.HiClient&amp;quot;/&amp;gt;&lt;br /&gt;&amp;lt;/ipojo&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p align="justify"&gt;The xml specifies that HiClient requires m_hi to execute. m_hi is a instance of our service. So as long as the service is not available, the HiClient component does not get executed. The callback xml elements specify which methods to execute when the state of the component changes.&lt;br /&gt;    &lt;br /&gt;Once compiling and packaging of this project is done, we are ready to deploy our example into a runtime and see it working. When you have Felix and iPOJO framework downloaded, you have to configure Felix to load the bundles when it’s started.&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;Felix configurations are placed in config.properties under conf folder.You will have to modify the entires for felix.auto.start.1 variable. Here is how it looked like after I modified: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;felix.auto.start.1= \&lt;br /&gt; file:bundle/org.apache.felix.shell-1.0.1.jar \&lt;br /&gt; file:bundle/org.apache.felix.shell.tui-1.0.1.jar \&lt;br /&gt; file:bundle/org.apache.felix.bundlerepository-1.0.3.jar \&lt;br /&gt; file:bundle/org.apache.felix.ipojo-1.0.0.jar \&lt;br /&gt; file:bundle/hi.service.jar \&lt;br /&gt; file:bundle/hi.component.jar \&lt;br /&gt; file:bundle/hi.client.jar&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;I have put all my jars in felix/bundle folder. You may place them in different location but you must specify the correct paths above.&lt;br /&gt;    &lt;br /&gt;We are ready now. Run your felix runtime to see the results! &lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;hr /&gt;  &lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4038331289687265045-3734213288054207690?l=dimosthenes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/3734213288054207690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4038331289687265045&amp;postID=3734213288054207690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/3734213288054207690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/3734213288054207690'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/2009/01/alternative-on-building-osgi-service.html' title='Alternative on Building OSGi service: build using iPOJO'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-6690674394049895196</id><published>2009-01-23T16:59:00.001+02:00</published><updated>2009-01-23T16:59:16.472+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>The OSGi and the Services issue</title><content type='html'>&lt;p align="justify"&gt; Few months ago, i had introduce the Open Service Gateway initiative in a &lt;a href="http://dimosthenes.blogspot.com/2008/10/osgi-open-service-gateway-initiative.html"&gt;post&lt;/a&gt;, as trying to make a solid ground for the association of posts concerning the ServiceMix related posts, for introducing a simplistic usage of open source tools on S.O.A. related projects. From that time and on, we were introduced to a wide adoption of OSGi methodology and approach by developers and vendors (both legacy and open source). This fact gives the option and possibility to consider OSGi technology as technology that will transform Java development. Specially on the enterprise side.&lt;/p&gt;  &lt;p align="justify"&gt;To establish a point of useful OSGi, i am giving a quick example on how to build a simple service and consume it. This is quite useful in the S.O.A. development, considering it as a step in the development tasks of the reference architecture that one should follow in a S.O.A. enabled solution and approach. Specially when in a small team the object is cheap (cost and time) development considering services.&lt;/p&gt;  &lt;p align="justify"&gt;You may start and work with Equinox and Eclipse IDE. You may also use other OSGi runtime like Apache Felix or &lt;a href="http://www.knopflerfish.org"&gt;Knopflerfish&lt;/a&gt;. Knopflerfish even gives you are good GUI to work with. I will not be explaining fundamentals of OSGi technology.The goal here is to be a little bit more simplistic and independent, in order to be able to work with any other IDE, approach or tools you might prefer. So here we are concerned with a simple application (&lt;a href="http://dimosthenes.blogspot.com/2008/10/osgi-open-service-gateway-initiative.html"&gt;bundle&lt;/a&gt;).&amp;#160; Lets start with.&lt;/p&gt;  &lt;h2&gt;What's OSGi service?&lt;/h2&gt;  &lt;p align="justify"&gt;In very general terms, conforming with S.O.A. re-use, a service is a … repeatable task. When it comes to business, any repeatable task in your business process is a service. Similarly in a application, you can have generic tasks (even specific tasks) that are repeatedly used and therefore, can be represented as service. Representing and using these tasks as services is what SOA is all about! But that' at an enterprise level. When it comes to OSGi services, it is the same concept but applied at JVM level.    &lt;br /&gt;In OSGi, a service is a plain java object which is published to a registry. A consumer can consume the registered service through lookup. A service a be registered and unregistered at any point of time. Service is built using interface-based programming model. To implement or build a service you basically provide implementation to a interface. To consume, you only need the interface for the lookup and there is no need to know about the implementation. The service registry is the &amp;quot;middle man&amp;quot; who help producers and consumers to get in touch with each other.&lt;/p&gt;  &lt;h2&gt;Building STARTUPOSGISRVservice&lt;/h2&gt;  &lt;p align="justify"&gt;The first step would be to create our interface or &amp;quot;front end&amp;quot; of the service. For our service, we will have a simple interface named IStartupOSGISRV: &lt;/p&gt;  &lt;blockquote&gt;   &lt;pre&gt;package org.my.service.startupservice;&lt;br /&gt;&lt;br /&gt;public interface IStartupOSGISRV {&lt;br /&gt; public String sayHi();&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;And here is our service implementation. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;package org.my.service.startupservice;&lt;br /&gt;&lt;br /&gt;public class StartupOSGISRV implements IStartupOSGISRV {&lt;br /&gt; public String sayHi() {&lt;br /&gt;  return &amp;quot;Hi There!&amp;quot;;&lt;br /&gt; } &lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p align="justify"&gt;That's it! Our service is ready for use. But, we need to inform consumers that the service is ready to serve. For this, we will have to register our service with the OSGi service registry.&lt;br /&gt;    &lt;br /&gt;OSGi framework provides us with standard APIs to register and unregister service with the registry. We will use the registerService method to register as shown below: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;serviceRegistration = context.registerService(IStartupOSGISRV.class.getName(),startupservice,null);&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;I am sure for beginners this is not enough. Let's explain the stuff little further.To register our new service, we will build a simple bundle that will call registerService method. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;package org.my.service.startupservice;&lt;br /&gt;&lt;br /&gt;import org.osgi.framework.BundleActivator;&lt;br /&gt;import org.osgi.framework.BundleContext;&lt;br /&gt;import org.osgi.framework.ServiceRegistration;&lt;br /&gt;&lt;br /&gt;public class Activator implements BundleActivator {&lt;br /&gt;&lt;br /&gt; private ServiceRegistration serviceRegistration;&lt;br /&gt; private IStartupOSGISRV startupservice;&lt;br /&gt; &lt;br /&gt; public void start(BundleContext context) throws Exception {&lt;br /&gt;  System.out.println(&amp;quot;Starting StartupServiceBundle..&amp;quot;);&lt;br /&gt;  startupservice= new StartupService(); &lt;br /&gt;  serviceRegistration = context.registerService(IStartupOSGISRV .class.getName(),startupservice,null);&lt;br /&gt;  &lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; public void stop(BundleContext context) throws Exception {&lt;br /&gt;  serviceRegistration.unregister();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p align="justify"&gt;Our Activator class implements BundleActivator. Basically, its a simple OSGi bundle with start and stop methods. We will register our service with the bundle starts up and unregister when the bundle is uninstalled from the framework. &lt;br /&gt;    &lt;br /&gt;Now lets have a closer look at start method. We create a instance of our service and then use registerService method. The first argument is service name which is obtained using InterfaceName.class.getName(). Its a best practice to use this method instead of specifying the name as string (org.my.service.startupservice.IStartupOSGISRV). The second argument is the instance of the service itself. And the final argument is Map wherein developers can pass additional properties to the service.&lt;br /&gt;&lt;br /&gt;    &lt;br /&gt;To unregister the service, you simple call unregister method when we stop the bundle. So now we have a running service on our OSGi runtime.&amp;#160; Now we must consume it.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p align="justify"&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;h2&gt;Consuming a service&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p align="justify"&gt;To consume a service, we first create serviceReference object form the BundleContext. This can be achieved by calling getServiceReference method. The method takes the class name as a argument. Once you have the serviceReference object, we will use getService method to finally get the service. We will have to typecast the object returned by getService method before using it. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;startupserviceRef = context.getServiceReference(IHelloService.class.getName());&lt;br /&gt;IStartupOSGISRV serviceObjectStartupService = (IStartupOSGISRV)context.getService(startupserviceRef);&lt;br /&gt;System.out.println(&amp;quot;Service says: &amp;quot; + serviceObjectStartupService.sayHi());&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p align="justify"&gt;Implementing the service and consumer is the same package is easy. Because, the interface is available. When you have your service and consumer bundle separate, there are some important points to note. OSGi provides the capability of specifying the packages they can be exported or imported. With this facility you can expose your service interface and hide its implementation from the public. The configuration details are specified in the MANIFEST file. Have a look at our StartupService's MANIFEST file: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;  &lt;pre&gt;Manifest-Version: 1.0&lt;br /&gt;Bundle-ManifestVersion: 2&lt;br /&gt;Bundle-Name: StartupService Plug-in&lt;br /&gt;Bundle-SymbolicName: StartupService&lt;br /&gt;Bundle-Version: 1.0.0&lt;br /&gt;Bundle-Activator: org.my.service.startupservice.Activator&lt;br /&gt;Bundle-ActivationPolicy: lazy&lt;br /&gt;Bundle-RequiredExecutionEnvironment: JavaSE-1.6&lt;br /&gt;Import-Package: org.osgi.framework;version=&amp;quot;1.3.0&amp;quot;&lt;br /&gt;Export-Package: org.my.service.startupservice;uses:=&amp;quot;org.osgi.framework&amp;quot;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;  &lt;p&gt;Notice that we have exported org.my.service.startupservice package. Similarly, we import this package in our consuming bundle.&lt;br /&gt;    &lt;br /&gt;And to add some notes; The code used for consuming the service is not the best way. You should make the code very simple and easy to understand without involving Exceptions handling,Null pointer checks and ServiceListeners. &lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;hr /&gt;  &lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4038331289687265045-6690674394049895196?l=dimosthenes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/6690674394049895196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4038331289687265045&amp;postID=6690674394049895196' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/6690674394049895196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/6690674394049895196'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/2009/01/osgi-and-services-issue.html' title='The OSGi and the Services issue'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-681405172677372042</id><published>2009-01-20T15:31:00.002+02:00</published><updated>2009-01-20T15:39:58.909+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech -ing'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>On the Reference Architecture for SOA Adoption</title><content type='html'>&lt;div id="gmbabelFish" style="border-right: black 1px solid; padding-right: 2px; border-top: black 1px solid; display: none; padding-left: 2px; font-size: 12px; z-index: 1410065406; left: -100px; visibility: hidden; padding-bottom: 2px; margin: 0px; border-left: black 1px solid; width: auto; color: rgb(0,0,0); padding-top: 2px; border-bottom: black 1px solid; font-family: arial; position: absolute; top: -100px; height: auto; background-color: rgb(168,236,255); text-align: left; -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px; -moz-border-radius-bottomright: 5px; -moz-border-radius-bottomleft: 5px"&gt;   &lt;div style="padding-bottom: 2px; padding-top: 2px; border-bottom: black 1px dotted"&gt;&lt;span class="BabelFishToolBar" id="bfcloseButton" title="Close BabelFish" style="cursor: pointer"&gt;&lt;/span&gt;&lt;span class="BabelFishToolBar" id="bfconfigButton" title="Language configuration" style="cursor: pointer"&gt;&lt;/span&gt;&lt;span class="BabelFishToolBar" id="bflangsSpan" style="cursor: pointer"&gt;&lt;/span&gt;&lt;span class="BabelFishToolBar" id="bfserviceSpan" style="cursor: pointer"&gt;&lt;/span&gt;&lt;span class="BabelFishToolBar" id="bfclipboardSpan" title="Copy result to clipboard"&gt;&lt;/span&gt;&lt;span class="BabelFishToolBar" id="bferrorSpan" title="No errors" style="visibility: hidden; cursor: pointer"&gt;&lt;/span&gt;&lt;img id="bffishImg" title="click to translate" style="border-right: medium none; border-top: medium none; margin: 0px; border-left: medium none; cursor: pointer; border-bottom: medium none" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAOCAYAAAA8E3wEAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1QUUDyoqJjAqRwAAAN1JREFUOMu1lMkVwyAMBYe0JGpCNUFNVk3k4AUwxPGS+ILxkzX8jyTH/Sfu9nrmJ3cXlnMASyWRPwd2d5XlHCBZn1BthcbRAdxTZQDI8k3mQzg11rhF+QZ9jdNOcQib6GFQYJYgCFucSRf6GsLU6wEY5yubTFqF2yq1vRwr3INXdQUWG+je1pELX4ED1wDyRAR0WfuAA9gloITyvsFMIMgYInYRqF6rO9Sqz9qkO5ilyo0o3YBwJ+6vrdQonxWUQllhXeHcb/wabMPkP2n81ocAIoLZrMqn/4y2RwP8DcQ+d6rT9ATiAAAAAElFTkSuQmCC" align="middle" /&gt;&lt;/div&gt;    &lt;div&gt;&lt;/div&gt; &lt;/div&gt;  &lt;br /&gt;  &lt;div id="gmbabelFish" style="border-right: black 1px solid; padding-right: 2px; border-top: black 1px solid; display: none; padding-left: 2px; font-size: 12px; z-index: 1410065406; left: -100px; visibility: hidden; padding-bottom: 2px; margin: 0px; border-left: black 1px solid; width: auto; color: rgb(0,0,0); padding-top: 2px; border-bottom: black 1px solid; font-family: arial; position: absolute; top: -100px; height: auto; background-color: rgb(168,236,255); text-align: left; -moz-border-radius-topleft: 5px; -moz-border-radius-topright: 5px; -moz-border-radius-bottomright: 5px; -moz-border-radius-bottomleft: 5px"&gt;   &lt;div style="padding-bottom: 2px; padding-top: 2px; border-bottom: black 1px dotted"&gt;&lt;span class="BabelFishToolBar" id="bfcloseButton" title="Close BabelFish" style="cursor: pointer"&gt;&lt;/span&gt;&lt;span class="BabelFishToolBar" id="bfconfigButton" title="Language configuration" style="cursor: pointer"&gt;&lt;/span&gt;&lt;span class="BabelFishToolBar" id="bflangsSpan" style="cursor: pointer"&gt;&lt;/span&gt;&lt;span class="BabelFishToolBar" id="bfserviceSpan" style="cursor: pointer"&gt;&lt;/span&gt;&lt;span class="BabelFishToolBar" id="bfclipboardSpan" title="Copy result to clipboard"&gt;&lt;/span&gt;&lt;span class="BabelFishToolBar" id="bferrorSpan" title="No errors" style="visibility: hidden; cursor: pointer"&gt;&lt;/span&gt;&lt;img id="bffishImg" title="click to translate" style="border-right: medium none; border-top: medium none; margin: 0px; border-left: medium none; cursor: pointer; border-bottom: medium none" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABwAAAAOCAYAAAA8E3wEAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH1QUUDyoqJjAqRwAAAN1JREFUOMu1lMkVwyAMBYe0JGpCNUFNVk3k4AUwxPGS+ILxkzX8jyTH/Sfu9nrmJ3cXlnMASyWRPwd2d5XlHCBZn1BthcbRAdxTZQDI8k3mQzg11rhF+QZ9jdNOcQib6GFQYJYgCFucSRf6GsLU6wEY5yubTFqF2yq1vRwr3INXdQUWG+je1pELX4ED1wDyRAR0WfuAA9gloITyvsFMIMgYInYRqF6rO9Sqz9qkO5ilyo0o3YBwJ+6vrdQonxWUQllhXeHcb/wabMPkP2n81ocAIoLZrMqn/4y2RwP8DcQ+d6rT9ATiAAAAAElFTkSuQmCC" align="middle" /&gt;&lt;/div&gt;    &lt;div&gt;&lt;/div&gt; &lt;/div&gt;  &lt;p&gt;While talking with various people and thinking over the case of S.O.A. (note not SOA) in order to explore in more depth the holistic view needed, i came across &lt;a href="http://it.toolbox.com/people/hariharanvg/"&gt;Hariharan’s&lt;/a&gt; post on &lt;a href="http://it.toolbox.com/blogs/soa-governance/reference-architecture-for-soa-adoption-29252"&gt;Reference Architecture for SOA Adoption&lt;/a&gt;. Hariharan states: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Fundamental objective of SOA is aligning your IT capabilities with business goals. SOA is not just IT architecture nor business strategy. It should be perfect combination of IT infrastructure and business strategy. So, when we are planning for SOA adoption, we need a strong roadmap and blueprint. Reference architecture model will be a blueprint of SOA.      &lt;br /&gt;Reference architecture is like a drawing of your corporate building. Before and after construction, you need blueprint for verification and reference. Similar to that SOA reference architecture could be a reference model for your enterprise business system. Reference architecture should be defined properly during the SOA roadmap definition phase. Refer my last blog in which I was talking about SOA roadmap.       &lt;br /&gt;Fundamentally, while defining reference architecture model for corporate, we should consider the following components as part of architecture.       &lt;br /&gt;1. Infrastructure and components services       &lt;br /&gt;2. Third party communication and data sharing services       &lt;br /&gt;3. Business rules services       &lt;br /&gt;4. Business process services       &lt;br /&gt;5. Data sharing and transformation services       &lt;br /&gt;6. Identity and Security Services       &lt;br /&gt;7. Packaged Application access services       &lt;br /&gt;8. Integration and Event management services       &lt;br /&gt;9. Presentation Services       &lt;br /&gt;10. Registry and Repository       &lt;br /&gt;11. Messaging and Quality       &lt;br /&gt;12. Governance       &lt;br /&gt;Currently, if you look at the SOA market, there are many product and service providers comes up with its’ own SOA reference architecture. Many major SOA players like &lt;a href="http://www.ibm.com/developerworks/library/ar-archtemp/"&gt;IBM&lt;/a&gt;, TIBCO, &lt;a href="http://it.toolbox.com/blogs/soa-governance/www.webmethods.cn/wm1/PDF/whitepapers/SOA_Reference_Architecture.pdf"&gt;Web Methods&lt;/a&gt;, &lt;a href="http://response.bea.com/forms/WWWWW_REFERENCE_ARCHI_SO_WP_RG_09FB?tg=WWWWW.REFERENCE_ARCHIXX.SO.WP.GO.09FB.X.RES"&gt;BEA Oracle&lt;/a&gt; and &lt;a href="http://www.mgl.com/"&gt;MGL &lt;/a&gt;has defined reference architecture based on their product catalog and services. If we refer, all has its own model with explanation which may puzzle the SOA adaptors to choose the right approach. One important point should be remembered that product vendor or service provider’s reference model may not suit for your requirements completely. We should consider that as just one of the reference point to finalize the vendor. We should design the right blueprint model for our corporate and SOA need. This is a crucial step that should be planned as part of the SOA implementation roadmap.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Good starting point. But more or less, again the ‘bird eye’ view needed for S.O.A., is not complete. The reason, is services (and actually web-services) oriented view. As stated &lt;a href="http://dimosthenes.blogspot.com/2009/01/soas-nature-on-integration-issue-web.html"&gt;here&lt;/a&gt; S.O.A. is more than integration. It is integration as well, as is about the following of strategies and the future of the in hand infrastructure. So as concerning the types 1,2,6,8 and 12, the reference architecture should avoid or be irrelevant (as possible) to the ‘&lt;em&gt;marketing effect&lt;/em&gt;’ proposed by vendors, as stated &lt;a href="http://dimosthenes.blogspot.com/2009/01/soa-marketing-and-expenses-on.html"&gt;here&lt;/a&gt;. This last issue is recognized in the above statement in the last paragraph when stating :&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Many major SOA players like &lt;a href="http://www.ibm.com/developerworks/library/ar-archtemp/"&gt;IBM&lt;/a&gt;, TIBCO, &lt;a href="http://it.toolbox.com/blogs/soa-governance/www.webmethods.cn/wm1/PDF/whitepapers/SOA_Reference_Architecture.pdf"&gt;Web Methods&lt;/a&gt;, &lt;a href="http://response.bea.com/forms/WWWWW_REFERENCE_ARCHI_SO_WP_RG_09FB?tg=WWWWW.REFERENCE_ARCHIXX.SO.WP.GO.09FB.X.RES"&gt;BEA Oracle&lt;/a&gt; and &lt;a href="http://www.mgl.com/"&gt;MGL &lt;/a&gt;has defined reference architecture based on their product catalog and services. If we refer, all has its own model with explanation which may puzzle the SOA adaptors to choose the right approach. One important point should be remembered that product vendor or service provider’s reference model may not suit for your requirements completely”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;but not enough explored. In any way, i am not against any vendor, or trying to construct a polemic view against them when referring to ‘&lt;em&gt;marketing effect&lt;/em&gt;’. They are trying to do business and make money, extent their ROIs and so on. Thats ok. My point is that we must have in mind the inner or hidden points on every co-operator when making our business or working. &lt;/p&gt;  &lt;p&gt;So keeping in hand the 12 above points, but we have to be more &lt;em&gt;holistic&lt;/em&gt; and therefore more concrete and safe in our reference. This reference is going to be the ground to explore our enterprise niches and evolve through market changes. A nice starting point in what a reference architecture should look like, is proposed from &lt;a href="http://www.oasis-open.org/"&gt;OASIS&lt;/a&gt;, among others proposals and standards, in &lt;a href="http://wiki.oasis-open.org/soa-rm/ReferenceArchitecture"&gt;SOA Reference Architecture&lt;/a&gt;. Compliant to this reference is the &lt;a href="http://www.dis.wa.gov/enterprise/enterprisearch/ConceptualIntegrationTechRefArch.doc"&gt;&lt;em&gt;Conceptual Integration Technical Reference Architecture&lt;/em&gt;&lt;/a&gt; from the &lt;a href="http://www.dis.wa.gov/"&gt;Washington State Department of Information Services&lt;/a&gt;. In the conceptual Integration Technical R.A. there is this diagram:&lt;/p&gt;  &lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_74QKKAlz9F8/SXXTJsK9VqI/AAAAAAAAAFU/UCtwPz6sHMU/s1600-h/SOARA.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5293369100473292450" style="display: block; margin: 0px auto 10px; width: 510px; cursor: pointer; height: 675px; text-align: center" height="683" alt="" src="http://3.bp.blogspot.com/_74QKKAlz9F8/SXXTJsK9VqI/AAAAAAAAAFU/UCtwPz6sHMU/s200/SOARA.jpg" width="516" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;The conceptual reference architecture depicted in the diagram above (and defined in this document) adopts the Service-Oriented Architecture Reference Model (SOA-RM) developed by the Organization for the Advancement of Structured Information Standards (OASIS).&lt;/p&gt;  &lt;p&gt;The SOA-RM defines its purpose as follows:&lt;/p&gt;  &lt;p&gt;“A reference model is an abstract framework for understanding significant relationships among the entities of some environment. It enables the development of specific architectures using consistent standards or specifications supporting that environment. A reference model consists of a minimal set of unifying concepts, axioms and relationships within a particular problem domain, and is independent of specific standards, technologies, implementations, or other concrete details.” ([SOA-RM], p. 4).&lt;/p&gt;  &lt;p&gt;“The goal of this reference model is to define the essence of service oriented architecture, and emerge with a vocabulary and a common understanding of SOA. It provides a normative reference that remains relevant for SOA as an abstract and powerful model, irrespective of the various and inevitable technology evolutions that will impact SOA.” ([SOA-RM], p. 4).&lt;/p&gt;  &lt;p&gt;As you can see, the Reference is quite abstract. While the SOA-RM is a powerful model that provides the first vendor-neutral, open-standard definition of the service-oriented approach to integration, its abstract nature means that it is not capable of providing the architectural guidance needed for the actual design of integration solutions (or integrated software systems). &lt;i&gt;That guidance comes from the definition of a reference architecture that rests on the foundation of the reference model’s concepts&lt;/i&gt;. The reference architecture builds on those concepts by specifying additional relationships, further defining and specifying some of the concepts, and adding key (high-level) software components necessary for integration solutions.&lt;/p&gt;  &lt;p&gt;In the diagram above, SOA-RM concepts are shaded yellow. Concepts and components particular to the conceptual reference architecture defined by this document are shaded cyan. Relationships between concepts (indicated by arrows) are defined in the SOA-RM if the arrows connect concepts shaded yellow. Relationships between cyan-shaded concepts or between cyan-shaded and yellow-shaded concepts are particular to the reference architecture.&lt;/p&gt;  &lt;p&gt;In order to conclude with Hariharan’s 12 points, which they try to describe and define in a next detailed plan the web services characteristics, we need to have some preliminaries which should work as the base for the next step Hariharan’s analysis: &lt;/p&gt;  &lt;p&gt;Firstly, in the context of the organisation in hand (for whom we will define a more solid S.O.A. Reference Architecture), there should be an analysis of the models that exist and the models that we will going to need in the near future (obtained from the strategic decisions in short and long term of the organisation). So analysis of Models of the various entities that play crucial role in the infrastructure. In general these entities lying into 2 main categories:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Data Modelling &lt;/li&gt;    &lt;li&gt;Generic Entity Modelling &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;What are the nature and model of the data need to be interchanged inside the infrastructure? what formats, categories and relations (dependencies) they follow? This analysis some times maybe needed in a system’s view note. From the point of view that the main system A used in the organisation is handling this data inside it (e.g. time/date/currency/locationGIS/Post code etc…).&lt;/p&gt;  &lt;p&gt;What are the main compound entities that they exist and should be interchanged inside the organisation’s infrastructure? How they depend on the predefined data models above? E.g. Customer, Order, Products etc which they will be analysed in the context of main data models and their dependencies and more over, they will incorporate any missing data (used) elements missing from the Data Modelling analysis, depicting relations hierarchies etc. (Usually any missing attributes for the Data Modelling, should be declared and bound on the Entities relations and modelling). &lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;So, now, we can describe our flows (existing) and found the business and IT rules that are needed in order to be able to have some services on the fly or from compounding existing ones. These rules and analysis, will show as if there is a need for the ‘canonical modelling’ that we are using. Depends of coarse on the systems used, to be used and therefore from the strategic decisions taken by the organisation’s next steps (e.g. in Telco's double/triple play which demand an extension to the product models) and of coarse from the vendors compliant modelling schemes of the existing or new systems to be used. Therefore, Hariharan’s list is extending to: &lt;/p&gt;  &lt;p&gt;&lt;span style="color: rgb(0,0,160)"&gt;A1.1. Existing Data Modelling      &lt;br /&gt;A1.2. Existing Entities Modelling       &lt;br /&gt;A1.3. To-Be Data Modelling       &lt;br /&gt;A1.4. To-Be Entities Modelling       &lt;br /&gt;&lt;/span&gt;1. Infrastructure and components services     &lt;br /&gt;2. Third party communication and data sharing services     &lt;br /&gt;3. Business rules services     &lt;br /&gt;4. Business process services     &lt;br /&gt;5. Data sharing and transformation services     &lt;br /&gt;6. Identity and Security Services     &lt;br /&gt;7. Packaged Application access services     &lt;br /&gt;8. Integration and Event management services     &lt;br /&gt;9. Presentation Services     &lt;br /&gt;10. Registry and Repository     &lt;br /&gt;11. Messaging and Quality     &lt;br /&gt;12. Governance &lt;/p&gt;  &lt;p&gt;Now we have the flows parts. Again, having the A1.1-A1.4, we can construct the existing data and entities flows, meaning a more generic Business flows that although they correspond to business analysis, they include the IT –systems steps for complying with the Modelling restrictions by organisation’s infrastructure. These are not only services, although if we generalise the term service, we are in. There might be p2p systems interconnections, hidden to the business flow for demanding, retrieving and consolidating data and so on. \&lt;/p&gt;  &lt;p&gt;So we should obtain also an    &lt;br /&gt;    &lt;br /&gt;A2.1 Existing Flows     &lt;br /&gt;A2.2 New-proposed Flows&lt;/p&gt;  &lt;p&gt;from this point we should be able, having &lt;/p&gt;  &lt;p&gt;a) our system’s capabilities    &lt;br /&gt;b) our modelling rules&lt;/p&gt;  &lt;p&gt;The candidate services, which comply with A2.1 and A2.2 and create the web services (or the RPCs, XMLs, SQLs and so on) for obtaining the repository of available actions. So the list becomes:&lt;/p&gt;  &lt;p&gt;&lt;span style="color: rgb(0,0,160)"&gt;A1.1. Existing Data Modelling      &lt;br /&gt;A1.2. Existing Entities Modelling       &lt;br /&gt;A1.3. To-Be Data Modelling       &lt;br /&gt;A1.4. To-Be Entities Modelling       &lt;br /&gt;&lt;/span&gt;1. Infrastructure and components services     &lt;br /&gt;2. Third party communication and data sharing services     &lt;br /&gt;&lt;span style="color: rgb(0,0,128)"&gt;A2.1 Existing Flows      &lt;br /&gt;A2.2 New-proposed Flows       &lt;br /&gt;&lt;/span&gt;3. Business rules services     &lt;br /&gt;4. Business process services     &lt;br /&gt;5. Data sharing and transformation services     &lt;br /&gt;6. Identity and Security Services     &lt;br /&gt;&lt;span style="color: rgb(0,0,128)"&gt;A6.1. Services Decomposition Strategy&lt;/span&gt;     &lt;br /&gt;7. Packaged Application access services     &lt;br /&gt;8. Integration and Event management services     &lt;br /&gt;9. Presentation Services     &lt;br /&gt;10. Registry and Repository     &lt;br /&gt;11. Messaging and Quality     &lt;br /&gt;12. Governance &lt;span style="color: rgb(0,0,128)"&gt;and Orchestration&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;With these in mind we should be able to develop an Decomposition Strategy (A6.1 in the list) by which we should be able to deconstruct and reconstruct meaningful information from existing services, categorise all the possible services to be used in the organisation, be able to have loosely coupled services and explore with the best possible way under the organisation’s context the services orchestration abilities and of coarse &lt;strong&gt;re-usability&lt;/strong&gt;. In all the above we should have in mind &lt;a href="http://it.toolbox.com/people/madgreek/"&gt;Mike Kavis&lt;/a&gt; post concerning the &lt;a href="http://www.cio.com/article/438413/Top_Reasons_Why_People_are_Making_SOA_Fail"&gt;Top 10 Reasons Why People Make SOA Fail&lt;/a&gt;. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[ &lt;/p&gt; &lt;/blockquote&gt;  &lt;ol&gt;   &lt;ol&gt;     &lt;li&gt;They fail to explain SOA's business value. &lt;/li&gt;      &lt;li&gt;They underestimate the impact of organizational change. &lt;/li&gt;      &lt;li&gt;They fail to secure strong executive sponsorship. &lt;/li&gt;      &lt;li&gt;They attempt to do SOA &amp;quot;on the cheap.&amp;quot; &lt;/li&gt;      &lt;li&gt;They lack the required skills to deliver SOA. &lt;/li&gt;      &lt;li&gt;They have poor project management. &lt;/li&gt;      &lt;li&gt;They think of SOA as a project instead of an architecture. &lt;/li&gt;      &lt;li&gt;They underestimate the complexity of SOA. &lt;/li&gt;      &lt;li&gt;They fail to implement and adhere to SOA governance. &lt;/li&gt;      &lt;li&gt;They let the vendors drive the architecture. &lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;blockquote&gt;   &lt;p&gt;]&lt;/p&gt;    &lt;p&gt;If you have any additions or need help constructing a more concrete and specific Reference model for your instance, give a drop. All comments are welcomed.&lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;hr /&gt;  &lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4038331289687265045-681405172677372042?l=dimosthenes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/681405172677372042/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4038331289687265045&amp;postID=681405172677372042' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/681405172677372042'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/681405172677372042'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/2009/01/on-reference-architecture-for-soa.html' title='On the Reference Architecture for SOA Adoption'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_74QKKAlz9F8/SXXTJsK9VqI/AAAAAAAAAFU/UCtwPz6sHMU/s72-c/SOARA.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-3157217080023352096</id><published>2009-01-07T16:10:00.001+02:00</published><updated>2009-01-07T16:10:13.729+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech -ing'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>S.O.A.s ‘nature’. On the integration issue – Web Services: soapbuilders reloaded and the prisoner’s dilemma</title><content type='html'>&lt;p align="justify"&gt; As stated in &lt;a href="http://dimosthenes.blogspot.com/2008/12/soas-nature-and-integration.html"&gt;S.O.A.s ‘nature’ and integration&lt;/a&gt;, S.O.A. is more than integration. But one of the most practical and real-world aspects and promises of the SOAs &lt;strong&gt;is&lt;/strong&gt; integration. Especially integration from the interoperability point of view.&amp;#160; In this aspect, the issue is behind the Web Services Interoperability abilities, that they could (after appropriate analysis and models consolidation) can provide to the proposed solution.&lt;/p&gt;  &lt;p align="justify"&gt;Interoperability is one of the design principles that distinguish Web Services as service middleware from its forefathers: RPC and distributed object computing and from its uncle: message-oriented middleware.&lt;/p&gt;  &lt;p align="justify"&gt;Over the last couple of years there has been a trend toward vendors offering complete SOA suites, focusing on strong cohesion (real or imagined) at the suite level. In this model, there's less motivation for cross vendor interoperability and open integration. This trend exposes the dangers of going with a SOA suite: vendor lock-in; isolated, non-integrated components; and exposure to the risk of needing ongoing consulting services for bespoke integration. As vendor consolidation slows this year, but continues, infrastructure suites will continue to dominate and selecting products to populate a heterogeneous services infrastructure will remain difficult. Actually, this is the ‘marketing’ case of the SOA adoption, instead of S.O.A., as discussed in &lt;a href="http://dimosthenes.blogspot.com/2009/01/soa-marketing-and-expenses-on.html"&gt;SOA marketing and expenses. On the misleading promise on SOAs and what is dying?&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Under this assumptions, and any activity that tries to provide a solid ground for neutral, or open interoperability should be welcomed.&amp;#160; So I’m glad for this &lt;a href="http://www.wstf.org/docs/news/WSTF_PR.pdf"&gt;announcement&lt;/a&gt; of the &lt;a href="http://www.wstf.org/faq.jsp"&gt;Web Services Test Forum (WSTF)&lt;/a&gt;, a vendor and end-user coalition set up to test Web Services interoperability scenarios. The approach is described in &lt;a href="http://blogs.oracle.com/wsinterop/2008/12/the_web_services_test_forum.html"&gt;this essential post by Oracle’s Gilbert Pilz&lt;/a&gt; and &lt;a href="http://www.ibm.com/developerworks/webservices/library/ws-wstf/"&gt;another by Doug Davis from IBM&lt;/a&gt;. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;December 8, 2008 – The Web Services Test Forum (WSTF) launched today, providing an open community to improve the quality of the Web services standards, with initial membership from Active Endpoints, AIAG, Axway, CISCO, eviware, FORD Motor Co., Fujitsu, Hitachi, IBM, Oracle, Red Hat, Software AG, Teamlog, TIBCO Software Inc, . Using customer-based scenarios, interoperability is validated in a multi-vendor testing environment. Customers and vendors alike, independent of their geographic location, can dynamically test their applications against available implementations to ensure interoperability is preserved. As an open community, WSTF has made it easy to introduce new interoperability scenarios and approve work through simple majority governance.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;So it seems, that the fore mentioned ‘marketing’ SOA issues, were in vendors attention, and some ‘fix-ing’ actions is there to take place. In a long term of coarse, but is something.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;This forum is an evolution in the interoperability story begun by the soapbuilders group. This group of SOAP stack vendors and interested 3&lt;sup&gt;rd&lt;/sup&gt; parties was created in 2001 – kicked off by &lt;a href="http://tech.groups.yahoo.com/group/soapbuilders/message/4"&gt;this seemingly innocent email from Tony Hong&lt;/a&gt;. Credit goes to IBM and Microsoft for nurturing the idea with support. The work of soapbuilders was carried on by Web Services Protocol Workshops that Jorgen Thelin ran at Microsoft.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;And the ‘fix-ing’ action proof: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;We need ask ourselves, why is this group coming together now? Why has the prophecy not come true? Vendors are being beaten up (not enough, IMO) by end-users for their interop failings – so in one way it’s a “look, we are doing something” measure.&lt;/p&gt;    &lt;p&gt;Also, how does this relate to the work of the Web Service Interoperability Organization (WS-I)? Is this an implicit sigh of desperation at the lack of progress at the WS-I? For example, it’s taken a long time to get the crucial &lt;a href="http://www.ws-i.org/deliverables/workinggroup.aspx?wg=reliablesecure"&gt;Reliable Secure Profile&lt;/a&gt; out of that hopper.&lt;/p&gt;    &lt;p&gt;On the WSTF announcement call, Burton Group’s Anne Thomas Manes asked why this effort is not driven through the WS-I. Steve Harris from Oracle explained that while WS-I is a consensus driven effort, WFTF brings a different approach to interoperability. Harris highlighted vendor collaboration and lowering the barriers to entry as differentiators. IBM's Karla Norsworthy added that WSTF is complementary to WS-I, a more lightweight approach, giving the example that the forum could easily bring a few vendors together to test a scenario. Many of the WSTF’s 15 members are also members of WS-I.&lt;/p&gt;    &lt;p&gt;Will WSFT make a real contribution to interoperability?&lt;/p&gt;    &lt;p&gt;I’m impressed and made hopeful by a number of things. Firstly, that membership obliges a vendor to support live endpoints for each scenario. This means that debate and negotiation will not be the deliverables of the forum; live test results, published on the internet will be. We can view testing between the implementations as a fully connected network, i.e., every endpoint is tested with every other, so each additional implementation adds considerably (as c=(n^2 – n) / 2 for you topology geeks) to the level of interoperability assurance.&lt;/p&gt;    &lt;p&gt;Secondly, having end-users like Ford and AIAG in the forum is an important step. Sure, there are a small number of end-users right now, but the usefulness of this forum grows dramatically with the number of end-user enterprises participating. The forum process encourages end-users to submit requirements for the tested scenarios which usefully turns attention onto things other than wire formats. &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Actually, the real question is whether the participants, especially the vendors, recognise this opportunity as a &lt;a href="http://en.wikipedia.org/wiki/Prisoner's_dilemma"&gt;prisoner’s dilemma scenario&lt;/a&gt;? If everybody co-operates, everybody benefits.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;A number of issues may limit the WSTF’s impact.&amp;#160; Clearly, not having Microsoft as a member is a problem. While industry manoeuvres might keep analysts and vendors themselves amused, end-users couldn’t care less; they just want software to work. So having Microsoft involved is a core credibility issue for the WSTF. According to WSTF spokespeople, other members will be hosting Microsoft endpoints. That’s not quite the same thing. Microsoft are committed to WS-I and &lt;a href="http://blogs.msdn.com/mikechampion/archive/2008/11/24/microsoft-and-the-apache-stonehenge-project.aspx"&gt;also&lt;/a&gt; to &lt;a href="http://wiki.apache.org/incubator/StonehengeProposal"&gt;Apache Stonehenge&lt;/a&gt; which has similar aims to WSTF.&lt;/p&gt;    &lt;p&gt;I think other web services approaches need to be included. To launch an initiative purely directed at Web Services in December 2008 looks antiquated, although the IBM and Oracle spokespeople did claim other approaches, like RESTful web services are not excluded in theory.&lt;/p&gt;    &lt;p&gt;As with any community based activity, the only real measure of its success is its interactivity. Let’s give WSTF time and then count the live interoperable implementations and end-user organizations active in the forum.&lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;hr /&gt;  &lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4038331289687265045-3157217080023352096?l=dimosthenes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/3157217080023352096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4038331289687265045&amp;postID=3157217080023352096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/3157217080023352096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/3157217080023352096'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/2009/01/soas-nature-on-integration-issue-web.html' title='S.O.A.s ‘nature’. On the integration issue – Web Services: soapbuilders reloaded and the prisoner’s dilemma'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-538435865020164593</id><published>2009-01-07T15:43:00.001+02:00</published><updated>2009-01-07T15:43:31.142+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>SOA marketing and expenses. On the misleading promise on SOAs and what is dying?</title><content type='html'>&lt;p align="justify"&gt;Continuing thinking over the “&lt;a href="http://dimosthenes.blogspot.com/2008/12/soa-and-real-service-integration-issue.html"&gt;SOA and the real Service Integration issue&lt;/a&gt;”, I fall on a tone of new-years posts concerning the ‘2009s SOA death’. Once again, I believe that the whole thing is about conceiving SOAs. I &lt;a href="http://dimosthenes.blogspot.com/2008/12/soas-nature-and-integration.html"&gt;post&lt;/a&gt; a draft thought concerning the way that SOA need to be conceptualise both from Architects, Developers and Business owners perspectives. In most cases, the ‘philosophy’ of analysing requirements, services and environments for SOA, didn’t had the appropriate ‘holistic’ nature. So, lots of problems raised,&amp;#160; both in financial aspects but also in designing principles. All the above, and more were stated by &lt;a href="http://it.toolbox.com/people/madgreek/"&gt;Mike Kavis&lt;/a&gt; in his post&amp;#160; &lt;a href="http://www.cio.com/article/438413/Top_Reasons_Why_People_are_Making_SOA_Fail"&gt;Top 10 Reasons Why People Make SOA Fail&lt;/a&gt;. &lt;/p&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;[ &lt;/p&gt; &lt;/blockquote&gt;  &lt;ol&gt;   &lt;ol&gt;     &lt;li&gt;&lt;font color="#808080"&gt;They fail to explain SOA's business value.&lt;/font&gt; &lt;/li&gt;      &lt;li&gt;&lt;font color="#808080"&gt;They underestimate the impact of organizational change.&lt;/font&gt; &lt;/li&gt;      &lt;li&gt;&lt;font color="#808080"&gt;They fail to secure strong executive sponsorship. &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#808080"&gt;They attempt to do SOA &amp;quot;on the cheap.&amp;quot; &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#808080"&gt;They lack the required skills to deliver SOA. &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#808080"&gt;They have poor project management. &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#808080"&gt;They think of SOA as a project instead of an architecture. &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#808080"&gt;They underestimate the complexity of SOA. &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#808080"&gt;They fail to implement and adhere to SOA governance. &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#808080"&gt;They let the vendors drive the architecture.&lt;/font&gt; &lt;/li&gt;   &lt;/ol&gt; &lt;/ol&gt;  &lt;blockquote&gt;   &lt;p align="justify"&gt;]&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Dave Linthicum summed it up in &lt;a href="http://weblog.infoworld.com/realworldsoa/archives/2009/01/burton_group_as_1.html"&gt;his post&lt;/a&gt; when he stated: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;&lt;font color="#808080"&gt;First, there are not enough qualified architects to go around, and you'll find that most of the core mistakes were made by people calling themselves &amp;quot;architects,&amp;quot; who lack the key skills for moving an enterprise towards SOA. They did not engage consultants or get the training they needed, and ran around in circles for a few years until somebody pulled their budgets. &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;&lt;font color="#808080"&gt;Second, the big consulting firms drove many SOA projects into the ground by focusing more on tactics and billable hours than results and short- and long-term value. &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;     &lt;br /&gt;&lt;font color="#808080"&gt;Third, the vendors focused too much on selling and not enough on the solution. They put forth the notion that SOA is something they have to sell, not something you do.        &lt;br /&gt;Finally, the hype was just too much for those charged with SOA to resist. Projects selected the technology first, then the approach and architecture. That's completely backwards.&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#808080"&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;]&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;&lt;a href="http://www.burtongroup.com/AboutUs/Bios/PrintBio.aspx?Id=94"&gt;Anne Thomas Manes&lt;/a&gt; blogged the &lt;a href="http://apsblog.burtongroup.com/2009/01/soa-is-dead-long-live-services.html"&gt;SOA is Dead;Long Live Services&lt;/a&gt;, and stated that “SOA is survived by its offspring: mashups, BPM, SaaS, Cloud Computing, and all other architectural approaches that depend on “services”.” The logic that follows her thoughts is more or less :“&lt;font color="#808080"&gt;Successful SOA (i.e., application re-architecture) requires disruption to the status quo. SOA is not simply a matter of deploying new technology and building service interfaces to existing applications; it requires redesign of the application portfolio. And it requires a massive shift in the way IT operates. The small select group of organizations that has seen spectacular gains from SOA did so by treating it as an agent of transformation. In each of these success stories, SOA was just one aspect of the transformation effort. And here’s the secret to success: SOA needs to be part of something bigger&lt;/font&gt;.”&lt;/p&gt;  &lt;p&gt;And I fully agree with this last statement. Actually, don’t forget that SOA = Service Oriented Architecture. &lt;/p&gt;  &lt;p align="justify"&gt;The illusions of the above SOAs concepts, become when considered the SOA as option, tool, software platform or some product under the SOA – name umbrella that will magically solve all problems. More or less, was a marketing oriented illusion from some (actually the biggest) vendors&amp;#160; on the street. And all this illusions, combined with the financial aspects (more and more and expensive new software, service from vendors and external co-operators, consulting etc ) gave a avoiding aroma in the real S.O.A. approach. Ok, if you mean SOA (the above marketing term) and S.O.A. (the Service Oriented Architecture) i agree, that if its not dead it soon will.    &lt;br /&gt;&lt;/p&gt;  &lt;p align="justify"&gt;As stated in this blog in a numerous posts, SOA actually is not expensive. Both the open source community and some vendors, have release tools and frameworks that can do the job, or parts of the job. The only consideration is the correct definition of the job, aka the A on S.O.A.s . Actually, all posts under the &lt;a href="http://dimosthenes.blogspot.com/search/label/SOA"&gt;SOA&lt;/a&gt; and &lt;a href="http://dimosthenes.blogspot.com/search/label/SOA"&gt;ESB&lt;/a&gt; labels are toward this concept. &lt;/p&gt;  &lt;p align="justify"&gt;Anne Tomas Manes, blogged on ‘&lt;a href="http://apsblog.burtongroup.com/2008/11/soa-doesnt-need-to-be-expensive.html"&gt;SOA doesn’t need to be expensive&lt;/a&gt;’ the main in-expensiveness that S.O.A. could have (and not SOA):&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;[&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font color="#808080"&gt;It's a common misconception that SOA is expensive. Many organizations believe that they need to acquire a boat-load of new products and technologies to get started with SOA. First on the list of product acquisitions is an ESB, followed by registries, repositories, and security appliances. In these belt-tightening times, many SOA initiatives will be challenged to raise the funding required to acquire these products. So what's a team to do? Pack up and wait for better times? Or make do with what you have?&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#808080"&gt;In truth (and much to the vendors' dismay), you don't need a bunch of new products to do SOA. SOA is about the way you design your solutions -- not about the technology you use to build them. An ESB is a &amp;quot;nice to have&amp;quot;, but it's not a prerequisite. Pretty much all programming environments (Java, .NET, Ruby, Groovy, PHP, JavaScript, COBOL, CICS, etc) now include native support for building services -- both method- or document-oriented services built with SOAP and WSDL and RESTful services built with HTTP. You can also build document-oriented services using your favorite message-oriented middleware product (although MOM protocols will limit your reach and interoperability options). (I described the differences among the three types of services &lt;/font&gt;&lt;a href="http://apsblog.burtongroup.com/2008/05/woa-roa-soa-whe.html"&gt;&lt;font color="#808080"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt;. And see &lt;/font&gt;&lt;a href="http://apsblog.burtongroup.com/2008/09/the-toa-of-rest.html"&gt;&lt;font color="#808080"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; and &lt;/font&gt;&lt;a href="http://apsblog.burtongroup.com/2008/10/excellent-examp.html"&gt;&lt;font color="#808080"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; for some great references on RESTful services.) &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#808080"&gt;The only new product that an organization should really budget for is a management solution -- one that supports administration, monitoring, security, and mediation of service interactions (e.g., AmberPoint, Progress Actional, SOA Software Service Manager. Many platform vendors also provide management solutions--sometimes reselling AmberPoint [Oracle and Tibco]).&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font color="#808080"&gt;For organizations that need an ESB, consider open source solutions. &lt;/font&gt;&lt;a href="http://it.toolbox.com/people/madgreek/"&gt;&lt;font color="#808080"&gt;Mike Kavis&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; posted a nice summary of open source SOA stacks &lt;/font&gt;&lt;a href="http://it.toolbox.com/blogs/madgreek/why-an-open-source-soa-stack-makes-sense-28490"&gt;&lt;font color="#808080"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt;. &lt;/font&gt;&lt;a href="http://weblog.infoworld.com/realworldsoa/about.html"&gt;&lt;font color="#808080"&gt;David Linthicum&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; has also been extolling the benefits of an open source SOA product strategy &lt;/font&gt;&lt;a href="http://weblog.infoworld.com/realworldsoa/archives/2008/11/open_source_and.html"&gt;&lt;font color="#808080"&gt;here&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt;. Both Mike and Dave point out that the open source solutions tend to be easier to use and more cohesively integrated than the big vendor alternatives. Unfortunately, none of the open source solutions provides a comprehensive management solution yet.&lt;/font&gt; &lt;/p&gt;    &lt;p&gt;]&lt;/p&gt; &lt;/blockquote&gt;  &lt;p align="justify"&gt;the reason that i am using this part of Ms Manes post, is that i feel that describes the best my overall thesis on this subject and hope yours to. &lt;/p&gt;  &lt;p align="justify"&gt;If you need more applied, real world arguments on this, or how can be applied into your case, please drop me a notice. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;hr /&gt;  &lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4038331289687265045-538435865020164593?l=dimosthenes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/538435865020164593/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4038331289687265045&amp;postID=538435865020164593' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/538435865020164593'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/538435865020164593'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/2009/01/soa-marketing-and-expenses-on.html' title='SOA marketing and expenses. On the misleading promise on SOAs and what is dying?'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-6292870649369238215</id><published>2008-12-29T13:55:00.001+02:00</published><updated>2008-12-29T13:55:38.646+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='ESB'/><title type='text'>Message Auditing in SOA</title><content type='html'>&lt;p&gt;Any serious service-oriented system implementation can be comprised of a number of services assembled into compositions. Actually, this is a strategy for overcoming, or partially solve the problem of web services “sea” as &lt;a href="http://dimosthenes.blogspot.com/2008/12/soa-and-real-service-integration-issue.html"&gt;posted&lt;/a&gt; before. When you have a maze of services being called from many different clients, it can easily result in a formidable amount of information being passed around in form of messages. If principles of service-oriented design are followed, these messages would be in a standardized format. leading to a variety of possibilities as to how mechanisms can be positioned to filter and persist the messages and to also extract business intelligence from them in an arbitrary manner. The impact of standards-based messaging on auditing is as deep and as sweeping as its impact on the field of integration in general.     &lt;br /&gt;&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;A Case for Auditing Messages in Service-Oriented Systems&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;Not much attention has been given to auditing messages in service-oriented eco-systems. Most modern infrastructure and service bus platforms provide simple message auditing mechanisms, for example, by writing messages to a log file or in a proprietary database. Typically, these mechanisms are not optimized for performance and are recommended for diagnostic purposes only.    &lt;br /&gt;    &lt;br /&gt;This traditional ignorance towards auditing is most likely due to the fact that auditing is usually not seen as primary business need. Also, the requirements for auditing can be so daunting and unpredictable that it can be very difficult to comprehend and achieve in a consistent manner, especially across heterogeneous environments.     &lt;br /&gt;    &lt;br /&gt;With the advent of service-orientation, service design principles, standardized message structures and commercial infrastructures that directly enable service-oriented computing, it is becoming significantly easier to build a system that is generic enough to plug into a variety of platforms and also specific enough to capture only certain messages on an &amp;quot;as need&amp;quot; basis. As a result, we can now build message auditing systems without having to creep inside of and customize the service logic.     &lt;br /&gt;    &lt;br /&gt;This effectively enables us to: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;respond to arbitrary queries pertaining to compliance requirements &lt;/li&gt;    &lt;li&gt;gather business intelligence from arbitrary perspectives by running queries against persisted messages &lt;/li&gt;    &lt;li&gt;set up observation systems to raise alarms when certain events happen &lt;/li&gt;    &lt;li&gt;extract diagnostic information about systems to better optimize their resources &lt;/li&gt;    &lt;li&gt;create a dashboard to observe the overall state of systems in real-time &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Let's now explore these requirements in more detail and then establish a high-level design and implementation.    &lt;br /&gt;    &lt;br /&gt;&lt;b&gt;Typical Requirements&lt;/b&gt;     &lt;br /&gt;    &lt;br /&gt;Any reasonable service-oriented implementation can have multiple services (and even multiple versions of services) along with multiple XML schemas. The services may be implemented on more than one platform and may be called by diverse clients. The volume and size of messages are not predictable – because well-designed services are typically interoperable, reusable and compassable, we cannot predict how and when new usages of existing services will emerge.     &lt;br /&gt;    &lt;br /&gt;This leads to the following requirements that a message auditing system may need to address: &lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="828" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="21"&gt;id&lt;/td&gt;        &lt;td valign="top" width="324"&gt;         &lt;p align="center"&gt;&lt;strong&gt;Requirement&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="481"&gt;         &lt;p align="center"&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="21"&gt;1&lt;/td&gt;        &lt;td valign="top" width="324"&gt;         &lt;p&gt;&lt;i&gt;Flexibility to Handle Messages that may have Different Structures&lt;/i&gt;             &lt;br /&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="481"&gt;         &lt;p&gt;The auditing system cannot assume any specific structure or schema for the messages. A request or response message at one service may look very different from the request or response at another service. Even different versions of same service may have different message structures&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="21"&gt;2&lt;/td&gt;        &lt;td valign="top" width="324"&gt;&lt;i&gt;Ability to Specify Criteria to Filter Messages so that only Specific Messages are Audited&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="481"&gt;The message auditing system must support message filtering to specify which messages really need to be audited. It is not incomprehensible to visualize that not all messages need to be audited. An ability to filter the messages reduces the load on the auditing system and creates a meaningful message warehouse, which can be easily managed and processed to gather on-going business intelligence. The challenge in this requirement is that since the messages can be of any structure, the criteria for filtering can also vary.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="21"&gt;3&lt;/td&gt;        &lt;td valign="top" width="324"&gt;&lt;i&gt;Ability to Map messages to the Service Instances from which they Emanated&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="481"&gt;The message auditing must be able to support the mapping of an audited message to the instance of the service from which it originated, so that, in case more details have to be found, the log files on the server may be referenced. In the absence of this type of mapping logic, it may be difficult to gain the needed amount of insight into how message were previously processed.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="21"&gt;4&lt;/td&gt;        &lt;td valign="top" width="324"&gt;&lt;i&gt;Ability to Support Multiple Destinations where Message need to be Stored&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="481"&gt;The message auditing system must be able to support multiple destinations for the audited messages. Typical examples of where the message may be sent are: the database, e-mail, files and folders, queues and other services. The database is commonly considered the single most important destination, since it is permanent and can be used to generate business and reporting intelligence. However, it is important to support other destinations for real-time reporting, events, and for help with diagnosing problems&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="21"&gt;5&lt;/td&gt;        &lt;td valign="top" width="324"&gt;&lt;i&gt;Ability to Scale to Accommodate Increasing Load&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="481"&gt;As mentioned previously, because it is impossible to predict how a service eco-system will grow and evolve, it is also not possible to accurately estimate future loads placed upon the message auditing system. Therefore, the system needs to be inherently and seamlessly scalable so that any required infrastructure upgrades can be added without affecting existing services&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="21"&gt;6&lt;/td&gt;        &lt;td valign="top" width="324"&gt;         &lt;p&gt;&lt;i&gt;Must be Not be Intrusive to Service Logic&lt;/i&gt;&lt;/p&gt;       &lt;/td&gt;        &lt;td valign="top" width="481"&gt;An auditing system should not impose significant change upon existing services. Services must be designed so that their autonomy is maximized while their coupling to the infrastructure is minimized. When incorporating a an auditing system (be it accessed directly by service logic or made available via separate utility services), care needs to be taken so that it should not introduce negative service coupling requirements.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="21"&gt;7&lt;/td&gt;        &lt;td valign="top" width="324"&gt;&lt;i&gt;Must be Autonomous&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="481"&gt;Message auditing systems should not be dependent on services. They may depend on the standardized schemas being used to define service contract types (following the service design principle of Standardized Service Contract), but they should not have any direct dependencies on business services, their message structures, or service logic. This enables auditing services (or systems) to exist as independent parts of the enterprise with their own life cycles.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="21"&gt;8&lt;/td&gt;        &lt;td valign="top" width="324"&gt;&lt;i&gt;Must Act as an Optional Feature&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="481"&gt;Not all services need auditing and those that do may not need auditing all the time. Message auditing logic must therefore be designed to be as &amp;quot;pluggable&amp;quot; as possible, so that it can be easily enabled and disabled without affecting services and their supporting infrastructure.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="21"&gt;9&lt;/td&gt;        &lt;td valign="top" width="324"&gt;&lt;i&gt;Must be Flexible and Extensible&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="481"&gt;         &lt;p&gt;The auditing requirements can be so different from one organization to another or even from one service inventory to another in the same company, that the auditing system should not be built to address a predefined set of auditing requirements. Instead, the system must act as a platform which can be customized or extended to accommodate evolving requirements. &lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="21"&gt;10&lt;/td&gt;        &lt;td valign="top" width="324"&gt;&lt;i&gt;Ability to Define Arbitrary Queries for Reporting or Event Generation Purposes&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="481"&gt;Ad-hoc reporting is often ignored in traditional auditing systems. In order to support this requirement, messages must be stored in a manner that makes it is possible to query them to generate both reports and events. Keeping in mind that each service operation has its own message structure, it must be possible to specify the query in an arbitrary manner. This is also due to the fact that the requirements for reports and events cannot be predicted since the auditing on a system may lead to the need for ad-hoc queries.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="21"&gt;11&lt;/td&gt;        &lt;td valign="top" width="324"&gt;&lt;i&gt;Ability to Generate Automated Reports&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="481"&gt;It has become increasingly common for systems to comply to regulation-based auditing requirements. With the advent of Sarbanes-Oxley Act in particular, companies are required to provide high-quality reporting capabilities in order to respond to auditing-based compliance queries.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h2&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;  &lt;h2&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;  &lt;h2&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;  &lt;h2&gt;&lt;b&gt;Solution&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;There are several SOA infrastructure platforms that simply have insufficient auditing capabilities. Building your solutions on such a foundation may force you to later adopt a third-party auditing solution. However, auditing requirements can become so varied that it simply may not be feasible to build or use one system that can address them. Therefore, you need to place reasonable assumptions and constraints on what a given auditing system can and cannot do.    &lt;br /&gt;    &lt;br /&gt;For example: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Service instances must be identifiable by some unique ID that can be stored as metadata along with the messages. &lt;/li&gt;    &lt;li&gt;The auditing system should not be responsible for decrypting messages. &lt;/li&gt;    &lt;li&gt;The auditing system may be allowed to add its own information as headers to the messages. &lt;/li&gt;    &lt;li&gt;It must be possible to identify the version of service, operation and schemas being used from the message. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;   &lt;br /&gt;To limit the scope of a message auditing system, the following points must also be considered: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Auditing logic should not be used for routing purposes. The message processing chain should be part of service-logic. &lt;/li&gt;    &lt;li&gt;Sometimes, the word &amp;quot;auditing&amp;quot; is used to describe a business requirement for applications. For example, in a customer management application, the administrator must be able to see the history of how customer information was modified and by whom. This should not be confused with &amp;quot;message auditing&amp;quot;, which is logic that is considered to be part of an agnostic system (a system that is not bound to a specific business context). &lt;/li&gt;    &lt;li&gt;Auditing systems may alter messages by adding their own header information. This should not be considered as a &amp;quot;breakage&amp;quot; in the message integrity because these headers are generally used for auditing purposes only. &lt;/li&gt;    &lt;li&gt;The message store should not be used for non-repudiation. This is again is due to the fact that headers may be added to the message for auditing. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;   &lt;br /&gt;&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;Architecture and Design&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;There can be many different ways to build an auditing system. Here, we will explore one possible approach based on the context and requirements discussed so far.    &lt;br /&gt;    &lt;br /&gt;Overall the solution can be broken down into the following parts: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;&amp;#160; Service Instance Manager &lt;/li&gt;    &lt;li&gt;&amp;#160; Message Interceptor &lt;/li&gt;    &lt;li&gt;&amp;#160; Filter Manager &lt;/li&gt;    &lt;li&gt;&amp;#160; Filters-Service Instance Mapper &lt;/li&gt;    &lt;li&gt;&amp;#160; Destination Manager &lt;/li&gt;    &lt;li&gt;&amp;#160; Filter-Destination Manager &lt;/li&gt;    &lt;li&gt;&amp;#160; Report Manager &lt;/li&gt;    &lt;li&gt;&amp;#160;&amp;#160; Report Scheduler &lt;/li&gt; &lt;/ol&gt;  &lt;table cellspacing="0" cellpadding="2" width="804" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="10"&gt;1&lt;/td&gt;        &lt;td valign="top" width="169"&gt;&lt;i&gt;Service Instance Manager&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="624"&gt;The message auditing must be done in a way that it should be possible to track from which instance of what service the message was captured. So, it is important to have a mechanism in place that consistently and uniquely defines each service instance. It may also be a good idea to implement a self-registration process so that when an instance of a service is started, it can register itself in a database.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="10"&gt;2&lt;/td&gt;        &lt;td valign="top" width="169"&gt;&lt;i&gt;Message Interceptor&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="617"&gt;         &lt;p&gt;The capturing mechanism must be pluggable so that it is easily enabled or disabled. It has to be non-intrusive to service logic and to enable high levels of scalability, it should be designed to simply capture and send messages to a queue.            &lt;br /&gt;            &lt;br /&gt;This module is also responsible for gathering metadata about the message (e.g. the service instance identifier to map the messages to the service log files). All of this metadata must be either added to the messages via headers or it may be captured as separate fields.             &lt;br /&gt;            &lt;br /&gt;The module must be able to capture request and response messages together and send them as pairs for auditing. This ensures that request and response message information will be bundled for future processing and reporting purposes.             &lt;br /&gt;            &lt;br /&gt;This module should not apply filters to the messages since that may introduce time-consuming logic that could adversely affect the runtime service performance. Typically, a message capturing mechanism can be developed by implementing message handlers or interceptors.&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="10"&gt;3&lt;/td&gt;        &lt;td valign="top" width="169"&gt;&lt;i&gt;Filter Manager&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="612"&gt;         &lt;p&gt;A filter is a simple function that would take request and response messages and associated metadata and determine whether a given set of messages needs to be audited or not. Typically a filter would look into the message content and apply a rule to find out if certain conditions resolve to true or not.            &lt;br /&gt;            &lt;br /&gt;Some common types of filters that can be implemented and readily used are &lt;/p&gt;          &lt;p&gt;• look for a certain string in the message to be present or absent &lt;/p&gt;          &lt;p&gt;• apply a given XPath query to the message that results in a Boolean response &lt;/p&gt;          &lt;p&gt;• apply a given XQuery query to the message that results in a Boolean response &lt;/p&gt;          &lt;p&gt;• apply interfaces to define arbitrary criteria based on the message content &lt;/p&gt;          &lt;p&gt;While defining the filter, it must be indicated whether to apply it on the request or the response. The definitions of these filters may be created and stored in a database or configuration file&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="10"&gt;4&lt;/td&gt;        &lt;td valign="top" width="169"&gt;&lt;i&gt;Filter-Service Instance Mapper&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="608"&gt;A mechanism to map the filters with service instances is needed to determine which filters to apply for a given set of messages and their metadata. This can also be done in a database or a configuration file. Note, however, that a database may be more suitable do to the need to sometimes establish many-to-many relationships.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="10"&gt;5&lt;/td&gt;        &lt;td valign="top" width="169"&gt;&lt;i&gt;Destination Manager&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="605"&gt;The destination for filtered messages represents the location they need to be sent to for storage. Some possible destinations can be the database, a queue, e-mail, files and folders, URLs, other services, or any implementation of a simple interface that can accept the request, response, message metadata and filter and is able to send them to whatever destination they need to go. All destinations may be stored in configuration file or a database.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="10"&gt;6&lt;/td&gt;        &lt;td valign="top" width="169"&gt;&lt;i&gt;Filter-Destinations Mapper&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="602"&gt;It needs to be specified for each filter where the messages must be sent. This can be achieved by specifying a list of destinations for each filter register.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="10"&gt;7&lt;/td&gt;        &lt;td valign="top" width="169"&gt;&lt;i&gt;Report Manager&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="600"&gt;The database is a mandatory destination if it is important to run reports on audited messages. Defining reports at a basic level would require setting up query that needs to be executed to select only relevant messages and further provide some way to render these messages. A simple yet powerful solution for this is storing the messages in XML type columns and specifying queries in terms of XPath or XQuery queries. As mentioned previously, the messages may be based on an arbitrary structure and it may therefore be easy to specify rendering formats with technologies like XSLT&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="10"&gt;8&lt;/td&gt;        &lt;td valign="top" width="169"&gt;&lt;i&gt;Report Scheduler&lt;/i&gt;&lt;/td&gt;        &lt;td valign="top" width="599"&gt;This is a regular scheduling mechanism that can run reports based on the provided schedule and report definition.&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;h2&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;  &lt;h2&gt;&lt;b&gt;&lt;/b&gt;&lt;/h2&gt;  &lt;h2&gt;&lt;b&gt;Putting It All Together&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;Figure 1 identifies some of the interfaces that will enable the creation of the previously listed solution parts. For the sake of brevity, only important interfaces are listed.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.soamag.com/I24/1208-2-fig01.jpg" /&gt;     &lt;br /&gt;&lt;i&gt;Figure 1 &lt;/i&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;Once all these components are in place, we can study how the system will work at runtime and how the original requirements can be met. At service start-up, the service instance must register itself with a central registry as displayed in Figure 2.     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img src="http://www.soamag.com/I24/1208-2-fig02.jpg" /&gt;     &lt;br /&gt;&lt;i&gt;Figure 2: At service startup, the service instance object is created and registered&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;The following steps demonstrate how the auditing system would work at runtime: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;A service client sends a message to a service instance. &lt;/li&gt;    &lt;li&gt;The auditing interceptor captures the service instance identity, request, and its metadata, and stores this information locally. &lt;/li&gt;    &lt;li&gt;The service logic processes the request and constructs the response. &lt;/li&gt;    &lt;li&gt;The auditing interceptor captures the response. &lt;/li&gt;    &lt;li&gt;The auditing interceptor combines the request, response, metadata, and service instance identity, and sends this combined packet to a queue. &lt;/li&gt;    &lt;li&gt;The response is returned to the client. &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;These steps are illustrated in Figure 3.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="536" src="http://www.soamag.com/I24/1208-2-fig03-large.jpg" width="884" /&gt;     &lt;br /&gt;&lt;i&gt;Figure 3: This figure shows how audit interceptor captures the request and response and simply submits to a queue. This makes the auditing system less intrusive and more scalable. Note that filters are not applied at this point to reduce the additional processing.&lt;/i&gt;     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;It evident that the auditing interceptor acts in a non-intrusive and scalable manner. It does not depend on message structures and individual service instances.     &lt;br /&gt;    &lt;br /&gt;Let's now see how the messages can be processed by the queue listeners: &lt;/p&gt;  &lt;p&gt;1. The queue listener picks the message packet that has request, response, service instance identifier, and other message metadata. &lt;/p&gt;  &lt;p&gt;2. The listener finds the mapped filters for given service instance. &lt;/p&gt;  &lt;p&gt;3. The filters are applied to the messages and, as a result, each filter indicates whether the message was a match or not. It is possible that many filters are provided for a given instance of the service and more than one may indicate a match. &lt;/p&gt;  &lt;p&gt;4. If no filter is specified or no filter indicates that the message must be audited, the message is simply discarded. &lt;/p&gt;  &lt;p&gt;5. For every filter that indicates that the given set of messages must be audited, it is determined what the destinations for that filter are. &lt;/p&gt;  &lt;p&gt;6. The message packet is then sent to every destination mapped for the given filter. &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;These steps are further illustrated in Figure 4.     &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img height="477" src="http://www.soamag.com/I24/1208-2-fig04-large.jpg" width="891" /&gt;     &lt;br /&gt;&lt;i&gt;Figure 4: This diagram shows how the messages are actually audited by queue listener. First, for given service instance, the registered filters are looked up, then the filters are applied to messages to check if they need to be audited. If yes, then destinations are looked up for given filter and the message are sent to all destinations associated with each filter.&lt;/i&gt;     &lt;br /&gt;    &lt;br /&gt;The sequence of processing steps shown in Figure 4 represents a flexible processing model that allows for customizable behaviour for each service instance and filter. It is extensible since any new filter may be added to the service instance and any new destination may be provided for each filter.     &lt;br /&gt;    &lt;br /&gt;Once the reports have been defined using &lt;a href="http://en.wikipedia.org/wiki/XPath"&gt;XPath&lt;/a&gt; or &lt;a href="http://en.wikipedia.org/wiki/XQuery"&gt;XQuery&lt;/a&gt;, the queries can be run against the messages. Since the message structure can be arbitrary, it is important to save them in XML type columns.     &lt;br /&gt;    &lt;br /&gt;Let's now consider some sample cases and see how the auditing system can support these requirements:     &lt;br /&gt;    &lt;br /&gt;&lt;i&gt;1. You want to track all activities of a user&lt;/i&gt;     &lt;br /&gt;    &lt;br /&gt;It is a common situation where you may want to track a user's activity (e.g. for the purpose of diagnosing a problem). Assuming that each message would have a user ID embedded in it, you can create an XPath filter and add that to all service instances. If you want to quickly diagnose the problem, you could specify your e-mail address as the destination. Once this filter is enabled, the messages will start coming to your inbox. After you have collected relevant messages, you can disable the filter.     &lt;br /&gt;    &lt;br /&gt;&lt;i&gt;2. You want to find how a lookup service is being used.&lt;/i&gt;     &lt;br /&gt;    &lt;br /&gt;You might have a service that lets users lookup some service providers in a given area. You may want to find out how this is being used to improve user interface. You can capture all messages for this service and query using XQuery or XPath to count how many times zip, state or city were provided, what mile radius is usually selected by users, and so on. Based on this, the user-interface may pre-select some values.     &lt;br /&gt;    &lt;br /&gt;Care must be taken to ensure that interaction with the queue is efficient (for example, it may be executed in a separate thread). If the messages hold sensitive data, the message database must be designed and managed so that the data in not compromised. Since the message auditing will simply store the messages without association with entitlements, it may not be possible to create reports based on some access control. Messages with attachments pose another challenge since the attachments themselves may also need to be stored and queried.     &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;With the advent of XML-based technologies, the evolution of service design principles, service design patterns, and industry standards, message auditing has become viable commodity within the modern SOA eco-system. Adding auditing logic to your systems opens up a flood gate of opportunities for extracting business intelligence from messages.    &lt;br /&gt;    &lt;br /&gt;The beauty of message auditing with XML is that it does not bind you to a specific data structure and therefore allows for the extraction of information in an arbitrary manner. This can be the best defence against the random nature of service-oriented system auditing, which can span from performance data to compliance requirements, from user behaviour to drawing business intelligence, and many more usages.     &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;hr /&gt;  &lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4038331289687265045-6292870649369238215?l=dimosthenes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/6292870649369238215/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4038331289687265045&amp;postID=6292870649369238215' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/6292870649369238215'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/6292870649369238215'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/2008/12/message-auditing-in-soa.html' title='Message Auditing in SOA'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-8087097638571868086</id><published>2008-12-29T12:42:00.001+02:00</published><updated>2008-12-29T12:42:34.771+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='BPEL'/><title type='text'>BPEL Environments and Complexity management</title><content type='html'>&lt;p&gt;Service-oriented architecture (SOA) has become mainstream technology for integrating disparate systems and applications. For building composite applications, Business Process Execution Language (BPEL) has emerged as the standard for business process flow orchestration and application integration within organizations. Many IT organizations are deploying composite applications that use BPEL to automate critical business processes. If your application needs to be available 24/7, you need a reliable BPEL infrastructure. In this article, we first present a typical BPEL engine architecture and then outline its manageable entities, and the typical management functions you need to worry about as an administrator. Finally, we conclude with approaches and best practices for managing your complete BPEL infrastructure.&lt;/p&gt;  &lt;p&gt;To effectively manage BPEL infrastructure, administrators need to manage all the components that make up the BPEL ecosystem. Before diving into management functions you need to concern yourself with as an administrator, let's look briefly at the BPEL ecosystem.&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;The BPEL Ecosystem&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;By BPEL ecosystem, we mean the system components and resources used for executing the BPEL process and those that ensure guaranteed availability of the BPEL process. Although some of those systems may not be directly under your control, you need to take some action to monitor their availability. Unequivocally, if one or more of these components go down, it will put the business process execution at risk. Figure 1 depicts the architecture of a typical BPEL engine.&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://res.sys-con.com/story/nov08/744119/Panda_Fig-1.jpg" /&gt; &lt;/p&gt;  &lt;p&gt;A BPEL process typically depends on one or more partner links. A partner link might be a service owned by the organization, such as an EJB running an application server or a database stored procedure over which you have immediate control. It might also be a Web service provided by a partner or vendor over which you do not have any control.&lt;/p&gt;  &lt;p&gt;The BPEL processes are run in a runtime environment called a BPEL server or engine. The availability and service level associated with BPEL processes are completely dependent on the BPEL engine. BPEL engines can run in an application server environment. You can have a single instance or a clustered application server environment if your composite application requires high availability. A BPEL server may depend on some of the resources, such as data sources or messaging services, made available by the application server environment.&lt;/p&gt;  &lt;p&gt;BPEL processes are long running, and hence they need a persistent store to persist state. Typically the persistence store is a relational database management system. This persistence store is called a dehydration store.&lt;/p&gt;  &lt;p&gt;All of these software components run on several nodes, or hosts, that constitute the critical piece of your BPEL ecosystem.&lt;/p&gt;  &lt;p&gt;To summarize, a BPEL ecosystem comprises the following:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;BPEL processes and partner links &lt;/li&gt;    &lt;li&gt;BPEL engine &lt;/li&gt;    &lt;li&gt;Dehydration store &lt;/li&gt;    &lt;li&gt;Gateway to BPEL engine &lt;/li&gt;    &lt;li&gt;The application server on which the BPEL server is running &lt;/li&gt;    &lt;li&gt;Hosts on which the BPEL server, the dehydration store, and the gateway are running &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;The health of a BPEL process that you manage is a function of any of the entities that constitute the BPEL ecosystem, and you need to concern yourself with managing and monitoring all of these entities.&lt;/p&gt;  &lt;p&gt;Let's dive down into the management functions for each component and which approaches you should follow to manage them, starting with the management aspects of BPEL processes.&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;BPEL Runtime Governance and Suitcase Deployment&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;As an administrator, you are responsible for deploying BPEL processes to a single server or multiple servers. Think about transitioning a BPEL process from test to production or deploying the process to additional BPEL engines to add scalability and availability to your system.&lt;/p&gt;  &lt;p&gt;Typically BPEL processes are packaged in an archive known as a BPEL suitcase, which contains a .bpel file, WSDL for partner links, and classes and schemas required by the BPEL process. If you are using an SCA-compliant composite application, it may contain a BPEL module. As an administrator, you may be deploying the BPEL suitcase to more than one BPEL engine. You may want to deploy BPEL processes during off-peak times, so you want to automate the deployment procedure.&lt;/p&gt;  &lt;p&gt;To automate deployment of BPEL processes, you can build scripts by using tools provided by your BPEL server vendors. If you're using a management tool, it may provide support for uploading the BPEL suitcases to the software library and then enable you to deploy them as needed. Figure 2 outlines the deployment of BPEL suitcases from a software library.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://res.sys-con.com/story/nov08/744119/Panda_Fig-2.jpg" /&gt; &lt;/p&gt;  &lt;p&gt;If your BPEL processes depend on resources such as adapters, it makes sense for you to automate the deployment and configuration of them if you want to avoid any manual errors.&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;Manage Versioning of BPEL Processes&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;In a dynamic environment, BPEL processes may change, depending on business needs. You need to implement a method of storing different versions of BPEL that have previously been deployed to the BPEL engine. This will help you track changes between different versions and back track any changes, should you run into issues. You may need to compare different versions of processes within one BPEL server or across BPEL servers. Management tools may provide the ability to store/retrieve and compare versions of a process and dependent artifacts such as WSDL and XML Schema that helps in the quick resolution of issues. The software library will allow you to roll back to a previous version of the BPEL process, should the need arise.&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;Monitor BPEL Process and Partner Links&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;Monitoring the health of BPEL processes is critical to meeting service-level agreements for your processes. You can probably ensure availability and meet service-level requirements by ensuring performance and functioning of the partner links your BPEL processes depend on and identifying problems in a proactive manner. You can develop some SOAP tests to verify the availability and performance of partner links. Use either a SOAP testing tool provided by a vendor or an open source Web service testing tool such as &lt;a href="http://soapUI.org"&gt;soapUI&lt;/a&gt;. The correct approach is to automate tests to be performed at regular intervals. You want to be alerted when a particular partner link has an unscheduled service shutdown or a longer-than-expected response time. If you're using a management tool to manage your BPEL infrastructure, check whether it provides such a capability.&lt;/p&gt;  &lt;h2&gt;&lt;i&gt;&lt;b&gt;SOAP Test Example&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;  &lt;p&gt;The Elevation Query Web Service returns the elevation in feet or meters for a specific latitude/longitude (WGS 1984) point from the USGS Seamless Elevation datasets hosted at &lt;a href="http://eros.usgs.gov/"&gt;http://eros.usgs.gov&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://gisdata.usgs.gov/XmlWebServices/TNM_Elevation_service.asmx?WSDL"&gt;WSDL&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Operation   &lt;br /&gt;getElevation    &lt;br /&gt;Input Parameter X: 45.890610    &lt;br /&gt;Input Parameter Y: 7.157390    &lt;br /&gt;other parameters: left empty    &lt;br /&gt;Output Parameter: elevation of latitude/longitude provided.&lt;/p&gt;  &lt;p&gt;You can monitor this Web Service by executing a SOAP test at regular intervals through automated tests. These SOAP tests monitor the availability and perceived performance of the Web service. Figure 3 depicts automating testing of Web services.&lt;/p&gt;  &lt;p&gt;&lt;img style="display: block; float: none; margin-left: auto; margin-right: auto" src="http://res.sys-con.com/story/nov08/744119/Panda_Fig-3.jpg" /&gt;&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;Monitoring BPEL Processes from the End-User Perspective&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;Your BPEL process may be accessed from different locations, and you want to monitor the availability and performance from those locations. Say you're part of a global organization and users in North America, Europe, and Asia access your BPEL processes. Although it's challenging to monitor the performance of BPEL processes from the end-user perspective, you can create an agent at the customer locations to test the performance from their end. However, manually performing these types of tasks from a BPEL process that is accessed from multiple customer sites could be challenging. Hence, you can use the help of management tools to monitor the performance of your BPEL applications from the end-user perspective as depicted in Figure 3.&lt;/p&gt;  &lt;h2&gt;&lt;i&gt;&lt;b&gt;Error/Fault Monitoring&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;  &lt;p&gt;A BPEL process may raise errors and faults for several reasons, including data exceptions or non-availability of partner links, although you need to limit the number of faults in BPEL processes by proactively monitoring the processes, as we described earlier. You need to drill down into the processes that have raised faults, and you should be able to diagnose the cause of the faults and make sure that this does not happen again. You may want to monitor the processes that failed and help diagnose issues by using tools provided by your BPEL vendor and take corrective action as appropriate. It will also help if you implement some methodology to monitor SOAP messages sent to and received by the BPEL process and the partner links.&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;Gateway to BPEL Engines&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;BPEL process instances are created when invoked by a client and the traffic is routed through Web servers and load balancers. You want to be alerted when these Web servers or load balancers are not available or not meeting the expected performance goals.&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;Managing the BPEL Engine&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;The BPEL engine is by far the most important part of the BPEL ecosystem. You have to monitor the availability and performance of BPEL engines and need to be alerted when a BPEL engine is not performing as expected. You may have multiple instances of clustered BPEL engines. Hence, you need to know if any one of the engines is not performing or whether the load balancer is working properly. More important, you want to find out proactively when all the engines are not performing because it will lead to total disruption of service.&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;Configuration Management and Versioning&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;You may change the configuration of your BPEL engines from time to time. You may want to track any interim changes and to backtrack changes to a previous version. If you follow ITIL practices, this should sound familiar. You can store the configuration of a BPEL engine in a configuration management database (CMDB) or version control system. It can make your life easier to have your management tool provide integration with the CMDB in which you store your configuration.&lt;/p&gt;  &lt;p&gt;Keeping a gold image of your BPEL ecosystem configuration and using it to compare with your current configuration will help in identifying issues attributable to configuration changes. And keeping track of components added to and/or removed from your BPEL system will also help in analyzing performance issues - for example, performance was bad during the first week of January but improved afterward, because there was one extra BPEL engine in the cluster after the first week of January. By comparing the current configuration with the gold image, you can monitor changes in some parameters that can have a big impact on BPEL instance throughput, such as dispatcher thread min/max parameters.&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;BPEL Engine Monitoring&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;The health of the BPEL engine is critical for your applications. Besides the status of the BPEL engine, there are some statistics you should focus on. They include system statistics such as memory; CPU consumed; and business metrics such as open and closed instances, synchronous and asynchronous process latency, and load factors. In the event of abnormal behavior such as high process latency or load factors, you have to proactively resolve the issues before they affect BPEL processes deployed in the engine.&lt;/p&gt;  &lt;p&gt;As an administrator for your BPEL engine, you have to perform some of the following operations:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Archive information about completed BPEL processes &lt;/li&gt;    &lt;li&gt;Remove from the database all XML messages that have been successfully delivered and resolved &lt;/li&gt;    &lt;li&gt;Purge stale instances &lt;/li&gt;    &lt;li&gt;Re-execute failed processes &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ideally, these mundane tasks should be automated in a production environment. You can build some automated scripts to perform these operations and schedule them to be performed at regular intervals. Many management tools help you with automation by providing a graphical user interface.&lt;/p&gt;  &lt;h2&gt;&lt;i&gt;&lt;b&gt;Dehydration Store&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;  &lt;p&gt;The BPEL engine stores process data in the dehydration store. This is a critical piece of the puzzle. As we discussed earlier, the dehydration store is typically a relational database. If you want high availability for your dehydration store, you will probably use a clustered database. Your database administrators should make sure that the database is available and performing properly.&lt;/p&gt;  &lt;h2&gt;&lt;i&gt;&lt;b&gt;Monitoring Adapters&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;  &lt;p&gt;Your BPEL processes may depend on adapters that access resources such as databases, messaging services, and EIS that may reside locally or remotely. The status and performance of adapters may have a heavy impact on the response time of your BPEL engine and processes.&lt;/p&gt;  &lt;h2&gt;&lt;i&gt;&lt;b&gt;Managing the Application Server&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;  &lt;p&gt;A typical BPEL engine runs in an application server environment. For example, Oracle BPEL Process Manager can be deployed on a J2EE-compliant application server such as Oracle Application Server, Oracle WebLogic, IBM WebSphere, or JBoss Application Server. The BPEL engine may depend on several resources and services provided by the application server, such as JDBC DataSource, JMS providers, JCA connectors, and shared libraries. The health of the application server, along with the performance of these resources, may directly influence the performance of your BPEL engine. Each application server provides several health indicator metrics. You should automate a mechanism that would proactively issue an alert before anything goes wrong with your application server.&lt;/p&gt;  &lt;h2&gt;&lt;i&gt;&lt;b&gt;Managing the Hosts/Nodes&lt;/b&gt;&lt;/i&gt;&lt;/h2&gt;  &lt;p&gt;Your BPEL infrastructure may be running on several nodes or machines. These server nodes may run into several resource issues during runtime. For example, they may run out of disk space due to excessive logging or run out of memory or CPU due to a spinning process. You need to proactively monitor these metrics and fix any issues before they become a problem for your infrastructure.&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;Bringing It All Together&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;It's now clear that the BPEL infrastructure includes a lot of entities. Monitoring these as independent entities could be a challenge.&lt;/p&gt;  &lt;p&gt;A typical SOA environment will have hundreds of artifacts like Web services, BPEL processes, EJBs, adapters, and other resources. Monitoring a flat list of these artifacts is not productive. The dependency between these components and the impact of any changes you make is critical to determine. Distributed ownership of these components also requires that service-level agreements be established between providers and consumers of these components. These issues are addressed with a runtime governance offering. So it's important to employ a management tool that provides:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Translation of design-time discovery into production to help manage all the components and their dependencies in context &lt;/li&gt;    &lt;li&gt;SLA capabilities to capture and measure SL compliance of your SOA application and SOA components &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Think about a complicated BPEL process that uses several heterogeneous systems and applications. Say you're using Oracle's BPEL engine on an Oracle WebLogic server running on a Linux box. Your business processes involve partner links that depend on adapters that connect to IBM MQSeries applications and applications from Oracle's PeopleSoft Human Resources product family that run IBM WebSphere. Your BPEL engine uses an Oracle Real Application Clusters Database as the dehydration store. You want to monitor all these products together from a single management console. There are several management products on the market that may meet your needs. Figure 4 shows how you can manage the Oracle BPEL engine running on an Oracle WebLogic server from Oracle Enterprise Manager Grid Control 10g   &lt;br /&gt;&lt;img height="442" src="http://res.sys-con.com/story/nov08/744119/Panda_Fig-4.jpg" width="780" /&gt; &lt;/p&gt;  &lt;p&gt;An integrated management solution lets IT administrators manage complexity within a BPEL and SOA environment. Without this management solution, IT will see an increase in incidents, lower service levels, and increased end-user frustration. Moreover, as IT scales out with a new BPEL infrastructure, new personnel will be required to manage this complex distributed architecture. In addition, a move from legacy to SOA architecture can increase costs without a management strategy and toolset. You should consider investing in the right management product that makes sense for your infrastructure.&lt;/p&gt;  &lt;p&gt;Another compelling reason why you should consider a management tool is for alignment between IT and your business. As an IT administrator, you need to monitor and report issues in terms of business processes. You should have monitoring statistics aligned with business processes. To accomplish this you need to have a view of business process flows that should be synched up with actual flows in the BPEL server. BPEL management tools provide you with a view of business processes and reports monitoring statistics for each business process.&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;Best Practices&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;Here are some of the best practices you can follow to ensure the availability of your BPEL infrastructure:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Establish service-level objectives for your BPEL processes and partner links.&lt;/li&gt;    &lt;li&gt;Keep a library of BPEL suitcases in your software library. It will help in rebuilding a system in case of server failure.&lt;/li&gt;    &lt;li&gt;Automate routine operations such as purging old process instances.&lt;/li&gt;    &lt;li&gt;Monitor the performance of partner links.&lt;/li&gt;    &lt;li&gt;Monitor the whole BPEL ecosystem, not just the BPEL engine.&lt;/li&gt;    &lt;li&gt;Keep track of BPEL ecosystem membership/topology changes. &lt;/li&gt;    &lt;li&gt;Keep a gold image of your configuration when everything is stable and keep updating it after every configuration change. This will help you find the cause of any possible problem due to configuration changes. &lt;/li&gt;    &lt;li&gt;Monitor BPEL server-specific J2EE artifacts such as the JMS queues and data sources used by the BPEL server in addition to J2EE constructs used by BPEL processes. &lt;/li&gt;    &lt;li&gt;Make sure that you select a management solution that can maximize your productivity and help you deliver maximum service through automation. &lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;&lt;b&gt;Conclusion&lt;/b&gt;&lt;/h2&gt;  &lt;p&gt;With SOA, managing the complete infrastructure - involving lots of heterogeneous components and products - has become challenging. For IT administrators, managing the service-level agreements for composite applications can be a monumental task. Using the right tools and methodology to make sure your BPEL infrastructure is highly available can make your job much easier.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;hr /&gt;  &lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4038331289687265045-8087097638571868086?l=dimosthenes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/8087097638571868086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4038331289687265045&amp;postID=8087097638571868086' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/8087097638571868086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/8087097638571868086'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/2008/12/bpel-environments-and-complexity.html' title='BPEL Environments and Complexity management'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-350382660679707405</id><published>2008-12-24T12:42:00.001+02:00</published><updated>2009-01-15T14:32:09.801+02:00</updated><title type='text'>SOAs ‘nature’ and integration.</title><content type='html'>&lt;p&gt;An interesting post from &lt;a href="http://blogs.zdnet.com/service-oriented/?p=1240"&gt;Joe McKendrick&lt;/a&gt; contains the views of some consultants, as concerning SOA and integration. The issue, deals with a Shakespearian quest ‘to be or not to be’ with ‘be’ as integration.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“SOA is integration. SOA is not integration. Got that?&lt;/p&gt;    &lt;p&gt;There’s a&amp;#160; renewed debate raging about the relationship between the practices of service oriented architecture and integration.&lt;/p&gt;    &lt;p&gt;SOA is more than EAI 2009, but where do we start? […]”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;As Gartner analyst Yefim Natis states, few organizations have one comprehensive SOA — most organizations have multiple islands of SOA that will eventually need to be brought together. Ann Thomas Manes, pointed out that “Many organizations mistakenly perceive SOA &lt;u&gt;as an integration strategy&lt;/u&gt;. But it is not. SOA is about architecture. To achieve SOA, you must re-architect your systems.” But Loraine takes more of a pro-SOA-is-integration stance, noting that “most companies aren’t getting into SOA for a complete rebuild. Most companies deploy SOA because it’s so darn helpful with simplifying integration:” &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“…companies don’t want Extreme Makeover. They’re looking for a slight update, something that ties the room together, as interior designers like to say. … And here’s another hard truth: Although David Linthicum and others believe that agility is the ROI for SOA, many companies are realizing SOA ROI through integration.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Ann Thomas Manes &lt;a href="http://apsblog.burtongroup.com/2008/12/soa-vs-soi.html"&gt;urges&lt;/a&gt; practitioners to look beyond integration when planning SOA efforts. “It’s fine to use service oriented middleware to implement integration projects, but then you need to readjust your expectations. Most organizations that I speak with say that the goals of their SOA initiative are to reduce costs and increase agility. Unfortunately, these organizations aren’t likely to achieve these goals if their projects only focus on integration….”. SOA should be about more than simply linking app A to app B, and so on. SOA is about innovation. &lt;strong&gt;Every SOA-related proposal out there should include the word “innovation” somewhere in the text. &lt;/strong&gt;And, let’s face it, SOA would be downright boring (make that Boring with a capital B) if it was just another means of app or systems integration, and nothing more. &lt;/p&gt;  &lt;p&gt;But, nevertheless, integration is still an essential phase in the evolution from soloed, proprietary systems to full-functioning service oriented architecture. In many cases, it can help provide the initial justification for commencing with an SOA approach. And for many SOA proponents, especially those facing organizational resistance, the key is to just start. &lt;/p&gt;  &lt;p&gt;And, remember, SOA may involve integration, but it truly is about innovation.&lt;/p&gt;  &lt;p&gt;Actually, the truth, or the need (with the Aristotelian notion) behind doing SOA is that the main goals of SOA initiatives are to reduce costs and increase agility. The getting out from silos and proprietary systems is just the good reason of taking SOA approach in projects and have the acceptance of CEOs. How many times the “monolithic-systems” overcome has been stated in such meetings and proposals? And of coarse, at the end, how many times did a true SOA solution broke that “monolithity”. Some will say always, in the context of the project. But the true SOA should guide towards “the standardization of the core architecture elements (…) and furthermore to establish an optimized integration approach for existing assets of the environment.” as stated in the &lt;a href="http://dimosthenes.blogspot.com/2008/12/soa-and-real-service-integration-issue.html"&gt;SOA and the real Service Integration issue&lt;/a&gt; post. The problems of real life environment (both IT, infrastructure and financials) force towards an analytical solution, meaning solving one problem at a time. This is the main headache for considering SOAs in every extend you may wish to use it. &lt;/p&gt;  &lt;p&gt;The most useful approach to SOA, is the change of the adopted philosophy. The ideal SOA, considered somewhere in the Platonian world of Ideas, as a successful concept, has to do with a non-analytical approach, but mostly with a holistic one. The web services and the integration (imagine behind that word how many systems/applications/business approaches/files/tools… might be hiding) the business needs and the time constrains are giving the first bird-eye view, or the context of the environment to be SOA-ised. But this is not enough. If it was, then correctly, we should be speaking about re-engineering and therefore reinventing the wheel. A solution of this type, is something like.. “drop everything out and put the new, SOA”. SOA should deal with ALL of these. According to the project at hand, an holistic view should be taken in every aspect of the analysis. We should thing with the duality in mind (this project, the whole enterprise environment) and in a time agnostic attitude (as-is and to-be in one context). Ok, the magicians are out of job nowadays, but none said that doing SOA should be easy. In the beginning.&amp;#160; After having a good and approved idea of the total-holistic SOA environment in the context enterprise, then the compliance rules are straight forward and therefore the base of the SOA for the project(s) at hand to start with. SOA is about innovation, integration and re-architecture. But more of all, is about the way considering the very same topics, issues, environments and enterprises with a new eye. &lt;/p&gt;  &lt;p&gt;more to follow, stay tuned and if you would like help establishing a SOA strategy for your specific case, give me a shout!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;hr /&gt;  &lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4038331289687265045-350382660679707405?l=dimosthenes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/350382660679707405/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4038331289687265045&amp;postID=350382660679707405' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/350382660679707405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/350382660679707405'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/2008/12/soas-nature-and-integration.html' title='SOAs ‘nature’ and integration.'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-7098574843844600504</id><published>2008-12-23T13:23:00.001+02:00</published><updated>2008-12-24T12:43:50.758+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><category scheme='http://www.blogger.com/atom/ns#' term='ESB'/><title type='text'>SOA and the real Service Integration issue</title><content type='html'>&lt;p&gt;A real problem considering a SOA project, either in its beginning or in extending an all ready existing one, is the Web Services (ws) hell, that is hiding in the corner. Beginning the SOA approach, especially when having limited time to deliver and / or pure business analysis results, defining and architecting a solution that is compliant with your client (both in the kick-off architecture and in the way of working – aka good adaptation of the new environment) is possibly to provide a sea of ws. From the other hand, extending or taking a project in an already existing SOA environment that was developed by someone else, you have a small daemon hiding in the corner that always play with you in order to make you build more and more new ws in order to build your components. &lt;/p&gt;  &lt;p&gt;In any case, in the SOAs you are always face the problem of exponential increase of the ws pool. In order to avoid such a problem, you have to give effort in focusing on the standardization of the core architecture elements (imagine that in an existing case, developed by someone else, you have to understand and comply with the already taken way) and furthermore to establish an optimized integration approach for existing assets of the environment. &lt;/p&gt;  &lt;p&gt;Having these in mind, you have either to use some existing ground of work to extent by, or to … re-invent the wheel.&lt;/p&gt;  &lt;p&gt;Re-inventing the wheel, means that you are prepared to give much more effort in business analysis and re-engineering and furthermore to develop all the necessary tools and bridges, both for the interoperability elements of the infrastructure, as well as for the semantics and conceptual transformations that will take place in order to implement the needed physical (system) bridges.&lt;/p&gt;  &lt;p&gt;Or using some existing assets…&lt;/p&gt;  &lt;p&gt;&lt;a href="http://wiki.open-esb.java.net/Wiki.jsp?page=LearnJBI"&gt;Java Business Integration&lt;/a&gt; (JBI) is an effort focused on standardizing the core architecture elements of integration architectures. It is a specification developed under the Java Community Process (JCP) for an approach to implementing a Service Oriented Architecture (SOA). The JCP reference is &lt;a href="http://jcp.org/en/jsr/detail?id=208"&gt;JSR-208&lt;/a&gt;. JBI extends Java EE and Java SE with business integration service provider interfaces (SPIs). It enables the creation of a Java business integration environment for the creation of composite applications. It defines a standard runtime architecture for assembling integration components to enable a SOA in an enterprise information system.&lt;/p&gt;  &lt;p&gt;Following the JBI road, you might be able to use another ally for the SOA stacks you gonna need.&lt;/p&gt;  &lt;p&gt;&lt;a href="https://open-esb.dev.java.net/"&gt;Open ESB&lt;/a&gt; is an open source integration platform based on JBI technology. It implements an Enterprise Service Bus (ESB) using JBI as the foundation. This allows easy integration of Web Services to create loosely coupled, enterprise-level integration solution.&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;Open ESB Architecture&lt;/b&gt; &lt;/h2&gt;  &lt;p&gt;Because Open ESB is built on top of the JBI specification, it makes sense that, before diving into the architecture of Open ESB, we take a look at the JBI architecture, which is illustrated in Figure 1.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://res.sys-con.com/story/dec08/782568/yang-fig1.gif" /&gt; &lt;/p&gt;  &lt;p&gt;As the figure shows, JBI adopts a pluggable architecture. At the heart of a JBI runtime is a messaging infrastructure called Normalized Message Router (NMR) that is connected to a bunch of JBI components. JBI components are architectural building blocks of a JBI instance and are plugged into the NMR to interact with each other. The interaction among components carries out the functional logics of the JBI instance.&lt;/p&gt;  &lt;h6&gt;&lt;b&gt;Normalized Message Router&lt;/b&gt; &lt;/h6&gt;  &lt;p&gt;The primary function of the NMR is to route normalized messages from one component to another. It enables and mediates the inter-component communication. When a component needs to interact with another component, the component does so by generating a normalized message and sending it to the NMR. The NMR will route the message to the destined component based on some routing rules. After the destined component gets and processes the message, it will generate a response message if required, and will send the response message to the NMR. It is the NMR's responsibility to deliver the response message back to the original component.&lt;/p&gt;  &lt;p&gt;The NMR uses a WSDL-based messaging model to mediate the message exchanges between components. From the NMR's point-of-view, all JBI components are service providers and/or service consumers. The WSDL-based model defines operations as a message exchange between a service provider and a service consumer. A component can be a service provider, a service consumer, or both. Service consumers identify needed services by a WSDL service name rather than end-point address. This provides the necessary level of abstraction and decouples the consumer from the provider, allowing the NMR to select the appropriate service provider transparently to the consumer.&lt;/p&gt;  &lt;p&gt;An instance of an end-to-end interaction between a service consumer and a service provider is referred to as a service invocation. JBI mandates four types of interactions: One-Way, Reliable One-Way, Request-Response, and Request Optional-Response. These interactions map to the message exchange patterns (MEPs) defined by WSDL 2.0 Predefined Extensions.&lt;/p&gt;  &lt;p&gt;The NMR also supports various levels of quality of service for message delivery depending on application needs and the nature of the messages being delivered.&lt;b&gt;Component - Service Engine and Binding Component&lt;/b&gt;     &lt;br /&gt;A JBI component is a collection of software artifacts that provide or consume Web Services. As mentioned previously, JBI components are plugged into the NMR to interact with other components. JBI defines two types of components, Service Engines (SEs) and Binding Components (BCs).&lt;/p&gt;  &lt;p&gt;A Service Engine is a component that provides or consumes services locally within the JBI environment. Service Engines are business logic drivers of the JBI system. An XSLT Service Engine, for example, can provide data transformation services, while a BPEL Service Engine can execute a BPEL process to orchestrate services, or enable execution of long-lived business processes. A Service Engine can be a service provider, a service consumer, or both.&lt;/p&gt;  &lt;p&gt;A Binding Component is used to send and receive messages via particular protocols and transports to systems that are external to the JBI environment. They serve to isolate the JBI environment from the particular protocol by providing normalization and de-normalization from and to the protocol-specific format, allowing the JBI environment to deal only with normalized messages.&lt;/p&gt;  &lt;p&gt;Distinguishing between these two types of components is more functional. In fact, JBI uses only a flag to distinguish these two. The programming model and APIs of these two types are otherwise identical. However, by convention, Service Engines and Binding Components implement different functionality in JBI.&lt;/p&gt;  &lt;h6&gt;&lt;b&gt;Service Unit and Service Assembly&lt;/b&gt; &lt;/h6&gt;  &lt;p&gt;JBI runtime hosts components and so acts as a container for components. Components in turn act as containers for Service Units (SUs). A Service Unit is a collection of component-specific configuration artifacts to be installed on SEs or BCs. One can also think of a Service Unit as a single deployment package destined for a single component. The content of a Service Unit are completely opaque to JBI, but transparent to the component it is deployed to. An SU contains a single JBI-defined descriptor file that defines the static services provided and consumed by the Service Unit.&lt;/p&gt;  &lt;p&gt;Service Units are often grouped into an aggregated deployment file called a Service Assembly (SA). A Service Assembly includes a composite service deployment descriptor, detailing to which component each SU contained in the SA is to be deployed. A service assembly represents a composite service.&lt;/p&gt;  &lt;h6&gt;&lt;b&gt;Lifecycle Management&lt;/b&gt; &lt;/h6&gt;  &lt;p&gt;JBI also defines a JMX-based infrastructure for lifecycle management, environmental inspection, administration, and reconfiguration to ensure a predictable environment for reliable operations.&lt;/p&gt;  &lt;p&gt;Components interfere with JBI via two mechanisms: service provider interfaces (SPIs) and application program interfaces (APIs). SPIs are interfaces implemented by the binding or engine; APIs are interfaces exposed to bindings or engines by the framework. The contracts between framework and component define the obligations of both framework and JBI component to achieve particular functional goals within the JBI environment.&lt;/p&gt;  &lt;p&gt;Unless you're doing component development, it's unlikely that you need to work with these SPIs and APIs directly.&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;Open ESB&lt;/b&gt; &lt;/h2&gt;  &lt;p&gt;Once we've understood the architecture of JBI, Open ESB becomes really simple. Open ESB is an implementation of the JBI specification. It extends the JBI specification by creating an ESB from multiple JBI instances. The instances are linked by a proxy-binding based on Java Message Service (JMS). This lets components in separate JBI instances interoperate in the same fashion as local ones (see Figure 2).&lt;/p&gt;  &lt;p&gt;&lt;img src="http://res.sys-con.com/story/dec08/782568/yang-fig2.gif" /&gt; &lt;/p&gt;  &lt;p&gt;ESB administration is done by the Centralized Administration Server (CAS), a bus member that lets the administrator control the system directly.&lt;/p&gt;  &lt;p&gt;Open ESB includes a variety of JBI components, such as the HTTP SOAP Binding Component, the Java EE Service Engine, and the BPEL Service Engine&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h2&gt;&lt;b&gt;A Sample Service Integration Scenario&lt;/b&gt; &lt;/h2&gt;  &lt;p&gt;In this section, we'll examine a simple use case and illustrate a possible service integration solution using Open ESB.&lt;/p&gt;  &lt;h6&gt;&lt;i&gt;&lt;b&gt;Problem Description&lt;/b&gt;&lt;/i&gt; &lt;/h6&gt;  &lt;p&gt;ABC Movie Theatres is a fast-growing movie theatre chain. To better serve its customers, the management has decided to put in place a new ticket booking service, the Booking Service, which will be responsible for handling most of the ticket purchasing requests generated from various systems such as Web-based applications, ticket vending machines and points of sale (POS) at box offices.&lt;/p&gt;  &lt;p&gt;The business logic of handling a booking request is somewhat complicate. But in a nutshell, it involves the following steps:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;When a booking request is received, the Booking Service will first try to process the ticket information. This could include checking for ticket availability; holding the tickets for the customer if tickets are indeed available or provide alternatives to the customer otherwise; applying any applicable promotions and calculating the total dollar amount &lt;/li&gt;    &lt;li&gt;Then the Booking Service will charge the customer using the payment information included in the booking request &lt;/li&gt;    &lt;li&gt;Finally the Booking Service will send a confirmation to the customer using the contact information included in the request. &lt;/li&gt; &lt;/ol&gt;  &lt;h6&gt;&lt;i&gt;&lt;b&gt;High-Level Solution Description&lt;/b&gt;&lt;/i&gt; &lt;/h6&gt;  &lt;p&gt;Considering the fact that a significant amount of the logic needed by the new booking service has been implemented in different applications over time, and that these applications have been proved stable over time, it makes a lot sense to leverage these existing IT assets for cost efficiency. So the architect team at ABC comes up with the solution of service-enabling and -consolidating existing logics, bringing the services into the ESB and exposing them as new composite services that are made available via different protocols.&lt;/p&gt;  &lt;p&gt;To do this, they have to identify candidates for service-enabling. Currently the company has a billing system developed and used by the finance department and it has been working perfectly over years. This system runs over the HTTP protocol. Another system is the notification system developed by the customer relationship department. This system listens to a JMS message queue and, when it gets a new message, sends out notifications to the customer by the means specified in the message, e.g., an e-mail or a voice mail message. These two systems become the ideal candidates for billing customers and sending confirmations.&lt;/p&gt;  &lt;p&gt;The company also has a system for processing ticket orders. This system, however, is severely old and impossible to scale up to handle the ever-increasing transaction volume due to recent acquisitions. The architect team has decided it's time to write a replacement application; it's also decided that the replacement application, the Ticket System, will be built using EJB technologies due to the transactional nature of the application.&lt;/p&gt;  &lt;p&gt;The architect team also decided that the new Booking Service will be made available via the SOAP-over-HTTP protocol as well as the File protocol to support different client systems.&lt;/p&gt;  &lt;h6&gt;&lt;i&gt;&lt;b&gt;Solution Details&lt;/b&gt;&lt;/i&gt; &lt;/h6&gt;  &lt;p&gt;When it comes to Open ESB development, it's all about creating JBI Service Units and packing them in a Composite Application (or Service Assembly, in JBI terms). Figure 3 illustrates the Service Units for this solution and the interactions among those units. As mentioned earlier, Service Units are deployed to their corresponding JBI components. For simplicity's sake, we'll use the term Service Unit and Component interchangeably provided it doesn't cause any confusion in the particular context.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://res.sys-con.com/story/dec08/782568/yang-fig3.gif" /&gt; &lt;/p&gt;  &lt;p&gt;At a high level, two BCs, the Booking Service SOAP BC and the Booking Service File BC, are created to enable the Booking Service and expose it to the outside world via the SOAP and File protocol respectively, allowing different kinds of clients to consume the service. A client application can invoke the Booking Service via either of these protocols. Invocation requests generated by client applications are then routed to the Booking Process, a BPEL Service Engine. The Booking Process orchestrates the Ticket Service, the Billing Service, and the Notification Service to fulfil the request.&lt;/p&gt;  &lt;h6&gt;&lt;b&gt;File and SOAP BC - The Booking Service&lt;/b&gt; &lt;/h6&gt;  &lt;p&gt;In Open ESB, a File BC is a JBI binding component that binds file systems to WS-I Web Services. A File BC scans a pre-configured file location for new files. If a new file is found, the component generates a Web Service call using the content in the file as the payload of the Web Service input message. Response messages will also be written to the file system by the component. Many of the properties of a File BC, such as the file location, file name, and time interval for the component to scan the specified location for new file, can be configured.&lt;/p&gt;  &lt;p&gt;A SOAP BC works the same way as the File BC, only instead of scanning a file system directory, a SOAP BC accepts WS-I SOAP messages over the HTTP protocol.&lt;/p&gt;  &lt;p&gt;A File BC and a SOAP BC are created in this solution to enable the Booking Service and expose it to external systems via these protocols. External systems that wish to consume the service do so by either sending a WS-I-compliant message, or dropping the message in the specific file location.&lt;/p&gt;  &lt;p&gt;External requests received by the previous two BCs will be routed, by the NMR, to the Booking Process, a BPEL Service Engine that executes a BPEL business process to orchestrate services.&lt;/p&gt;  &lt;h6&gt;&lt;b&gt;BPEL Service Engine - The Booking Process&lt;/b&gt; &lt;/h6&gt;  &lt;p&gt;A BPEL Service Engine is a JBI runtime component that provides services for executing WS-BPEL-compliant business processes. The contract between a business process and partner services is described in WSDL.&lt;/p&gt;  &lt;p&gt;A BPEL SE can save business process data to a persistent store if configured to do so. This is required for recovering from system failure and running long-lived processes. A BPEL SE can be deployed to a clustered environment to achieve high scalability. The service engine's clustering algorithm automatically distributes processing across multiple engines. When the business process is configured for clustering, the BPEL Service Engine's failover capabilities ensure throughput of running business process instances. When business process instances encounter an engine failure, any suspended instances are picked up by all available BPEL Service Engines.&lt;/p&gt;  &lt;p&gt;The Booking Process in this solution is a BPEL SE and is at the heart of this solution. It does some simple message transformation and, most importantly, invokes the Ticket Service, Billing Service and the Notification Service. Figure 4 shows a simplified version of the Booking Service process.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://res.sys-con.com/story/dec08/782568/yang-fig4.gif" /&gt; &lt;/p&gt;  &lt;h6&gt;&lt;b&gt;Java EE Service Engine - The Ticket Service&lt;/b&gt; &lt;/h6&gt;  &lt;p&gt;A Java EE Service Engine brings Java EE components into the Open ESB runtime as Web Services. A Java EE Service Engine acts as a bridge between a Java EE application server and a JBI environment for Web Service providers and Web Service consumers deployed in the application server. Java EE Web components or EJB components that are packaged and deployed as Web Services on a Java EE container can be transparently exposed as service providers in JBI environment.&lt;/p&gt;  &lt;p&gt;In this solution, the Ticket System is implemented using EJB Session Beans and wrapped as a JAX-WS Web Service. The service is then brought into the Open ESB runtime by the Ticket Service SE.&lt;/p&gt;  &lt;h6&gt;&lt;b&gt;HTTP and JMS BC - The Billing Service &amp;amp; the Notification Service&lt;/b&gt; &lt;/h6&gt;  &lt;p&gt;Let's face it - all BCs work the same way. This is the beauty of Open ESB architecture. We've looked at two BCs, the File and the SOAP BC. Similarly an HTTP BC binds the HTTP protocol to the Web Service, and a JMS BC binds the JMS protocol.&lt;/p&gt;  &lt;p&gt;In this solution, the HTTP BC and the JMS BC are used to bring the Billing Service and the Notification Service into the Open ESB runtime respectively - as stated previously, the Billing Service runs over the HTTP protocol and the Notification Service over the JMS.&lt;/p&gt;  &lt;p&gt;It's important to be aware that, although these components are shown connected directly in the figure, they never communicate directly to each other. Instead, components send massages to and receive messages from the NMR. The NMR is responsible for transforming messages and routing messages to the appropriate destinations.&lt;/p&gt;  &lt;h6&gt;&lt;b&gt;GlassFish &amp;amp; NetBeans - Development &amp;amp; Deployment&lt;/b&gt; &lt;/h6&gt;  &lt;p&gt;Open ESB runs on any OSGi R4-compliant runtime. GlassFish has a built-in JBI runtime and is bundled with NetBeans for easy development. NetBeans provides a comprehensive GUI development environment. The java.net community is working on a new project, GlassFish ESB aimed at creating a community-driven ESB for the Glassfish Enterprise Server platform.&lt;/p&gt;  &lt;p&gt;Developing the process in NetBeans involves creating the needed JBI modules and including them in a composite application. Figure 5 shows a screenshot of creating the composite application in the NetBeans IDE.&lt;/p&gt;  &lt;p&gt;&lt;img src="http://res.sys-con.com/story/dec08/782568/yang-fig5.gif" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;b&gt;Conclusion&lt;/b&gt;     &lt;br /&gt;Open ESB provides a robust and flexible platform for building service-oriented integration solutions. Its component-based architecture allows maximum extensibility and interoperability. It's based on industry standards and is easy to use. It seamlessly integrates with other Java enterprise technologies.&lt;/p&gt;  &lt;h5&gt;&lt;b&gt;References&lt;/b&gt;&lt;/h5&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://jcp.org/en/jsr/detail?id=208"&gt;JSR 208&lt;/a&gt;: Java Business Integration (JBI) &lt;/li&gt;    &lt;li&gt;&lt;a href="https://open-esb.dev.java.net/IEPSE.html"&gt;Open ESB Project&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;a href="http://wiki.open-esb.java.net/"&gt;The Community Wiki for JBI&lt;/a&gt;, JBI Component Development and Open ESB. &lt;/li&gt;    &lt;li&gt;JDJ for useful resources and the &lt;a href="http://java.sys-con.com/node/782568?page=1"&gt;scenario&lt;/a&gt;&amp;#160; &lt;/li&gt; &lt;/ul&gt;  &lt;h5&gt;Open JBI Components&lt;/h5&gt;  &lt;p&gt;The overall goal of Project Open JBI Components is to foster community-based development of JBI components that conform to the Java Business Integration specification (&lt;a href="http://www.jcp.org/en/jsr/detail?id=208"&gt;JSR208&lt;/a&gt;). You can join this project as a JBI component developer or as part of an existing JBI component development team. &lt;/p&gt;  &lt;h5&gt;About JBI Components&lt;/h5&gt;  &lt;p&gt;The JSR208 specification provides for three installable JBI components: Service Engines, Bindings, and Shared Libraries. JBI components operate within a JBI container, which is defined by the JSR208 specification. Two popular implementations of JBI containers are &lt;a href="http://open-esb.dev.java.net/"&gt;Project Open ESB&lt;/a&gt; and &lt;a href="http://servicemix.org/"&gt;ServiceMix&lt;/a&gt;, an alternative approach which has been mentioned in &lt;a href="http://dimosthenes.blogspot.com/2008/10/servicemix-case.html"&gt;previous&lt;/a&gt; &lt;a href="http://dimosthenes.blogspot.com/2008/10/servicemix-4-into-play.html"&gt;posts&lt;/a&gt;. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;hr /&gt;  &lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4038331289687265045-7098574843844600504?l=dimosthenes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/7098574843844600504/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4038331289687265045&amp;postID=7098574843844600504' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/7098574843844600504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/7098574843844600504'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/2008/12/soa-and-real-service-integration-issue.html' title='SOA and the real Service Integration issue'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-1898008246883899791</id><published>2008-12-16T14:03:00.001+02:00</published><updated>2008-12-17T10:41:53.813+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tech -ing'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><title type='text'>SOA agility continued: Leveraging Data Services and provide agility in enterprise</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;The promise of SOA is flexibility and agility.&amp;#160; SOA people give the definition of &lt;strong&gt;&lt;em&gt;agility as the ability to adapt to change at the speed of business&lt;/em&gt;&lt;/strong&gt;.&amp;#160; In today’s global economy which has been fuelled by collaboration and Internet technologies, businesses change at a much faster rate than ever before.&amp;#160; So how does SOA help companies become agile?&amp;#160; In previous &lt;a href="http://dimosthenes.blogspot.com/2008/10/agility-issue.html"&gt;post&lt;/a&gt; i have consider my case of agility concerning the &lt;a href="http://dimosthenes.blogspot.com/2008/10/agility-continued-b-web-api-ing.html"&gt;developing&lt;/a&gt; and &lt;a href="http://dimosthenes.blogspot.com/2008/11/new-way-to-conceive-web-applications.html"&gt;architecting&lt;/a&gt; of SOA enabled applications, after facing some real world bottlenecks and difficulties. &lt;/p&gt;    &lt;p&gt;Continuing with the notion of &lt;a href="http://dimosthenes.blogspot.com/2008/10/agility-continued-b-web-api-ing.html"&gt;developing&lt;/a&gt; and expanding it to the agility of the enterprise (yours or mainly yours customer as an asset to provide to), the main issue should be to abstract &lt;u&gt;the necessary data services&lt;/u&gt; that the other layers of the architecture use. The trick here is the ‘magic’ logical (or conceptual) representation of an entity (in this example and in many real world cases, the customer), not the physical implementation. From the point that in software we can deal with symbolic transformations, the option of abstracting the semantics into simpler (but yet transformable back) entities, is the magic. (Although, here i don’t refer to semantics, keep in mind, that in some legacy SOA platforms of biggest vendors, the semantics is on main focus as a next step for tools to by – they mention it as the heart of orchestration, organizing and identifying the correct services in the SOA-ws sea – which is the next step of my consideration here).&lt;/p&gt;    &lt;p&gt;Firstly, let’s look at a logical view of a typical SOA.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/AROQ6j-4R2kLO_hniO-8KA"&gt;&lt;img alt="" src="http://lh4.ggpht.com/_0oE0MdUg0nE/SSbZIB9telI/AAAAAAAADEw/mBjrjpKP69Y/s400/SOA%20and%20mashups.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;You can see in this diagram how each layer of the architecture has been abstracted and is mutually exclusive or “loosely coupled” from the other layers of the architecture.&amp;#160; Why is this important?&amp;#160; The answer is simple…..&lt;strong&gt;&lt;font color="#ff0000"&gt;ease of change!&lt;/font&gt;&lt;/strong&gt;&amp;#160; Here are some advantages of this approach.&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;Share services, components, rules, etc. across the enterprise (reuse) &lt;/li&gt;      &lt;li&gt;Isolate changes and reduce dependencies (speed to market) &lt;/li&gt;      &lt;li&gt;Minimize impact of business changes (speed to market) &lt;/li&gt;      &lt;li&gt;Easier to maintain (maintainability) &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;Finalizing here, to give a clear applicable explanation of the above, let me give an example of how this approach helps companies become agile.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;Use Case: New customer data from a new client        &lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;Let’s say your company provides a service for customers in the retail industry.&amp;#160; You have a website that offers online services for consumers and your &lt;a href="http://en.wikipedia.org/wiki/White_label_product"&gt;white label&lt;/a&gt; solution is tailored to look like it is hosted by the individual retailers.&amp;#160; The problem is that each retailer has their own customer database.&amp;#160; In the past you would have to write a ton of code for each retailer that you signed up to use your services.&amp;#160; With SOA, now it is a simple data mapping exercise.&amp;#160; By abstracting data services, the other layers of the architecture use the logical representation of customer, not the physical implementation.&amp;#160; Behind the scenes, the data services layer is translating the request for customer data from logical view to physical implementation.&amp;#160; So when you bring on new clients, you simply use a tool in the data services layer to map the new clients customer data to the standard logical definition as defined by the architecture.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/P3hmrrHgsnlKPH8ioxyGFA"&gt;&lt;img alt="" src="http://lh3.ggpht.com/_0oE0MdUg0nE/SSmFwQEovGI/AAAAAAAADFs/itBiWvr57FQ/s400/Data%20Services.gif" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;You can see from this example that all three retailers have an entirely different implementation of their customer database including different naming conventions and even different attributes. In the data services layer, you can map all of these physical implementations to one standard customer definition. You can also see how the business processes all use the logical view of customer. This allows us to add and change customer definitions on the back end without changing code on the front end. If two more retailers were to sign up tomorrow, we can map their definitions to the logical customer view and be done. No Code!!! That is agile!&lt;/p&gt;    &lt;p&gt;If you would like help establishing a data services strategy, give me a shout!&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The above schematics and context (reason) for writing this post are from &lt;a href="http://www.kavistechnology.com/"&gt;Mike Kavis&lt;/a&gt; . Also I would like to thank him for the definition of the Use Case above and the schemes usage.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;hr /&gt;  &lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4038331289687265045-1898008246883899791?l=dimosthenes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/1898008246883899791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4038331289687265045&amp;postID=1898008246883899791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/1898008246883899791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/1898008246883899791'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/2008/12/soa-agility-continued-leveraging-data.html' title='SOA agility continued: Leveraging Data Services and provide agility in enterprise'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_0oE0MdUg0nE/SSbZIB9telI/AAAAAAAADEw/mBjrjpKP69Y/s72-c/SOA%20and%20mashups.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-5457211256936747387</id><published>2008-12-16T13:29:00.001+02:00</published><updated>2008-12-17T10:41:12.807+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>SOA Open Source stacks</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Dave Linthicum wrote a post called &lt;a href="http://weblog.infoworld.com/realworldsoa/archives/2008/11/open_source_and.html?source=rss"&gt;Open Source SOA provides some major advantages&lt;/a&gt;. In his post Dave stated: &lt;/p&gt;    &lt;blockquote&gt;     &lt;p&gt;When it comes to SOA, I think open source provides two major advantages: &lt;/p&gt;      &lt;ul&gt;       &lt;li&gt;First, it’s typically much less expensive than the tools and the technology that are proprietary. &lt;/li&gt;        &lt;li&gt;Second, they are typically much more simplistic and easier to understand and use. &lt;/li&gt;     &lt;/ul&gt;      &lt;p&gt;To the second point, simplicity. The open source SOA vendors seem to take a much more rudimentary approach to SOA, and their tools seem to be much easier to understand and, in some cases, use. While some people want complex, powerful tools, the reality is that most SOAs don’t need them. If you’re honest with the requirements of the project, you’ll see that good enough is, well, good enough.&lt;/p&gt;   &lt;/blockquote&gt;    &lt;p&gt;Great points. I would also add another clear advantage which I learned the hard way. On a previous enterprise wide SOA initiative, I drank the cool-aid that the vendor stack was an integrated stack and was simpler to deploy and manage over a stack of a mix of vendors. What I found out is that the mega vendors (IBM, Oracle, etc.) have bought so many pure play tools (rules engines, BPMs tools, data services and MDM tools, governance tools, etc.) that the smooth integration ends when the Power Point decks are closed. In reality, the mega vendor stacks are a hodge podge of rushed acquisition and integration efforts.The important thing, is that the underlying architecture of each tool within the stack are completely different and there are very few people (if any) within the organization who understands the complete stack. In fact, we were dealing with two very different organizations when dealing with support and they were not in sync. Eventually the entire company was consumed by another mega vendor (you can probably guess which acquisition this was) and the whole product roadmap was turned upside down.&lt;/p&gt;    &lt;p&gt;Now let’s look at some of the well established open source stack vendors like WSO2, MuleSource, and RedHat. These vendors do not suffer from acquisition madness and chaos. If fact, they are all built on a consistent architecture and do offer smooth integration between the various layers of the stack. Do they have all of the features of the commercial products? No. Do they have enough features for most SOA initiatives. Definitely. &lt;strong&gt;&lt;a href="http://www.kavistechnology.com/blog/?author=2"&gt;MikeKavis&lt;/a&gt;&lt;/strong&gt; wrote a post on CIO.com called &lt;a href="http://www.cio.com/article/440370/Tight_Budgets_Try_Open_Source_SOA_"&gt;Tight Budgets? Try open source SOA&lt;/a&gt;. Here is a quick summary of the advantages he discussed: &lt;/p&gt;    &lt;ol&gt;     &lt;li&gt;&lt;strong&gt;Try before you buy&lt;/strong&gt; &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Lower cost of entry&lt;/strong&gt; &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Cost effective support&lt;/strong&gt; &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;Core competency&lt;/strong&gt; &lt;/li&gt;      &lt;li&gt;&lt;strong&gt;For the people by the people&lt;/strong&gt; &lt;/li&gt;   &lt;/ol&gt;    &lt;p&gt;So what open source options do I have, you might ask? The following picture shows the open source tools that some people prefer for their new SOA initiative. There are using a combination of &lt;a href="http://wso2.com/"&gt;WSO2&lt;/a&gt;, &lt;a href="http://www.intalio.com/"&gt;Intalio&lt;/a&gt;, &lt;a href="http://www.jboss.org/drools/"&gt;Drools&lt;/a&gt;, &lt;a href="http://www.liferay.com/web/guest/home"&gt;Liferay&lt;/a&gt;, and &lt;a href="http://www.blogger.com/www.pushtotest.com"&gt;PushToTest&lt;/a&gt;.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/92CJBPKiTQE5EV8j5X_-Qw"&gt;&lt;img src="http://lh5.ggpht.com/_0oE0MdUg0nE/SSxJLadb4aI/AAAAAAAADGs/juwA-tXfKDo/s400/open%20source%20SOA%20WSO2.gif" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;This is just one example of many. You can mix and match tools from different open source communities or you could standardize on one community. Here is an example of Red Hat’s &lt;a href="http://www.jboss.org/projects/"&gt;jBoss&lt;/a&gt; SOA stack.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/3dOdBR0McTLBNiGeRgFDPg"&gt;&lt;img src="http://lh4.ggpht.com/_0oE0MdUg0nE/SSxJLOrrl9I/AAAAAAAADGc/xPHsT-tPErc/s400/jBoss.png" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;And &lt;a href="http://mulesource.com/products/"&gt;MuleSource&lt;/a&gt; has a well known suite of tools as well.       &lt;br /&gt;&lt;a href="http://picasaweb.google.com/lh/photo/qCZQgNwd19UmteY-yIpQ7Q"&gt;&lt;img src="http://lh6.ggpht.com/_0oE0MdUg0nE/SSxJLYSIQ1I/AAAAAAAADGk/_Q3kWbkonos/s400/MuleSource.GIF" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Many organizations are still not very comfortable with open source for mission critical initiatives. There is a debunk for many of the open source myths in the past (&lt;a href="http://it.toolbox.com/blogs/madgreek/open-source-debunking-myths-part-1-23738"&gt;here&lt;/a&gt;, &lt;a href="http://it.toolbox.com/blogs/madgreek/open-source-debunking-myths-part-2-23828"&gt;here&lt;/a&gt;, and &lt;a href="http://it.toolbox.com/blogs/madgreek/open-source-debunking-myths-part-3-23885"&gt;here&lt;/a&gt;).&lt;/p&gt;    &lt;p&gt;If there ever was a time to embrace open source, the time is now in this harsh economy. As commercial SOA vendors continue to get gobbled up by the mega vendors, it is time to seriously consider alternatives.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The above schematics and the first place to step on (context) for writing this post are from&amp;#160; &lt;a href="http://www.kavistechnology.com/"&gt;Mike Kavis&lt;/a&gt; . Also I would like to thank him for using his comments and graphs (although their are not his - Please refer to Mule, JBoss and WSO2 sites for these and extended info for these tools).&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;hr /&gt;  &lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4038331289687265045-5457211256936747387?l=dimosthenes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/5457211256936747387/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4038331289687265045&amp;postID=5457211256936747387' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/5457211256936747387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/5457211256936747387'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/2008/12/soa-open-source-stacks.html' title='SOA Open Source stacks'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_0oE0MdUg0nE/SSxJLadb4aI/AAAAAAAADGs/juwA-tXfKDo/s72-c/open%20source%20SOA%20WSO2.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-3138885328044230862</id><published>2008-12-16T12:39:00.001+02:00</published><updated>2008-12-16T12:39:24.402+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>Adapting with the SOA – Mashing up, the case of Enterprise Mashups</title><content type='html'>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;blockquote&gt;   &lt;h2&gt;The Dilemma&lt;/h2&gt;    &lt;p&gt;When defining a SOA scheme, or developing web services (of coarse in a SOA compliant way or SOA enabled) you try to sell or develop a reusable asset both to you (for easier future development) and your clients (in order to deliver them a dynamic, adaptable and easy to extent asset). Nowadays, lots are mentioned around enterprise mashups. Actually, when working in web development projects 4-5 years ago, the idea of mashups, was very helpful and many times the focus of my work. Thing of the Microsoft’s Sharepoint logic, whereas you just by dropping in web-parts, you were able to develop in just a ‘lego’ -way some potral, an intranet and what so ever web presence. Knowing the tool’s abilities and the business/project requirement needs the whole job was straight forward. The same for example, holds for the Plone CMS system, which just by re-using existing parts of it (that were tested and user friendly) you were able to deliver a very user friendly CMS system, making your clients very happy that they could manage some web aspects and deploys&amp;#160; from a desk and by paying a web developer.&lt;/p&gt;    &lt;p&gt;In the world of the SOA era, this “lego” approach is hiding behind the re-usage promise.&amp;#160; Companies and developers, software architects and business, are now familiar with the bottlenecks of the above notion. The managers and so, of the SOA ‘environments’, came above the notion of &lt;a href="http://en.wikipedia.org/wiki/Software_as_a_service"&gt;SaaS&lt;/a&gt;. &lt;font color="#808080"&gt;In general, &lt;b&gt;Software as a Service&lt;/b&gt; (&lt;b&gt;SaaS&lt;/b&gt;, typically pronounced 'sass') is a model of &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Software_deployment"&gt;&lt;font color="#808080"&gt;software deployment&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; where an application is hosted as a service provided to customers across the &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Internet"&gt;&lt;font color="#808080"&gt;Internet&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt;. By eliminating the need to install and run the application on the customer's own computer, SaaS alleviates the customer's burden of software maintenance, ongoing operation, and support. Conversely, customers relinquish control over software versions or changing requirements; moreover, costs to use the service become a continuous expense, rather than a single expense at time of purchase. Using SaaS also can &lt;i&gt;conceivably&lt;/i&gt; reduce that up-front expense of software purchases, through less costly, &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/On-demand"&gt;&lt;font color="#808080"&gt;on-demand&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; pricing. From the software vendor's standpoint, SaaS has the attraction of providing stronger protection of its &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Intellectual_property"&gt;&lt;font color="#808080"&gt;intellectual property&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; and establishing an ongoing revenue stream. The SaaS software vendor may host the application on its own web server, or this function may be handled by a third-party &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Application_service_provider"&gt;&lt;font color="#808080"&gt;application service provider&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; (ASP). This way, end users may reduce their investment on server hardware too.&lt;/font&gt;&lt;/p&gt;    &lt;h5&gt;&lt;font color="#808080"&gt;the…Philosophy&lt;/font&gt;&lt;/h5&gt;    &lt;p&gt;&lt;font color="#808080"&gt;As a term, SaaS is generally associated with business software and is typically thought of as a low-cost way for businesses to obtain the same benefits of commercially licensed, internally operated software without the associated complexity and high initial cost. Consumer-oriented web-native software is generally known as &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Web_2.0"&gt;&lt;font color="#808080"&gt;Web 2.0&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; and not as SaaS. Many types of software are well suited to the SaaS model, where customers may have little interest or capability in software deployment, but do have substantial computing needs. Application areas such as &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Customer_relationship_management"&gt;&lt;font color="#808080"&gt;Customer relationship management&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; (CRM), &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Video_conferencing"&gt;&lt;font color="#808080"&gt;video conferencing&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt;, &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Human_resources"&gt;&lt;font color="#808080"&gt;human resources&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt;, &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/IT_service_management"&gt;&lt;font color="#808080"&gt;IT service management&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt;, &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Accounting"&gt;&lt;font color="#808080"&gt;accounting&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt;, &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/IT_security"&gt;&lt;font color="#808080"&gt;IT security&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt;, &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Web_analytics"&gt;&lt;font color="#808080"&gt;web analytics&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt;, &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Web_content_management_system"&gt;&lt;font color="#808080"&gt;web content management&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; and &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/E-mail"&gt;&lt;font color="#808080"&gt;e-mail&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; are some of the initial markets showing SaaS success. The distinction between SaaS and earlier applications delivered over the Internet is that SaaS solutions were developed specifically to leverage web technologies such as the browser, thereby making them web-native. The data design and architecture of SaaS applications are specifically built with a &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Multitenancy"&gt;&lt;font color="#808080"&gt;'multi-tenant'&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; backend, thus enabling multiple customers or users to access a shared data model. This further differentiates SaaS from client/server or 'ASP' (Application Service Provider) solutions in that SaaS providers are leveraging enormous economies of scale in the deployment, management, support and through the Software Development Lifecycle.&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;a name="Key_characteristics"&gt;&lt;font color="#808080"&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;    &lt;h5&gt;&lt;font color="#808080"&gt;Key characteristics&lt;/font&gt;&lt;/h5&gt;    &lt;p&gt;&lt;font color="#808080"&gt;The key characteristics of SaaS software, in general, include:&lt;/font&gt;&lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;&lt;font color="#808080"&gt;network-based access to, and management of, commercially available software &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#808080"&gt;activities that are managed from central locations rather than at each customer's site, enabling customers to access applications remotely via the &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/WWW"&gt;&lt;font color="#808080"&gt;Web&lt;/font&gt;&lt;/a&gt; &lt;/li&gt;      &lt;li&gt;&lt;font color="#808080"&gt;application delivery that typically is closer to a one-to-many model (single instance, &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Multitenant"&gt;&lt;font color="#808080"&gt;multi-tenant&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; architecture) than to a one-to-one model, including architecture, pricing, partnering, and management characteristics &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#808080"&gt;centralized feature updating, which obviates the need for downloadable patches and upgrades. &lt;/font&gt;&lt;/li&gt;      &lt;li&gt;&lt;font color="#808080"&gt;SaaS is often used in a larger network of communicating software - either as part of a &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Mashup_%28web_application_hybrid%29"&gt;&lt;font color="#808080"&gt;mashup&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; or as a plugin to a &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Platform_as_a_service"&gt;&lt;font color="#808080"&gt;platform as a service&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt;. &lt;/font&gt;&lt;a href="http://en.wikipedia.org/wiki/Service_oriented_architecture"&gt;&lt;font color="#808080"&gt;Service oriented architecture&lt;/font&gt;&lt;/a&gt;&lt;font color="#808080"&gt; is naturally more complex than traditional models of software deployment. &lt;/font&gt;&lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;&lt;font color="#808080"&gt;SaaS applications are generally priced on a per-user basis, sometimes with a relatively small minimum number of users and often with additional fees for extra bandwidth and storage. SaaS revenue streams to the vendor are therefore lower initially than traditional software license fees, but are also recurring, and therefore viewed as more predictable, much like maintenance fees for licensed software.&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;Ok. This is how the thing is defined to be like. This is the encyclopaedias bird-eye view. Now lets apply these. And we have a real world case. From the above Key characteristics,&amp;#160; the 3rd and the 5th are of great importance. The business analysis should give some hinds, but there is not only that.&amp;#160; The new startup that I am exposing here as example, is &lt;em&gt;building a SaaS solution that will be consumed by various types of customers and partners. These customers and partners may want to consume our data services as a RSS feed, gadget, SMS message, web page, within a portal or portlet, or a number of different ways. I do not want to spend the rest of my life developing new output mediums for our services. Instead, I would rather spend my time adding new business services to enhance our product and service offerings hence contributing to the bottom line.&lt;/em&gt;&lt;/p&gt;    &lt;h2&gt;Enterprise Mashups to the rescue&lt;/h2&gt;    &lt;p&gt;Enterprise mashups will allow me to offer my partners and customers the ultimate flexibility to access our products and services in ways that are convenient for them without having to wait on my IT shop to decide if (a) we think the request is important enough in our priority list, (b) if we have the time and resources to work on it, and (c) how much we will charge them. On the IT side of the house, with an enterprise mashup strategy in place we can be assured that whatever mashups our customers and partners create, they will be subject to the same security and governance as the services we have developed. The diagram below shows a logical view of how our SOA will be designed.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/vpzBJ7tnRRVctin5BpTIrQ"&gt;&lt;img src="http://lh3.ggpht.com/_0oE0MdUg0nE/SSbQJXx_nsI/AAAAAAAADEE/mYSdsW-laNY/s400/SOA-preMashup.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;As you can see, we have clearly abstracted the various layers within the architecture and they all inherit our overall security policies. SOA governance is applied to this architectural approach to enforce our standards and design principles. Overall IT governance provides oversight over the entire enterprise which includes legacy systems (we don’t mention any legacy yet), third party software, etc.&lt;/p&gt;    &lt;p&gt;Now let’s add the enterprise mashup layer. We want to hide the complexity of our architecture from the end user and expose data services to them to consume. At the same time we want these mashups to be equally secure as the services we write and adhere to the same governing principles. Enterprise mashup products provide tools to make managing this layer easy and efficient. The diagram below shows the enterprise mashup layer inserted into the architecture as a layer on top of SOA.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/AROQ6j-4R2kLO_hniO-8KA"&gt;&lt;img src="http://lh4.ggpht.com/_0oE0MdUg0nE/SSbZIB9telI/AAAAAAAADEw/mBjrjpKP69Y/s400/SOA%20and%20mashups.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;&amp;#160;&lt;/p&gt;    &lt;h2&gt;Enterprise Mashups in simple terms&lt;/h2&gt;    &lt;p&gt;&amp;#160;&lt;a href="http://deepakalur.wordpress.com/"&gt;Deepak Alur&lt;/a&gt; (JackBe’s VP of Engineering) discussed how enterprises have been focusing more on infrastructure and technology and not on the consumers of data. As he coined it, many shops are “developing horizontally and not addressing the needs of the users”. He talked about how users were doing their own brute force mashups by cutting and pasting data from various places into Excel. This creates various issues within the enterprise due to lack of data integrity, security, and governance. It is ironic how corporations spend huge amounts of money on accounting software and ERP systems, yet they still run the business out of user created Excel spreadsheets! The concept of enterprise mashups addresses this by shifting the focus back to the user consumption of data. Here are some of the requirements for mashups that Deepak pointed out: &lt;/p&gt;    &lt;ul&gt;     &lt;li&gt;User driven &amp;amp; user focused &lt;/li&gt;      &lt;li&gt;Both visual &amp;amp; non-visual &lt;/li&gt;      &lt;li&gt;Client &amp;amp; server side (although most are server) &lt;/li&gt;      &lt;li&gt;Plug-n-Play &lt;/li&gt;      &lt;li&gt;Dynamic, Adhoc, Situational &lt;/li&gt;      &lt;li&gt;Secure &amp;amp; Governed &lt;/li&gt;      &lt;li&gt;Sharable &amp;amp; Customizable &lt;/li&gt;      &lt;li&gt;Near zero cost to the consumer &lt;/li&gt;   &lt;/ul&gt;    &lt;p&gt;Jackbe’s enterprise mashup tool is called &lt;a href="http://www.jackbe.com/products/index.php"&gt;Presto&lt;/a&gt;. Presto is an Enterprise Mashup Platform that allows consumers to create “mashlets” or virtual services. IT’s role is to provide the security and governance for each data service that will be exposed for consumer use.&lt;/p&gt;    &lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/IxQlmE6H2L8-TB8IoYxKxw"&gt;&lt;img src="http://lh6.ggpht.com/_0oE0MdUg0nE/SSbQJSzKFrI/AAAAAAAADD8/BvTCBd4FNas/s400/EnterpriseMashup.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Presto Wires is a user friendly tool to allow users to create their own mashups by joining, filtering, and merging various data services (as shown in the picture below).&lt;/p&gt;    &lt;p&gt;&lt;a href="http://picasaweb.google.com/lh/photo/KTAkX4Ny8XZ_TsGnne4OJQ"&gt;&lt;img src="http://lh6.ggpht.com/_0oE0MdUg0nE/SSbirsmtb_I/AAAAAAAADE4/nLDJorNj_BA/s400/Wires2.png" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;In this example the user is combing multiple data points from many different organizations in an automated fashion. They could then present this data to multiple different user interfaces and devices. All without waiting on IT.&lt;/p&gt;    &lt;h2&gt;How this solves my Dilemma&lt;/h2&gt;    &lt;p&gt;     &lt;br /&gt;Back to my dilemma. By leveraging a tool like Jackbe’s Presto or WSO2’s &lt;a href="http://wso2.com/products/compose/wso2-mashup-server/"&gt;Mashup Server&lt;/a&gt;, I can now present various data services in a secured and governed fashion to my customers and partners without being concerned on how they want to consume it. Whether they want the mashup on their own intranet, as a desktop gadget, as an application on Facebook, or what ever they dream of, all I need to be concerned with is the SLA of my data services. This also makes my product offering more competitive than my competitors who have proprietary user interfaces that do not provide the flexibility and customization that the customers desire. &lt;/p&gt;    &lt;p&gt;As mentioned in the title, this is the Adaptation with your SOA cake. For those organizations who are disciplined enough to implement SOA and follow the best practices of design and governance, the reward can be an simple addition of an Enterprise Mashup Platform on top of your SOA stack. This is the ultimate flexibility and agility that SOA promises. &lt;/p&gt;&lt;/blockquote&gt;  &lt;div class="blogger-post-footer"&gt;&lt;hr /&gt;  &lt;a href="http://dimosthenes.blogspot.com"&gt;evolving through...&lt;/a&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4038331289687265045-3138885328044230862?l=dimosthenes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://dimosthenes.blogspot.com/feeds/3138885328044230862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4038331289687265045&amp;postID=3138885328044230862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/3138885328044230862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4038331289687265045/posts/default/3138885328044230862'/><link rel='alternate' type='text/html' href='http://dimosthenes.blogspot.com/2008/12/adapting-with-soa-mashing-up-case-of.html' title='Adapting with the SOA – Mashing up, the case of Enterprise Mashups'/><author><name>Dimosthenes</name><uri>http://www.blogger.com/profile/13353431884092863559</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_0oE0MdUg0nE/SSbQJXx_nsI/AAAAAAAADEE/mYSdsW-laNY/s72-c/SOA-preMashup.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-4038331289687265045.post-4199773673082351539</id><published>2008-12-10T12:57:00.001+02:00</published><updated>2008-12-10T12:57:42.932+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tools'/><category scheme='http://www.blogger.com/atom/ns#' term='SOA'/><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>Automatically generate Java Web service clients with Axis2, XFire, CXF, and Java 6, including WSDL compatibility checks</title><content type='html'>&lt;h3&gt;Client-side WSDL processing with Groovy and Gant&lt;/h3&gt;  &lt;p&gt;Like it or not, service-oriented architecture (SOA) is a hot topic, and SOAP-based Web services have emerged as the most common implementation of SOA. But, as happens with all new-comings, &amp;quot;SOA reality brings SOA problems.&amp;quot; You can mitigate these problems by creating useful Web service clients, and also by thoroughly testing your Web services on both the server side and the client side. WSDL files play a central role in both of these activities, so in this post i will extent the &lt;a href="http://dimosthenes.blogspot.com/2008/11/client-web-services-autogeneration.html" target="_blank"&gt;client autogeneration approach&lt;/a&gt; and &lt;a href="http://dimosthenes.blogspot.com/2008/11/dynamic-client-for-web-service-in.html" target="_blank"&gt;dynamic client for a web service&lt;/a&gt; going into an alternative (and many time quicker) path, using an extensible toolset that facilitates client-side WSDL processing using &lt;a href="http://groovy.codehaus.org/Gant" target="_blank"&gt;Gant&lt;/a&gt; and &lt;a href="http://groovy.codehaus.org/" target="_blank"&gt;Groovy&lt;/a&gt;. &lt;/p&gt;  &lt;h2&gt;The real life needs-requirements emerging …&lt;/h2&gt;  &lt;p&gt;The real SOA-wise for Web services, as real life (and furthermore mature SOA standards) demand, should be &lt;strong&gt;interoperability&lt;/strong&gt;. Although, in various projects the sensitivity and depth of the term interoperability should be defined well, in those projects &lt;u&gt;always&lt;/u&gt;, there should be a cross-platform Web service testing team responsible for testing: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;functional aspects as well as the &lt;/li&gt;    &lt;li&gt;performance, &lt;/li&gt;    &lt;li&gt;load, and &lt;/li&gt;    &lt;li&gt;robustness &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;of Web services. In the ‘open sea’ of open source and legacy related applications, with mixture of standards and a batch of tools available around for various jobs and tasks, I realized the need for a….&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;small, &lt;/li&gt;    &lt;li&gt;easy-to-use, &lt;/li&gt;    &lt;li&gt;command-line-based solution &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;for WSDL processing. I wanted the toolset to help testers and developers check and validate WSDL 1.1 files coming from different sources for compatibility with various Web service frameworks, as well as generating test stubs in Java to make actual calls. For the Java platform, that meant using Java 6 &lt;code&gt;wsimport&lt;/code&gt;, &lt;a href="http://ws.apache.org/axis2/"&gt;Axis2&lt;/a&gt;, &lt;a href="http://xfire.codehaus.org/"&gt;XFire&lt;/a&gt;, and &lt;a href="http://incubator.apache.org/cxf/"&gt;CXF&lt;/a&gt;.&lt;/p&gt;  &lt;h2&gt;Searching for solution…&lt;/h2&gt;  &lt;p&gt;I’ve started client-side test development with XFire, but then switched to Axis2 because of changing customer requirements in our agile project. (Axis2 was considered to be more popular and widespread than XFire.) I have also used &lt;a href="http://ksoap2.sourceforge.net/"&gt;ksoap2&lt;/a&gt; -- a lightweight Web service framework especially for the Java ME developer. We didn't expand the toolset to use &lt;code&gt;ksoap2&lt;/code&gt; because it has no &lt;u&gt;WSDL-to-Java code generator.&lt;/u&gt; &lt;/p&gt;  &lt;p&gt;Besides being controllable via simple commands, the toolset had to be able to integrate at least the WSDL checker into an automated build environment like &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt;. One solution would have been to develop everything as a set of Ant targets. But executing everything with Ant is cumbersome when tasks become more complex, and you need control structures like &lt;code&gt;if-then-else&lt;/code&gt; or &lt;code&gt;for loops&lt;/code&gt;. &lt;/p&gt;  &lt;p&gt;Even using &lt;code&gt;ant-contrib&lt;/code&gt; binds you to XML-structures that are not easy to read, although you will have more functionality available. Anyhow, in the end you might need to implement some jobs as Ant tasks. &lt;/p&gt;  &lt;h2&gt;solution’s profile, overview:&lt;/h2&gt;  &lt;p&gt;All of this is possible, of course, but I was looking for a more elegant solution. Finally, I decided to use Groovy and a smart combination of Groovy plus Ant, called Gant. The components I have developed for the resulting Toolset can be divided into two groups: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The Gant part is responsible for providing some &amp;quot;targets&amp;quot; for the tester's everyday work, including the WSDL-checker and a Java parser/modifier component. &lt;/li&gt;    &lt;li&gt;The WSDL-checker part is implemented with Groovy, but callable inside an Ant environment (via Groovy's Ant task) as part of the daily build process &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;That is an overview of the programming and scripting languages I used to build the Groovy and Gant Toolset. Now let's consider the technologies in detail. &lt;/p&gt;  &lt;h4&gt;Overview of Ant, Groovy, and Gant&lt;/h4&gt;  &lt;p&gt;Apache Ant is a software tool for automating software build processes. It is similar to &lt;code&gt;make&lt;/code&gt; but is written in the Java language, requires the Java platform, and is best suited to building Java projects. &lt;a href="http://ant.apache.org"&gt;Ant&lt;/a&gt; is based on an XML description of targets and their dependencies. Targets include tasks that every project needs, like &lt;code&gt;clean&lt;/code&gt;, &lt;code&gt;compile&lt;/code&gt;, &lt;code&gt;javadoc&lt;/code&gt;, and &lt;code&gt;jar&lt;/code&gt;. Ant is the &lt;i&gt;de-facto&lt;/i&gt; standard build tool for Java, although &lt;a href="http://maven.apache.org/ "&gt;Maven&lt;/a&gt; is making inroads. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; is an object-oriented programming and scripting language for the Java platform, with features like those of Perl, Ruby, and Python. The nice thing is that, Groovy sources are dynamically compiled to Java bytecode that works seamlessly with your own Java code or third-party libraries. By means of the Groovy compiler, you can also produce bytecode for other Java projects. It is fair to say that I am biased towards Groovy compared to other scripting languages such as Perl or Ruby. While other people's preferences and experiences may be different from mine, the integration between Groovy and Java code is thorough and smooth. It was also easy, coming from Java, to get familiar with the Groovy syntax. What made Groovy especially interesting for solving my problems was its integration with Ant, via &lt;a href="http://groovy.codehaus.org/api/groovy/util/AntBuilder.html"&gt;AntBuilder&lt;/a&gt;. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://groovy.codehaus.org/Gant"&gt;Gant&lt;/a&gt; (shorthand for Groovy plus Ant) is a build tool and Groovy module. It is used for scripting Ant tasks using Groovy instead of XML to specify the build logic. A Gant build specification is just a Groovy script and so -- to quote Gant author Russel Winder -- can deliver &amp;quot;all the power of Groovy to bear directly, something not possible with Ant scripts.&amp;quot; While it might be considered a competitor to Ant, Gant relies on Ant tasks to actually do things. Really it is an alternative way of doing builds using Ant, but using a programming language, instead of XML, to specify the build rules. Consider using Gant if your Ant XML file is becoming too complex, or if you need the features and control structures of a scripting language that cannot be easily expressed using the Ant syntax. &lt;/p&gt;  &lt;h4&gt;What you see is what you get -- toolset contents and prerequisites&lt;/h4&gt;  &lt;p&gt;All the code above for the Groovy and Gant Toolset has been tested on a Windows XP and Windows 2003 Server OS with Java 5 and Java 6 using Eclipse 3.2.2 . In order to play with the toolset in its entirety, you will need to &lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;install Java 6&lt;/a&gt;, &lt;a href="http://ws.apache.org/axis2/"&gt;Axis2-1.3&lt;/a&gt;, &lt;a href="http://xfire.codehaus.org/"&gt;XFire-1.2.6&lt;/a&gt;, &lt;a href="http://incubator.apache.org/cxf/"&gt;CXF-2.0.2&lt;/a&gt;, &lt;a href="http://groovy.codehaus.org/"&gt;Groovy-1.0&lt;/a&gt;, and &lt;a href="http://groovy.codehaus.org/Gant"&gt;Gant-0.3.1&lt;/a&gt;. But you can configure the toolset using a normal property file and exclude WSDL checks for frameworks you are not interested in, including Java 6's &lt;code&gt;wsimport&lt;/code&gt;. &lt;/p&gt;  &lt;p&gt;Installing the frameworks is simple: just extract their corresponding archive files. I assume you have either Java 5 or Java 6 running on your machine. You can use the Java 6 &lt;code&gt;wsimport&lt;/code&gt; WSDL checker even with Java 5; you just need Java 6's &lt;code&gt;rt.jar&lt;/code&gt; and &lt;code&gt;tools.jar&lt;/code&gt; as an add-on in a directory of your choice. Installing Groovy and Gant usually takes a matter of minutes. If you follow my advice of placing Groovy add-ons -- including the &lt;code&gt;gant-0.3.1.jar&lt;/code&gt; file -- in your &lt;code&gt;&amp;lt;user.home&amp;gt;/.groovy/lib&lt;/code&gt; directory you do not even have to touch your original Groovy installation. &lt;/p&gt;  &lt;p&gt;After the installation steps, you have to keep in mind the following &lt;a href="http://www.javaworld.com/javaworld/jw-11-2007/WebServiceClient.zip"&gt;artifacts&lt;/a&gt; that have been used or modified accordingly for my environment: &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;code&gt;build.gant&lt;/code&gt; is the Gant script that contains Gant targets with Groovy syntax. &lt;/li&gt;    &lt;li&gt;&lt;code&gt;build.properties&lt;/code&gt; is needed to customize the Gant script and the Groovy WSDL checker. &lt;/li&gt;    &lt;li&gt;A set of jar files (including the Gant module) to be placed in your &lt;code&gt;&amp;lt;user.home&amp;gt;/.groovy/lib&lt;/code&gt; directory to enrich Groovy for the toolset. &lt;/li&gt;    &lt;li&gt;An Eclipse Java project called JavaParser that is used to scan the generated Axis2 stub in order to modify it for use with HTTPS, chunking, &lt;i&gt;etc&lt;/i&gt;. Two &lt;code&gt;SSLProtocolFactory&lt;/code&gt; classes are included with this distribution for use with Axis2 and Java 6 (or &lt;code&gt;ksoap2&lt;/code&gt;). They will be helpful when it comes to cipher suite handling. &lt;/li&gt;    &lt;li&gt;An Eclipse Groovy project called WSDL-Checker that contains Groovy classes that check WSDL files by calling Web service framework code generators and analyzing the output files. WSDL-Checker also validates WSDL files using the CXF validator tool (if you have CXF installed and enabled). This project was created using the &lt;a href="http://groovy.codehaus.org/Eclipse+Plugin"&gt;Eclipse-Groovy-Plugin&lt;/a&gt;. &lt;/li&gt;    &lt;li&gt;A small Ant script that demonstrates how to call the Groovy WSDL checker from Ant as well as how to handle the checker's response. &lt;/li&gt;    &lt;li&gt;A directory with sample WSDL files. &lt;/li&gt;    &lt;li&gt;An Eclipse project to call a public Web service (GlobalWeather) provided as a JUnit test; it takes a generated Axis2 stub that has been modified by JavaParser (one JUnit test with Axis2 data binding &amp;quot;&lt;code&gt;adb&lt;/code&gt;&amp;quot; and one with &amp;quot;&lt;code&gt;xmlbeans&lt;/code&gt;&amp;quot;). &lt;/li&gt;    &lt;li&gt;An Eclipse workspace preferences file (&lt;code&gt;Groovy_Gant.epf&lt;/code&gt;) to assist in setting all the needed Eclipse classpath variables and user libraries. &lt;/li&gt;    &lt;li&gt;Two Groovy scripts that call public Web services by means of the Groovy SOAP extension -- just so you can see what Groovy has to offer in this area &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Once you've set up your environment you'll be ready to begin familiarizing yourself with the Groovy and Gant Toolset. For those who need it, here is a quick primer on the client side of Web services, which you will need to understand in order to follow the discussion in the remainder of the article. &lt;/p&gt;  &lt;h2&gt;The client side of Web services&lt;/h2&gt;  &lt;p&gt;A WSDL file incorporates all the information that is needed to create a Web service client. In order to create the client, a Web service framework's code generator reads the WSDL file. Based on the definitions found in the WSDL file it creates a Java stub or proxy class that mimics the interface of the Web service. Depending on the switches, this stub code can become very large and include all the referenced data types as inner classes. A better option is to let the generator create a couple of classes in different packages that will be the basis for javadoc generation later on. All the resulting classes are Java source code that you can study. Nevertheless, it is generated code, and as such it has its own &amp;quot;look.&amp;quot; &lt;/p&gt;  &lt;p&gt;For functional and performance testing it might be necessary to modify the client stub. This is especially true when it comes to using HTTPS, instead of HTTP, to control the client-side debug level via a parameter (instead of using an XML config file), or to deal with HTTP chunking. (HTTP 1.1 supports chunked encoding, which allows HTTP messages to be broken up into several parts. Chunking is most often used by the server for responses, but clients can also chunk large requests.) &lt;/p&gt;  &lt;p&gt;Particularly during testing, you may decide to just say &amp;quot;OK&amp;quot; to all self-signed SSL certificates. Therefore, when using HTTPS, you could need a specific SSL Socket Factory that allows for accepting all certificates in test mode. For performance tests, you might even want to control the number of opened connections, and you will want to re-use the same connection for different calls coming from the same client. This article is accompanied by a Java 5 parser and an Axis2 client stub modifier to deal with such scenarios. &lt;/p&gt;  &lt;p&gt;Because you will get the parser/modifier as source code, you can customize it to &amp;quot;inject&amp;quot; some code for features not covered by my solution. What's more, you can use the whole code as a blueprint to write your own modifier for frameworks other than Axis2. &lt;/p&gt;  &lt;h2&gt;Gant targets for WSDL processing&lt;/h2&gt;  &lt;p&gt;A Gant script -- &lt;code&gt;build.gant&lt;/code&gt; -- is the basis for all the features of the Groovy and Gant Toolset. Every task a user can perform is expressed as a Gant target. Using the directory that contains &lt;code&gt;build.gant&lt;/code&gt; as your working dir, you can get an overview of all the supported targets, together with a description, by typing &lt;code&gt;gant&lt;/code&gt; or &lt;code&gt;gant -T&lt;/code&gt; in your command shell. The &lt;code&gt;gant&lt;/code&gt; command refers to the &amp;quot;default&amp;quot; target you can implement, the &lt;code&gt;gant -T&lt;/code&gt; feature (&lt;i&gt;t&lt;/i&gt; stands for &amp;quot;table of contents&amp;quot;) comes for free as part of the Gant implementation. &lt;/p&gt;  &lt;h6&gt;Listing 1. Calling Gant from the command line&lt;/h6&gt;  &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;   &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;     &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &amp;gt;gant&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;         USAGE:&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;         gant available (checks your build.properties settings &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; available frameworks)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;         gant wsdls (prints all wsdl files with their target endpoints, together with wsdl file &lt;span style="color: #006080"&gt;'shortnames'&lt;/span&gt; to be used by other targets regex)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;         gant [-D &lt;span style="color: #006080"&gt;&amp;quot;wsdl=&amp;lt;wsdl_shortname_regex&amp;gt;&amp;quot;&lt;/span&gt;] javagen (generate Axis2 based Java code from wsdl, compile, provide javadoc, and generate necessary jar/zip files)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;         gant [-D &lt;span style="color: #006080"&gt;&amp;quot;wsdl=&amp;lt;wsdl_shortname_regex&amp;gt;&amp;quot;&lt;/span&gt;] check (check one or more wsdl files &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; compatibility with installed code generators &amp;amp; validator)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;         gant [-D &lt;span style="color: #006080"&gt;&amp;quot;wsdl=&amp;lt;wsdl_shortname_regex&amp;gt;&amp;quot;&lt;/span&gt;] validate (validate one or more wsdls files &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; the CXF validator tool (&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; CXF &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; installed))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;         gant [-D collect] alljars (generates a directory with all Axis2 client jars, src/javadoc-ZIPs, and xsb resource files &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; xmlbeans &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; used)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;         gant -D &lt;span style="color: #006080"&gt;&amp;quot;wsdl=&amp;lt;wsdl_shortname_regex&amp;gt;&amp;quot;&lt;/span&gt; [-D &lt;span style="color: #006080"&gt;&amp;quot;replace=&amp;lt;old&amp;gt;,&amp;lt;new&amp;gt;&amp;quot;&lt;/span&gt;] ns2p (prints a &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;-to-package mapping &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; a wsdl file)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;         Produced listings &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; your &lt;span style="color: #006080"&gt;'results'&lt;/span&gt; directory:&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;                 output-&amp;lt;tool&amp;gt;.txt &amp;amp; error-&amp;lt;tool&amp;gt;.txt with infos/errors/warnings &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; the code generation&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The following commands are available as features of the Groovy and Gant Toolset:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;gant available&lt;/code&gt; examines your &lt;code&gt;build.properties&lt;/code&gt; file for available and enabled frameworks &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;gant wsdls&lt;/code&gt; examines the wsdl directory and produces a sorted list of all available WSDL files together with a &amp;quot;short name&amp;quot; for every service to be used by other commands, as well as the target endpoint(s) for the service. (This command delivers an output, as shown in Listing 2.) &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;gant [-D &amp;quot;wsdl=&amp;lt;regex&amp;gt;&amp;quot;] check&lt;/code&gt; uses the code generators configured by &lt;code&gt;build.properties&lt;/code&gt; to check all WSDL files, or a regular-expression matching subset of all WSDL files, and produces a summary of error/warning messages. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;gant [-D &amp;quot;wsdl=&amp;lt;regex&amp;gt;&amp;quot;] validate&lt;/code&gt; is the same as &amp;quot;&lt;code&gt;check&lt;/code&gt; but instead of the code generators only the CXF validator tool is used (if CXF is installed). It can check the WSDL file's conformance to the WSDL and SOAP schema as well as look at some &lt;a href="http://www.ws-i.org/deliverables/workinggroup.aspx?wg=basicprofile"&gt;WS-I Basic Profile&lt;/a&gt; recommendations. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;gant [-D &amp;quot;wsdl=&amp;lt;regex&amp;gt;&amp;quot;] javagen&lt;/code&gt; generates Axis2 source code for all WSDL files, or a regular-expression matching subset thereof. It then modifies the client stub, compiles all the code, and generates javadoc information, and a jar file with the compiled bytecode. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;gant [-D collect] alljars&lt;/code&gt; generates a directory containing the &lt;code&gt;bytecode-jars/src-zip&lt;/code&gt;, and &lt;code&gt;javadoc-zip&lt;/code&gt; archives for all WSDL files. If the &lt;code&gt;collect&lt;/code&gt; option is specified it will not call &lt;code&gt;javagen&lt;/code&gt; for every WSDL file, and will only copy jars and ZIPs to the directory defined in &lt;code&gt;build.properties&lt;/code&gt;. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;gant -D &amp;quot;wsdl=&amp;lt;regex&amp;gt;&amp;quot; [-D &amp;quot;replace=&amp;lt;old&amp;gt;,&amp;lt;new&amp;gt;&amp;quot;] ns2p&lt;/code&gt; examines a WSDL file and prints a namespace-to-package mapping, using the replacement you provide with the optional &amp;quot;replace&amp;quot; parameter This feature is useful if - for test purpose - you need access to application APIs that have no SOAP interface but only a business delegate (known from the Core J2EE Patterns). But -- unfortunately -- these delegates will require other delegate jar files that contain classes with just &lt;i&gt;the same package names&lt;/i&gt; as you provide by your WSDL-based Axis2 generated code. Therefore, I did improve the Axis2 code generators package creation in order to assist you in generating &amp;quot;unique&amp;quot; package names for your SOAP parts that will not conflict with business delegate classes in your Eclipse project's classpath. In other words: you can even mix business delegate service calls and SOAP-based service calls &lt;i&gt;in the same&lt;/i&gt; Eclipse project. A sample output would look like this: &lt;br /&gt;&lt;br /&gt;    &lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;&lt;br /&gt;      &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &amp;gt;gant -D &lt;span style="color: #006080"&gt;&amp;quot;wsdl=Logon&amp;quot;&lt;/span&gt; -D &lt;span style="color: #006080"&gt;&amp;quot;replace=myProject,myProject_soap&amp;quot;&lt;/span&gt; ns2p&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;     ---&amp;gt; Provided regex matched &lt;span style="color: #006080"&gt;'Logon'&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; the following replacement: myProject=myProject_soap&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     checking G:/JavaWorld/Groovy_Gant/wsdl/security/webservice/svc-logon/wsdl/Logon.wsdl&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;     http\:&lt;span style="color: #008000"&gt;//myProject.myCompany.com/runtime=com.myCompany.myProject_soap.runtime&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;     http\:&lt;span style="color: #008000"&gt;//myProject.myCompany.com/logon=com.myCompany.myProject_soap.logon&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;     http\:&lt;span style="color: #008000"&gt;//myProject.myCompany.com/remoting/soap/types/headerelements=com.myCompany.myProject_soap.remoting.soap.types.headerelements&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;        &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;     http\://myProject.myCompany.com/logon/generated/interf=com.myCompany.myProject_soap.logon.generated.interf&lt;/pre&gt;&lt;br /&gt;      &lt;/div&gt;&lt;br /&gt;    &lt;/div&gt;&lt;br /&gt;&lt;br /&gt;    &lt;p&gt;Copy this output in a file &amp;quot;ns2p.properties&amp;quot; and save it in the same directory where &amp;quot;Logon.wsdl&amp;quot; is located. Then the &lt;code&gt;javagen&lt;/code&gt; command will take care of this mapping when generating your Axis2 client stub for the &amp;quot;Logon&amp;quot; service. &lt;/p&gt;&lt;br /&gt;  &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;All Gant targets are available as commands for the user and can be combined like so:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;gant -D &amp;quot;wsdl=GlobalW.+&amp;quot; -D collect javagen alljars&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h6&gt;Listing 2. Sample output from the 'gant wsdls' command&lt;/h6&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;&lt;br /&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; G:\JavaWorld\Groovy_Gant&amp;gt;gant wsdls&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; list all wsdls&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt; AWSECommerceService [amazon/webservice/AWSECommerceService/wsdl/AWSECommerceService.wsdl]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;         [&amp;lt;soap:address location=&lt;span style="color: #006080"&gt;&amp;quot;http://soap.amazon.com/onca/soap?Service=AWSECommerceService&amp;quot;&lt;/span&gt;/&amp;gt;]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt; AddNumbers [handlers/webservice/svc-addNumber/wsdl/AddNumbers.wsdl]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;         [&amp;lt;soap:address location=&lt;span style="color: #006080"&gt;&amp;quot;http://localhost:9000/handlers/AddNumbersService/AddNumbersPort&amp;quot;&lt;/span&gt; /&amp;gt;]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt; Callback [callback/webservice/svc-callback/wsdl/Callback.wsdl]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;         [&amp;lt;soap:address location=&lt;span style="color: #006080"&gt;&amp;quot;http://localhost:9005/CallbackContext/CallbackPort&amp;quot;&lt;/span&gt;/&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;         &amp;lt;soap:address location=&lt;span style="color: #006080"&gt;&amp;quot;http://localhost:9000/SoapContext/SoapPort&amp;quot;&lt;/span&gt;/&amp;gt;]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt; CurrencyConverter [&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;-services/webservice/svc-lookup/wsdl/CurrencyConverter.wsdl]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt;         [&amp;lt;soap:address location=&lt;span style="color: #006080"&gt;&amp;quot;http://glkev.webs.innerhost.com/glkev_ws/Currencyws.asmx&amp;quot;&lt;/span&gt; /&amp;gt;]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt; GlobalWeather [&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;-services/webservice/svc-lookup/wsdl/GlobalWeather.wsdl]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt;         [&amp;lt;soap:address location=&lt;span style="color: #006080"&gt;&amp;quot;http://www.webservicex.net/globalweather.asmx&amp;quot;&lt;/span&gt; /&amp;gt;]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  19:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  20:&lt;/span&gt; HelloWorld [hello-world/webservice/svc-hello-world/HelloWorld.wsdl]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  21:&lt;/span&gt;         [&amp;lt;soap:address location=&lt;span style="color: #006080"&gt;&amp;quot;https://localhost:9001/SoapContext/SoapPort&amp;quot;&lt;/span&gt;/&amp;gt;]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  22:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  23:&lt;/span&gt; JMSGreeterService [jms-greeter/webservice/svc-greeter/wsdl/JMSGreeterService.wsdl]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  24:&lt;/span&gt;         []&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  25:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  26:&lt;/span&gt; Logon [security/webservice/svc-logon/wsdl/Logon.wsdl]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  27:&lt;/span&gt;         [&amp;lt;soap:address location=&lt;span style="color: #006080"&gt;&amp;quot;http://localhost:4708/com/myCompany/myProject/logon/generated/interf/Logon&amp;quot;&lt;/span&gt;/&amp;gt;]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  28:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  29:&lt;/span&gt; YellowPages [&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;-services/webservice/svc-lookup/wsdl/YellowPages.wsdl]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  30:&lt;/span&gt;         [&amp;lt;soap:address location=&lt;span style="color: #006080"&gt;&amp;quot;http://ws.soatrader.com/delimiterbob.com/0.1/YellowPages&amp;quot;&lt;/span&gt;/&amp;gt;]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  31:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  32:&lt;/span&gt; G:\JavaWorld\Groovy_Gant&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  33:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Gant configuration using build.properties&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Like an Ant file, the Gant execution is configured by a property file called &lt;code&gt;build.properties&lt;/code&gt; which resides in the same directory as &lt;code&gt;build.gant&lt;/code&gt;, as shown in Listing 3. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h6&gt;Listing 3. Gant configuration using build.properties&lt;/h6&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;&lt;br /&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; # Property file to customize the Gant script &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; WSDL processing.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt; # Tell Gant which WSDL checker you have installed&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt; axis.available=yes&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt; xfire.available=yes&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt; cxf.available=yes&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt; wsimport.available=yes&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt; # Axis2 information&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt; axis2.install.dir=./ThirdPartyTools/axis2-1.3&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt; axis2.lib.dir=${axis2.install.dir}/lib&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt; axis2.version=1.3&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  19:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  20:&lt;/span&gt; # XFire information&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  21:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  22:&lt;/span&gt; xfire.install.dir=./ThirdPartyTools/xfire-1.2.6&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  23:&lt;/span&gt; xfire.lib.dir=${xfire.install.dir}/lib&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  24:&lt;/span&gt; xfire.version=1.2.6&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  25:&lt;/span&gt; ant.jar=./ThirdPartyTools/groovy-1.0/lib/ant-1.6.5.jar&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  26:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  27:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  28:&lt;/span&gt; # CXF information&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  29:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  30:&lt;/span&gt; cxf.install.dir=./ThirdPartyTools/apache-cxf-2.0.2-incubator&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  31:&lt;/span&gt; cxf.lib.dir=${cxf.install.dir}/lib&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  32:&lt;/span&gt; cxf.version=2.0.2&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  33:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  34:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  35:&lt;/span&gt; # Java6 information (only necessary &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; you are running Java5)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  36:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  37:&lt;/span&gt; java6.lib.dir=./ThirdPartyTools/Java6/lib&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  38:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  39:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  40:&lt;/span&gt; # Java parser  information&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  41:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  42:&lt;/span&gt; java-parser.install.dir=./JavaParser&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  43:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  44:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  45:&lt;/span&gt; # Code generation information&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  46:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  47:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  48:&lt;/span&gt; wsdl.root.dir=./wsdl&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  49:&lt;/span&gt; stubs.package.prefix=com.mycompany.myproject_axis&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  50:&lt;/span&gt; # &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; &lt;span style="color: #006080"&gt;'namespace-to-package replacement'&lt;/span&gt; &lt;span style="color: #0000ff"&gt;is&lt;/span&gt; enabled,&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  51:&lt;/span&gt; # we &lt;span style="color: #0000ff"&gt;try&lt;/span&gt; to provide a suitable mapping &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; Axis2&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  52:&lt;/span&gt; # but - consider &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; an alternative - &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; a &lt;span style="color: #006080"&gt;'ns2p.properties'&lt;/span&gt; file per wsdl file&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  53:&lt;/span&gt; # with the &lt;span style="color: #006080"&gt;'gant ns2p'&lt;/span&gt; command output &lt;span style="color: #0000ff"&gt;as&lt;/span&gt; a basis&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  54:&lt;/span&gt; ns2p.replace=no&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  55:&lt;/span&gt; ns2p.&lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;=myproject.mycompany.com&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  56:&lt;/span&gt; ns2p.package=com.mycompany.myproject_axis&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  57:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  58:&lt;/span&gt; # Axis2 data binding= adb|xmlbeans&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  59:&lt;/span&gt; axis.data.binding=adb&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  60:&lt;/span&gt; output.axis.file=./results/output-axis.txt&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  61:&lt;/span&gt; error.axis.file=./results/error-axis.txt&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  62:&lt;/span&gt; output.axis.codeGenerator=./GeneratedCode_axis&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  63:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  64:&lt;/span&gt; output.xfire.file=./results/output-xfire.txt&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  65:&lt;/span&gt; error.xfire.file=./results/error-xfire.txt&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  66:&lt;/span&gt; output.xfire.codeGenerator=./GeneratedCode_xfire&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  67:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  68:&lt;/span&gt; output.cxf.file=./results/output-cxf.txt&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  69:&lt;/span&gt; error.cxf.file=./results/error-cxf.txt&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  70:&lt;/span&gt; output.cxf.codeGenerator=./GeneratedCode_cxf&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  71:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  72:&lt;/span&gt; output.wsimport.file=./results/output-wsimport.txt&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  73:&lt;/span&gt; error.wsimport.file=./results/error-wsimport.txt&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  74:&lt;/span&gt; output.wsimport.codeGenerator=./GeneratedCode_wsimport&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  75:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  76:&lt;/span&gt; output.validator.file=./results/output-validator.txt&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  77:&lt;/span&gt; error.validator.file=./results/error-validator.txt&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  78:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  79:&lt;/span&gt; generated.code.dir=./GeneratedCode&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  80:&lt;/span&gt; client.jar.dir=./ClientJarFiles&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  81:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  82:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  83:&lt;/span&gt; # Javadoc information&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  84:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  85:&lt;/span&gt; javadoc.enabled=yes&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  86:&lt;/span&gt; javadoc.packageNames=com.*,tools.*,org.*,net.*&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  87:&lt;/span&gt; project.copyright=Copyright © 2007 - Mycompany.com&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  88:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  89:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  90:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  91:&lt;/span&gt; # Optional proxy information&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  92:&lt;/span&gt; # ------------------------------------------------------------------------------&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  93:&lt;/span&gt; proxy.enabled=no&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  94:&lt;/span&gt; proxy.host=myProxyHost&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  95:&lt;/span&gt; proxy.port=81&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Expressing dependencies&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;With Gant you can express dependencies as you would do with Ant, and you can call all available Ant tasks that are provided by Groovy's &lt;code&gt;ant-1.6.5jar&lt;/code&gt; (found in the &lt;code&gt;&amp;lt;GROOVY_HOME&amp;gt;/lib&lt;/code&gt; directory). You do not have to create a Groovy AntBuilder for this purpose because Gant does it for you. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Looking at the &lt;code&gt;build.gant&lt;/code&gt; script excerpts in Listing 4, you can see that a Gant script is really a Groovy script. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h6&gt;Listing 4. Gant script (excerpt from build.gant)&lt;/h6&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;&lt;br /&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; import org.apache.commons.lang.StringUtils&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     ...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;     boolean wsdlRegexProvided = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;     boolean wsdlRegexOK = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;     def wsdlFilesMatchingRegexList = []&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;     def readProperties() {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;         Ant.property(file: &lt;span style="color: #006080"&gt;'build.properties'&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;         def props = Ant.project.properties&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; props;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;     }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;     def antProperty = readProperties()&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;long&lt;/span&gt; startTime = System.currentTimeMillis()&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt;     &lt;span style="color: #008000"&gt;// Classpath for Java code generation tool&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt;     def java2wsdl_classpath = Ant.path {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  19:&lt;/span&gt;         fileset(dir: antProperty.&lt;span style="color: #006080"&gt;'axis2.lib.dir'&lt;/span&gt;) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  20:&lt;/span&gt;             include(name: &lt;span style="color: #006080"&gt;'*.jar'&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  21:&lt;/span&gt;         }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  22:&lt;/span&gt;     }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  23:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  24:&lt;/span&gt;     def generateJavaCode = { wsdlFile, javaSrcDir -&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  25:&lt;/span&gt;         def ns2pValues = &lt;span style="color: #006080"&gt;''&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  26:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (antProperty.&lt;span style="color: #006080"&gt;'ns2p.replace'&lt;/span&gt;.equals(&lt;span style="color: #006080"&gt;&amp;quot;yes&amp;quot;&lt;/span&gt;)) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  27:&lt;/span&gt;             &lt;span style="color: #008000"&gt;//TODO: consider replacing regex by XmlSlurper&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  28:&lt;/span&gt;             def pattern  = /^.*(?:targetNamespace=&lt;span style="color: #006080"&gt;&amp;quot;)([^&amp;quot;&lt;/span&gt;]+)&lt;span style="color: #006080"&gt;&amp;quot;/&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  29:&lt;/span&gt;             def matcher = pattern.matcher('')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  30:&lt;/span&gt;             def ns2pMap = [:]&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  31:&lt;/span&gt;             new File(wsdlFile).eachLine {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  32:&lt;/span&gt;                 matcher.reset(it)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  33:&lt;/span&gt;                 while (matcher.find()) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  34:&lt;/span&gt;                     String namespace = matcher.group(1)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  35:&lt;/span&gt;                     if (!ns2pMap.containsKey(namespace)) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  36:&lt;/span&gt;                         ns2pMap.put(namespace, (namespace-'http://').replace('/', '.').replaceAll(antProperty.'ns2p.namespace',antProperty.'ns2p.package'))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  37:&lt;/span&gt;                     }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  38:&lt;/span&gt;                 }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  39:&lt;/span&gt;             }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  40:&lt;/span&gt;             Iterator iter = ns2pMap.keySet().iterator();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  41:&lt;/span&gt;             StringBuilder sbuf = new StringBuilder(256)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  42:&lt;/span&gt;             while (iter.hasNext()) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  43:&lt;/span&gt;                 String key = iter.next();&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  44:&lt;/span&gt;                 String value = ns2pMap.get(key)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  45:&lt;/span&gt;                 sbuf.append(key)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  46:&lt;/span&gt;                 sbuf.append('=')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  47:&lt;/span&gt;                 sbuf.append(value)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  48:&lt;/span&gt;                 sbuf.append(',')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  49:&lt;/span&gt;             }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  50:&lt;/span&gt;             if (sbuf.length() &amp;gt; 0) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  51:&lt;/span&gt;                 ns2pValues = sbuf.replace(sbuf.length()-1, sbuf.length(), '').toString()&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  52:&lt;/span&gt;             }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  53:&lt;/span&gt;             else {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  54:&lt;/span&gt;                 println 'No namespace-to-package replacement possible: nothing matched'&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  55:&lt;/span&gt;             }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  56:&lt;/span&gt;         }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  57:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  58:&lt;/span&gt;         def wsdlFileDir = StringUtils.substringBeforeLast(wsdlFile, '/')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  59:&lt;/span&gt;         def stubPackageSuffix = (wsdlFile - wsdlFileDir - '/' - '.wsdl').toLowerCase() + '.soap.stubs'&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  60:&lt;/span&gt;         def outputDir = javaSrcDir-'/src' // Axis2 will generate a /src dir for us&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  61:&lt;/span&gt;         def outFile = new File(&amp;quot;&lt;/span&gt;${antProperty.&lt;span style="color: #006080"&gt;'error.axis.file'&lt;/span&gt;}&lt;span style="color: #006080"&gt;&amp;quot;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  62:&lt;/span&gt;         outFile &amp;lt;&amp;lt; wsdlFile + NL&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  63:&lt;/span&gt;         Ant.java(classname: 'org.apache.axis2.wsdl.WSDL2Java',&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  64:&lt;/span&gt;             classpath: java2wsdl_classpath,&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  65:&lt;/span&gt;             fork: true,&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  66:&lt;/span&gt;             output: &amp;quot;&lt;/span&gt;${antProperty.&lt;span style="color: #006080"&gt;'output.axis.file'&lt;/span&gt;}&lt;span style="color: #006080"&gt;&amp;quot;,&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  67:&lt;/span&gt;             error: &amp;quot;&lt;/span&gt;${antProperty.&lt;span style="color: #006080"&gt;'error.axis.file'&lt;/span&gt;}&lt;span style="color: #006080"&gt;&amp;quot;,&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  68:&lt;/span&gt;             append: &amp;quot;&lt;/span&gt;yes&lt;span style="color: #006080"&gt;&amp;quot;,&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  69:&lt;/span&gt;             resultproperty: &amp;quot;&lt;/span&gt;taskResult_$wsdlFile&lt;span style="color: #006080"&gt;&amp;quot;) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  70:&lt;/span&gt;                 if (antProperty.'proxy.enabled'.equals(&amp;quot;&lt;/span&gt;yes&lt;span style="color: #006080"&gt;&amp;quot;)) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  71:&lt;/span&gt;                     println &amp;quot;&lt;/span&gt;Using proxy ${antProperty.&lt;span style="color: #006080"&gt;'proxy.host'&lt;/span&gt;}:${antProperty.&lt;span style="color: #006080"&gt;'proxy.port'&lt;/span&gt;}&lt;span style="color: #006080"&gt;&amp;quot;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  72:&lt;/span&gt;                     jvmarg (value: &amp;quot;&lt;/span&gt;-Dhttp.proxyHost=${antProperty.&lt;span style="color: #006080"&gt;'proxyhost'&lt;/span&gt;}&lt;span style="color: #006080"&gt;&amp;quot;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  73:&lt;/span&gt;                     jvmarg (value: &amp;quot;&lt;/span&gt;-Dhttp.proxyPort=${antProperty.&lt;span style="color: #006080"&gt;'proxyport'&lt;/span&gt;}&lt;span style="color: #006080"&gt;&amp;quot;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  74:&lt;/span&gt;                 }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  75:&lt;/span&gt;                 arg (value: '-uri')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  76:&lt;/span&gt;                 arg (value: wsdlFile)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  77:&lt;/span&gt;                 arg (value: '-d')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  78:&lt;/span&gt;                 arg (value: &amp;quot;&lt;/span&gt;${antProperty.&lt;span style="color: #006080"&gt;'axis.data.binding'&lt;/span&gt;}&lt;span style="color: #006080"&gt;&amp;quot;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  79:&lt;/span&gt;                 arg (value: '-o')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  80:&lt;/span&gt;                 arg (value: outputDir)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  81:&lt;/span&gt;                 arg (value: '-p')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  82:&lt;/span&gt;                 arg (value: &amp;quot;&lt;/span&gt;${antProperty.&lt;span style="color: #006080"&gt;'stubs.package.prefix'&lt;/span&gt;}.$stubPackageSuffix&lt;span style="color: #006080"&gt;&amp;quot;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  83:&lt;/span&gt;                 arg (value: '-u')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  84:&lt;/span&gt;                 arg (value: '-s')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  85:&lt;/span&gt;                 if (new File(&amp;quot;&lt;/span&gt;$wsdlFileDir/ns2p.properties&lt;span style="color: #006080"&gt;&amp;quot;).exists()) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  86:&lt;/span&gt;                     println 'using provided namespace-to-package mapping per wsdl file'&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  87:&lt;/span&gt;                     arg (value: '-ns2p')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  88:&lt;/span&gt;                     arg (value: &amp;quot;&lt;/span&gt;$wsdlFileDir/ns2p.properties&lt;span style="color: #006080"&gt;&amp;quot;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  89:&lt;/span&gt;                 }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  90:&lt;/span&gt;                 else if (antProperty.'ns2p.replace'.equals(&amp;quot;&lt;/span&gt;yes&lt;span style="color: #006080"&gt;&amp;quot;)) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  91:&lt;/span&gt;                     println 'using provided namespace-to-package mapping for ALL wsdl files that should be processed'&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  92:&lt;/span&gt;                     arg (value: '-ns2p')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  93:&lt;/span&gt;                     arg (value: ns2pValues)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  94:&lt;/span&gt;                 }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  95:&lt;/span&gt;                 arg (value: '-t')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  96:&lt;/span&gt;         }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  97:&lt;/span&gt;         print &amp;quot;&lt;/span&gt;$wsdlFile &lt;span style="color: #006080"&gt;&amp;quot;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  98:&lt;/span&gt;         if (Ant.project.properties.&amp;quot;&lt;/span&gt;taskResult_$wsdlFile&amp;quot; != &lt;span style="color: #006080"&gt;'0'&lt;/span&gt;) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  99:&lt;/span&gt;             println &lt;span style="color: #006080"&gt;'... ERROR'&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 100:&lt;/span&gt;         }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 101:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;else&lt;/span&gt; {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 102:&lt;/span&gt;             println &lt;span style="color: #006080"&gt;'... OK'&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 103:&lt;/span&gt;         }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 104:&lt;/span&gt;     }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt; 105:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h5&gt;&lt;em&gt;Gant specialities&lt;/em&gt;&lt;/h5&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;You'll note that Gant targets are Groovy closures. Inside closures you can define new closures and assign them to variables, but you are not allowed to declare a method. So, the following is allowed: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;target ( ) {&lt;br /&gt;    def Y = { }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;But this isn't:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;target ( ) {&lt;br /&gt;    def Y ( ) { }&lt;br /&gt;}&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Gant has two other characteristic features. First, every target has a name and a description, for instance&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;target (alljars: 'generate a directory with all client jar/src/doc/res archives') {&lt;br /&gt;   depends(javagen)&lt;br /&gt;   println alljars_description&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To access this description string, you can use the variable &amp;quot;&lt;code&gt;&amp;lt;target-name&amp;gt;_description&lt;/code&gt;&amp;quot;, which is created by Gant for your convenience. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Second, if you want to hand over a WSDL regular expression &amp;quot;property&amp;quot; specified in the command line to the &lt;code&gt;build.gant&lt;/code&gt; script, you can use the &lt;code&gt;-D &amp;quot;wsdl=&amp;lt;regex&amp;gt;&amp;quot;&lt;/code&gt; idiom. The syntax is similar to that used for Java VM command-line property setting: &lt;code&gt;java -Dproperty=value&lt;/code&gt;, but &lt;i&gt;on Windows&lt;/i&gt; you really need the space after &amp;quot;&lt;code&gt;-D&lt;/code&gt;&amp;quot;, because Gant uses the Apache Commons CLI library. You can access this property in your Gant script by using the following &amp;quot;try/catch&amp;quot; trick (demonstrated for the property &lt;code&gt;wsdl&lt;/code&gt;) that is evaluated in the &lt;code&gt;init&lt;/code&gt; target: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;&lt;br /&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; target (init: &lt;span style="color: #006080"&gt;'check wsdl regex match'&lt;/span&gt;) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;try&lt;/span&gt; {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;             &lt;span style="color: #008000"&gt;// referencing 'wsdl' in this try block checks for the existence of this variable&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;             &lt;span style="color: #008000"&gt;// if you call Gant with '&amp;gt;gant -D &amp;quot;wsdl=&amp;lt;wsdl_target'&amp;gt;&amp;quot; then the variable 'wsdl'&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;             &lt;span style="color: #008000"&gt;// will be created by Gant for you, otherwise the catch block will be executed&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;             def wsdlRootDir = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; File(antProperty.&lt;span style="color: #006080"&gt;'wsdl.root.dir'&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;             def wsdlList = []&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;             boolean atLeastOneMatchingWsdlFileFound = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;             wsdlRootDir.eachFileRecurse{&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;if&lt;/span&gt; (it.isFile() &amp;amp;&amp;amp; it.name.endsWith(&lt;span style="color: #006080"&gt;'.wsdl'&lt;/span&gt;)) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;                     def wsdlFile = it.canonicalPath.replace(&lt;span style="color: #006080"&gt;'\\', '&lt;/span&gt;/&lt;span style="color: #006080"&gt;')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;                     def startIndex = wsdlFile.indexOf('&lt;/span&gt;/wsdl&lt;span style="color: #006080"&gt;') + 1&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;                     def endIndex = wsdlFile.lastIndexOf('&lt;/span&gt;.&lt;span style="color: #006080"&gt;')&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;                     def shortname = StringUtils.substringAfterLast(wsdlFile, '&lt;/span&gt;/&lt;span style="color: #006080"&gt;')-'&lt;/span&gt;.wsdl&lt;span style="color: #006080"&gt;'&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt;                     if (shortname == wsdl) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt;                         println &amp;quot;---&amp;gt; Provided regex matched '&lt;/span&gt;$shortname&lt;span style="color: #006080"&gt;'&amp;quot;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt;                         wsdlFilesMatchingRegexList &amp;lt;&amp;lt; wsdlFile&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt;                         atLeastOneMatchingWsdlFileFound = true&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  19:&lt;/span&gt;                         return;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  20:&lt;/span&gt;                     }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  21:&lt;/span&gt;                 }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  22:&lt;/span&gt;             }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  23:&lt;/span&gt;             wsdlRegexProvided = true&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  24:&lt;/span&gt;             if (atLeastOneMatchingWsdlFileFound) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  25:&lt;/span&gt;                 wsdlRegexOK = true&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  26:&lt;/span&gt;             }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  27:&lt;/span&gt;             else {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  28:&lt;/span&gt;                 println &amp;quot;\tWarning: No wsdl file found that matches regex pattern '&lt;/span&gt;$wsdl'!&amp;quot;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  29:&lt;/span&gt;                 wsdlRegexOK = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  30:&lt;/span&gt;             }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  31:&lt;/span&gt;         }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  32:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt; (Exception e) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  33:&lt;/span&gt;             &lt;span style="color: #008000"&gt;// no regex evaulation necessary&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  34:&lt;/span&gt;         }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  35:&lt;/span&gt;     }&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;In &lt;code&gt;build.gant&lt;/code&gt; Groovy's syntax is used to handle &lt;code&gt;foreach&lt;/code&gt; loops, proxy usage, and regular expressions to narrow the WSDL processing to a few files only. The WSDL checker and validator, however, are a set of pure Groovy files that have the facade &lt;code&gt;WsdlChecker.main ()&lt;/code&gt; as a central entry point. Although Groovy comes with nice &lt;code&gt;GString&lt;/code&gt;s and a powerful &amp;quot;GDK&amp;quot; (Groovy Development Kit) it appears, that Jakarta Commons Lang &lt;a href="http://commons.apache.org/lang/"&gt;StringUtils&lt;/a&gt; is still a valuable add-on. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Checking WSDL files -- a Groovy task&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As I mentioned in the introduction, the Groovy and Gant Toolset should help testers and developers check WSDL files coming from different sources for compatibility with a variable set of Web service frameworks, including WSDL validation. &lt;i&gt;Testing for compatibility&lt;/i&gt;, in this context, means: &lt;u&gt;&lt;font color="#0080c0"&gt;call every Web service framework's WSDL-to-Java code generator and check the resulting files for exceptions, errors, and warnings&lt;/font&gt;&lt;/u&gt;. If CXF is installed and enabled in the &lt;code&gt;build.properties&lt;/code&gt; file, then you can run CXF's validator tool, too. All these tasks are performed by pure-Groovy classes. The design is simple: every framework's code generator and its output handling is mapped to a Groovy class. Each class provides two basic methods that are called by the &lt;code&gt;WsdlChecker&lt;/code&gt; &amp;quot;controller&amp;quot; class: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;def checkWsdl(wsdlURI)&lt;/code&gt; calls the corresponding code generator for a WSDL file. &lt;/li&gt;&lt;br /&gt;&lt;br /&gt;  &lt;li&gt;&lt;code&gt;boolean findErrorsOrWarnings()&lt;/code&gt; tells the &amp;quot;controller&amp;quot; if errors or warnings are found in the generator output files. If so, it prints them to the console. &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;In Java you would define an interface that your concrete (code generator strategy) classes would implement (you could also use an abstract class). In Groovy, however, you don't need to declare explicit interfaces -- though you could. Instead, you create a list of &amp;quot;checker&amp;quot; objects (depending on the Web service frameworks installed and enabled in &lt;code&gt;build.properties&lt;/code&gt;) making use of Groovy closures, as shown in Listing 5. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h6&gt;Listing 5. Groovy closures in the WsdlChecker class (excerpt)&lt;/h6&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;&lt;br /&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; def wsdlcheck() {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;    def sortedList = wsdlList.sort()&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;    &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (wsdlLongName &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; sortedList) {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;       def wsdlURI = wsdlLongName.suffix&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;       availableCheckers.each{ it.checkWsdl(wsdlURI) }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;    &lt;span style="color: #008000"&gt;// print individual results and report overall result to Ant (errors only)&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;    &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; File(&lt;span style="color: #006080"&gt;'wsdl_errors.txt'&lt;/span&gt;).write(Boolean.toString(findWsdlErrors()))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt; }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt; boolean findWsdlErrors() {&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;    println()&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;    boolean errorsFoundInAnyChecker = &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;    availableCheckers.each{&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt;    errorsFoundInAnyChecker = errorsFoundInAnyChecker |&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt;       it.findErrorsOrWarnings()&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt;    }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt;    &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; errorsFoundInAnyChecker&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  19:&lt;/span&gt; }&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  20:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;A typical output in your shell would look like this:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;&lt;br /&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; Logon.wsdl... Axis2 check done.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt; Logon.wsdl... XFire check done.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; Logon.wsdl... Java 6 wsimport check done.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt; Logon.wsdl... CXF check done.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt; Logon.wsdl... CXF validator check done.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt; No Axis2 errors found&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt; No XFire errors found&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt; Java6 wsimport warnings found &lt;span style="color: #0000ff"&gt;in&lt;/span&gt;:&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;     security/webservice/svc-logon/wsdl/Logon.wsdl:&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;     src-resolve: Cannot resolve the name &lt;span style="color: #006080"&gt;'impl_1:RuntimeException2'&lt;/span&gt; to a(n) &lt;span style="color: #006080"&gt;'type definition'&lt;/span&gt; component.&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt; No Java6 wsimport errors found&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt; No CXF errors found&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  19:&lt;/span&gt; CXF Validation passed&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Using the &lt;a href="http://groovy.codehaus.org/Eclipse+Plugin"&gt;Groovy-Eclipse-Plugin&lt;/a&gt;, you can start this &lt;code&gt;WsdlChecker.groovy&lt;/code&gt; program just like a &amp;quot;normal&amp;quot; Java program. The plugin will create a separate Groovy entry in your Eclipse environment's &lt;code&gt;Run&lt;/code&gt; settings. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Running the WSDL checker from inside Ant&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;It is also possible to run the &lt;code&gt;WsdlChecker&lt;/code&gt; as part of an Ant target. To see how you can incorporate the Groovy classes in an Ant script, look at the following Ant &lt;code&gt;build.xml&lt;/code&gt;, which is part of the Groovy-WSDL-Checker Eclipse project: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h6&gt;Listing 6. Calling the Groovy WSDL checker from inside Ant&lt;/h6&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;&lt;br /&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; &amp;lt;project name=&lt;span style="color: #006080"&gt;&amp;quot;wsdl2java check&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;default&lt;/span&gt;=&lt;span style="color: #006080"&gt;&amp;quot;check-wsdls&amp;quot;&lt;/span&gt; basedir=&lt;span style="color: #006080"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;     &amp;lt;taskdef resource=&lt;span style="color: #006080"&gt;&amp;quot;net/sf/antcontrib/antcontrib.properties&amp;quot;&lt;/span&gt;/&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt;     &amp;lt;taskdef name=&lt;span style="color: #006080"&gt;&amp;quot;groovy&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;         classname=&lt;span style="color: #006080"&gt;&amp;quot;org.codehaus.groovy.ant.Groovy&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt;         &amp;lt;classpath location=&lt;span style="color: #006080"&gt;&amp;quot;lib/groovy-all-1.0.jar&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt;     &amp;lt;/taskdef&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt;     &amp;lt;target name=&lt;span style="color: #006080"&gt;&amp;quot;check-wsdls&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt;         &amp;lt;groovy src=&lt;span style="color: #006080"&gt;&amp;quot;src/tools/webservices/wsdl/checker/WsdlChecker.groovy&amp;quot;&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt;           &amp;lt;classpath&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt;             &amp;lt;pathelement location=&lt;span style="color: #006080"&gt;&amp;quot;bin-groovy&amp;quot;&lt;/span&gt;/&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt;               &amp;lt;pathelement location=&lt;span style="color: #006080"&gt;&amp;quot;lib/commons-lang-2.3.jar&amp;quot;&lt;/span&gt;/&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt;           &amp;lt;/classpath&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt;         &amp;lt;/groovy&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  15:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  16:&lt;/span&gt;         &amp;lt;loadfile property=&lt;span style="color: #006080"&gt;&amp;quot;wsdlErrorsFound&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  17:&lt;/span&gt;                       srcfile=&lt;span style="color: #006080"&gt;&amp;quot;wsdl_errors.txt&amp;quot;&lt;/span&gt;&amp;gt;&amp;lt;/loadfile&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  18:&lt;/span&gt;         &amp;lt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;gt;istrue value=&lt;span style="color: #006080"&gt;&amp;quot;${wsdlErrorsFound}&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  19:&lt;/span&gt;             &amp;lt;then&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  20:&lt;/span&gt;                 &amp;lt;echo message=&lt;span style="color: #006080"&gt;&amp;quot;we found errors in wsdl files&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  21:&lt;/span&gt;             &amp;lt;/then&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  22:&lt;/span&gt;             &amp;lt;&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  23:&lt;/span&gt;                 &amp;lt;echo message=&lt;span style="color: #006080"&gt;&amp;quot;NO errors found in wsdl files&amp;quot;&lt;/span&gt; /&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  24:&lt;/span&gt;             &amp;lt;/&lt;span style="color: #0000ff"&gt;else&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  25:&lt;/span&gt;         &amp;lt;/&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  26:&lt;/span&gt;     &amp;lt;/target&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  27:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  28:&lt;/span&gt; &amp;lt;/project&amp;gt;&lt;/pre&gt;&lt;br /&gt;  &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;The Groovy checker is controlled by the same &lt;code&gt;build.properties&lt;/code&gt; file as is &lt;code&gt;build.gant&lt;/code&gt;. If you want to work with the Groovy classes in the &lt;a href="http://www.javaworld.com/javaworld/jw-11-2007/WebServiceClient.zip"&gt;Eclipse project&lt;/a&gt; in artefacts (instead of calling the checker via &lt;code&gt;build.gant &lt;/code&gt;regex to control which WSDL file to check/validate, and the checker's &lt;code&gt;mode&lt;/code&gt; parameter (that tells the tool whether to check for compatibility using the installed code generators or to validate with the CXF validator tool). Please note, that I could not set any values in Ant's property hashtable that would be available to Ant afterwards, because in Groovy you are working with a &lt;i&gt;copy&lt;/i&gt; of the table. Therefore, I chose to deliver the results via Ant's &lt;code&gt;loadfile&lt;/code&gt; task. Working with Ant's limited condition handling capabilities just isn't my cup of tea. That's why I decided to use &lt;code&gt;ant-contrib&lt;/code&gt; with its &lt;code&gt;if-then-else&lt;/code&gt; feature to demonstrate the checker's result evaluation in Listing 6. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Code generation and modification -- Gant and Java play together&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;So far, you have only seen the &lt;i&gt;possibility&lt;/i&gt; of generating Java source code from WSDL files and checking the generated output using different Web service frameworks. I'll conclude my introduction to the Groovy and Gant Toolset with a more concrete example based on the generated code of Axis2. The corresponding Gant target in the Groovy and Gant Toolset is called &lt;code&gt;javagen&lt;/code&gt;. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To make working with the client stub more comfortable, I'll show you how to do much more than generate code with Axis2's &lt;code&gt;wsdl2Java&lt;/code&gt; tool You will first generate source code, but then you will modify it with a Java parser/modifier. After that you will compile it using Sun's &lt;code&gt;javac&lt;/code&gt; (so your &lt;code&gt;JAVA_HOME&lt;/code&gt; environment variable should point to the JDK rather that the JRE root directory), generate javadoc information, and finally produce a jar file containing the compiled code. If you're using &lt;code&gt;xmlbeans&lt;/code&gt; you will also get an &lt;code&gt;xsb&lt;/code&gt; resources jar file to be included in your project's classpath. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This jar file -- together with the parser/modifier bytecode delivered as &lt;code&gt;japa.jar&lt;/code&gt; -- is the basis for client-side unit or performance tests. Code modification allows you to provide the user with a handy client stub factory that incorporates, and encapsulates, Log4J debug-level setting, HTTP/HTTPS handling (including chunking and adaption to proper cipher suite exchange), and connection control (for the underlying Jakarta &lt;code&gt;httpclient&lt;/code&gt;). &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;About JavaCC&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;It took me some time to find a suitable Java parser. I wanted one that would be capable of handling Java 5 syntax, that was free, and that would let me plug in my source code modification feature. I chose &lt;a href="https://javacc.dev.java.net/files/documents/17/44514/Java15_parser_and_AST.zip"&gt;JavaCC&lt;/a&gt;. You can also get the parser source, together with my modifications/add-ons, from the Resources section: see JavaParser Eclipse project. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I extended two of the original files: &lt;code&gt;JavaParser.java&lt;/code&gt; and &lt;code&gt;DumpVisitor.java&lt;/code&gt;. The first one provides the entry point for Groovy as a main method and calls the &lt;code&gt;DumpVisitor&lt;/code&gt; for the Axis2-generated client stub. As you may guess, the latter is based on the Gang of Four Visitor pattern. (You may have to look closely in order to spot the changes I made to reach my targets, however. Anyone who has used the Visitor pattern knows that its usage is not easily digested!) &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Additionally, I provide a package, &lt;code&gt;tools.webservices.wsdl.stubutil&lt;/code&gt;, that incorporates all the code that is required by the modified client stub to compile and work properly. You can generate all of this as a jar file; just use the &lt;code&gt;japa.jardesc&lt;/code&gt; file, which is part of the JavaParser Eclipse project for your (and my) convenience. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;For those who want to count on Java 6 Web service support based on &lt;code&gt;java.net.URL&lt;/code&gt;, I have included a special &lt;code&gt;HttpSSLSocketFactory.java&lt;/code&gt; class as part of the Eclipse JavaParser project that takes care of the cipher suite handling (&amp;quot;accept all certificates&amp;quot;). You can use an instance of this class to set the default &lt;code&gt;SSLSocketFactory&lt;/code&gt; calling, for example, &lt;code&gt;javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory&lt;/code&gt;. Socket factories are used when creating sockets for secure HTTPS URL connections. Creating a client stub typically looks like this: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;GlobalWeather stub = GlobalWeatherStub.createStub(ProtocolType.http, Level.INFO, Chunking.yes,&lt;br /&gt;&amp;quot;http://www.webservicex.net/globalweather.asmx&amp;quot;, &amp;quot;Connection1&amp;quot;);&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Not-so-stupid bean property settings&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;My Gant script, &lt;code&gt;build.gant&lt;/code&gt;, calls the Axis2 &lt;code&gt;wsdl2java&lt;/code&gt; code generator with the flag &lt;code&gt;-s&lt;/code&gt; (synchronous calls only) and the hint to use the default Axis2 data binding &lt;code&gt;ADB&lt;/code&gt; (Axis2 Databinding Framework). This will produce service-method calls with properties wrapped as Java beans. Imagine you have a lot of properties that are optional for your call, and one of the required properties tells the Web service to ignore the others. With a normal RPC, you would set parameters to &lt;i&gt;null&lt;/i&gt; (or with &lt;code&gt;xmlbeans&lt;/code&gt; you can try the WSDL &amp;quot;&lt;code&gt;nillable&lt;/code&gt;&amp;quot; attribute), but this is not possible with ADB. During serialization, every object property is tested to be not equal to &lt;i&gt;null&lt;/i&gt;. Therefore, you might write many lines of source code doing nothing more than just setting a &amp;quot;default&amp;quot; value for every property of your bean before handing it over to your Axis2 stub. To overcome this &amp;quot;stupid work&amp;quot; I have written a smart Java utility class, &lt;code&gt;NOB&lt;/code&gt; (&lt;code&gt;NullObjectBean&lt;/code&gt;), that impressively demonstrates the power of using reflection and Jakarta commons -- the &lt;a href="http://commons.apache.org/beanutils/"&gt;beanutils project&lt;/a&gt; in this case -- assuming that performance is not a requirement when you are setting your bean properties. Populating a bean with &amp;quot;default&amp;quot; values is now as easy as calling: &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;WebConferenceDTO webConferenceDTO = (WebConferenceDTO) NOB.create(new WebConferenceDTO());&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As a current limitation, the &lt;code&gt;NOB&lt;/code&gt; utility can only provide values for &amp;quot;beans&amp;quot; that have a public default (empty) constructor, that have public final constant objects, or that have &amp;quot;simple&amp;quot; interface types as properties. So the algorithm would not work, for instance, for the &lt;code&gt;xmlbeans&lt;/code&gt; data binding where interfaces with &lt;i&gt;factory methods&lt;/i&gt; are created. (But it could be extended to do so!) Nevertheless, having this class and the Groovy and Gant Toolset in place, nothing stops you from playing around with WSDL and the client-side part of Web services. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;h6&gt;Listing 7. Helper class 'NOB' simplifies Axis2 ADB bean handling&lt;/h6&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="border-right: gray 1px solid; padding-right: 4px; border-top: gray 1px solid; padding-left: 4px; font-size: 8pt; padding-bottom: 4px; margin: 20px 0px 10px; overflow: auto; border-left: gray 1px solid; width: 97.5%; cursor: text; max-height: 200px; line-height: 12pt; padding-top: 4px; border-bottom: gray 1px solid; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; background-color: #f4f4f4"&gt;&lt;br /&gt;  &lt;div style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   1:&lt;/span&gt; package tools.webservices.wsdl.stubutil;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   3:&lt;/span&gt; import ...&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   5:&lt;/span&gt; &lt;span style="color: #008000"&gt;/**&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   6:&lt;/span&gt; &lt;span style="color: #008000"&gt; * Provide a special kind of &amp;quot;Null Object Bean (NOB)&amp;quot; where every primitive and non primitive bean&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   7:&lt;/span&gt; &lt;span style="color: #008000"&gt; * property has a default value not equal 'null'.&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   8:&lt;/span&gt; &lt;span style="color: #008000"&gt; *&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;   9:&lt;/span&gt; &lt;span style="color: #008000"&gt; * Whereas the Null Object pattern would provide , we simply want to abstract the handling of Axis2&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  10:&lt;/span&gt; &lt;span style="color: #008000"&gt; * ADB 'null' parameters away from the client.&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  11:&lt;/span&gt; &lt;span style="color: #008000"&gt; * Because this class is used in the Axis2 environment with ADB as the default data binding, it&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  12:&lt;/span&gt; &lt;span style="color: #008000"&gt; * checks if the bean that is handed over to our Factory method implements&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: white; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  13:&lt;/span&gt; &lt;span style="color: #008000"&gt; * 'org.apache.axis2.databinding.ADBBean'. You can easily disable this check if you want to use this&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;    &lt;pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, &amp;#39;Courier New&amp;#39;, courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"&gt;&lt;span style="color: #606060"&gt;  14:&lt;/span&gt; &lt;span style="color: #008000"&gt; * class in another
