Author: edwardsmj
Date: Wed May 7 14:17:29 2008
New Revision: 654282
URL: http://svn.apache.org/viewvc?rev=654282&view=rev
Log:
Updates to implementation-bpel to support introspection of the component type
from the BPEL process itself - meaning that the process can run without a
component type side file.
Added:
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELImportElement.java
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELPartnerLinkElement.java
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELPartnerLinkTypeElement.java
Modified:
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/BPELImplementation.java
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/BPELProcessDefinition.java
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELDocumentProcessor.java
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELImplementationImpl.java
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELImplementationProcessor.java
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELProcessDefinitionImpl.java
Modified:
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/BPELImplementation.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/BPELImplementation.java?rev=654282&r1=654281&r2=654282&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/BPELImplementation.java
(original)
+++
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/BPELImplementation.java
Wed May 7 14:17:29 2008
@@ -20,6 +20,7 @@
import javax.xml.namespace.QName;
+import org.apache.tuscany.sca.assembly.ComponentType;
import org.apache.tuscany.sca.assembly.Implementation;
/**
@@ -51,4 +52,15 @@
* @param processDefinition
*/
void setProcessDefinition(BPELProcessDefinition processDefinition);
+
+ /**
+ * Returns the componentType for this Spring implementation
+ */
+ public ComponentType getComponentType();
+
+ /**
+ * Sets the componentType for this Spring implementation
+ * @parma componentType the component type to set
+ */
+ public void setComponentType(ComponentType componentType);
}
Modified:
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/BPELProcessDefinition.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/BPELProcessDefinition.java?rev=654282&r1=654281&r2=654282&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/BPELProcessDefinition.java
(original)
+++
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/BPELProcessDefinition.java
Wed May 7 14:17:29 2008
@@ -19,12 +19,21 @@
package org.apache.tuscany.sca.implementation.bpel;
+import java.util.List;
+import java.util.Collection;
+
import java.net.URI;
import java.net.URL;
import javax.xml.namespace.QName;
+import javax.wsdl.PortType;
+
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface;
import org.apache.tuscany.sca.assembly.Base;
+import org.apache.tuscany.sca.implementation.bpel.xml.BPELPartnerLinkElement;
+import org.apache.tuscany.sca.implementation.bpel.xml.BPELImportElement;
+
/**
@@ -68,4 +77,38 @@
* @param url
*/
void setLocation(URL location);
+
+ /**
+ * Return the list of PartnerLinks for this process
+ */
+ List<BPELPartnerLinkElement> getPartnerLinks();
+
+ /**
+ * Return the list of imports for this process
+ */
+ List<BPELImportElement> getImports();
+
+ /**
+ * Set the associated collection of port types
+ * @param thePortTypes
+ */
+ public void setPortTypes( Collection<PortType> thePortTypes ) ;
+
+ /**
+ * Return the collection of associated port types
+ * @return
+ */
+ public Collection<PortType> getPortTypes() ;
+
+ /**
+ * Set the associated collection of WSDL interfaces
+ * @param theInterfaces
+ */
+ public void setInterfaces( Collection<WSDLInterface> theInterfaces ) ;
+
+ /**
+ * Return the collection of associated WSDL interfaces
+ * @return
+ */
+ public Collection<WSDLInterface> getInterfaces() ;
}
Modified:
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELDocumentProcessor.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELDocumentProcessor.java?rev=654282&r1=654281&r2=654282&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELDocumentProcessor.java
(original)
+++
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELDocumentProcessor.java
Wed May 7 14:17:29 2008
@@ -19,10 +19,17 @@
package org.apache.tuscany.sca.implementation.bpel.impl;
+import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
+import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
+
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URL;
+import java.util.Iterator;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Collection;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLInputFactory;
@@ -30,6 +37,15 @@
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
+import javax.wsdl.Definition;
+import javax.wsdl.extensions.ExtensibilityElement;
+import javax.wsdl.extensions.UnknownExtensibilityElement;
+import javax.wsdl.PortType;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Node;
+
import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
import org.apache.tuscany.sca.contribution.processor.BaseStAXArtifactProcessor;
import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
@@ -38,23 +54,52 @@
import
org.apache.tuscany.sca.contribution.service.ContributionResolveException;
import org.apache.tuscany.sca.implementation.bpel.BPELFactory;
import org.apache.tuscany.sca.implementation.bpel.BPELProcessDefinition;
+import org.apache.tuscany.sca.implementation.bpel.xml.BPELImportElement;
+import org.apache.tuscany.sca.implementation.bpel.xml.BPELPartnerLinkElement;
+import
org.apache.tuscany.sca.implementation.bpel.xml.BPELPartnerLinkTypeElement;
+
+import org.apache.tuscany.sca.interfacedef.InvalidInterfaceException;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLObject;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface;
+
+import org.apache.tuscany.sca.interfacedef.wsdl.xml.BPELPartnerLinkTypeExt;
/**
* BPEL document processor responsible for reading a BPEL file and producing
necessary model info about it
*
+ * TODO: The namespaces for WS-BPEL include 2 versions - only the earlier BPEL
1.1 versions are
+ * supported at present - the BPEL 2.0 namespaces also need support. This
will require inspection
+ * of both BPEL process files and of WSDL files for their BPEL namespaces
* @version $Rev$ $Date$
*/
public class BPELDocumentProcessor extends BaseStAXArtifactProcessor
implements URLArtifactProcessor<BPELProcessDefinition> {
public final static QName BPEL_PROCESS_DEFINITION = new
QName("http://schemas.xmlsoap.org/ws/2004/03/business-process/", "process");
public final static QName BPEL_EXECUTABLE_DEFINITION = new
QName("http://docs.oasis-open.org/wsbpel/2.0/process/executable", "process");
+ private static final String SCA_BPEL_NS =
"http://docs.oasis-open.org/ns/opencsa/sca-bpel/200801";
+ private static final String BPEL_NS =
"http://schemas.xmlsoap.org/ws/2004/03/business-process/";
+ private static final String BPEL_PLINK_NS =
"http://schemas.xmlsoap.org/ws/2004/03/partner-link/";
+ private static final QName PROCESS_ELEMENT = new QName(BPEL_NS, "process");
+ private static final QName PARTNERLINK_ELEMENT = new QName(BPEL_NS,
"partnerLink");
+ private static final QName ONEVENT_ELEMENT = new QName(BPEL_NS, "onEvent");
+ private static final QName RECEIVE_ELEMENT = new QName(BPEL_NS, "receive");
+ private static final QName ONMESSAGE_ELEMENT = new QName(BPEL_NS,
"onMessage");
+ private static final QName INVOKE_ELEMENT = new QName(BPEL_NS, "invoke");
+ private static final QName IMPORT_ELEMENT = new QName(BPEL_NS, "import");
+ private static final String LINKTYPE_NAME = "partnerLinkType";
+ private static final QName LINKTYPE_ELEMENT = new QName(BPEL_PLINK_NS,
LINKTYPE_NAME);
+
public final static String NAME_ELEMENT = "name";
private final static XMLInputFactory inputFactory =
XMLInputFactory.newInstance();
private final BPELFactory factory;
-
+ private WSDLFactory WSDLfactory;
+
public BPELDocumentProcessor(ModelFactoryExtensionPoint modelFactories) {
- this.factory = modelFactories.getFactory(BPELFactory.class);
+ this.factory = modelFactories.getFactory(BPELFactory.class);
+ this.WSDLfactory = modelFactories.getFactory(WSDLFactory.class);
}
public String getArtifactType() {
@@ -71,7 +116,7 @@
//for now we are just using process name
//and relying on componentType file for service definition
//so it's OK to set resolved for now
- processDefinition = indexRead(artifactURL);
+ processDefinition = indexRead2(artifactURL);
processDefinition.setURI(artifactURI);
processDefinition.setUnresolved(false);
} catch (Exception e) {
@@ -81,20 +126,207 @@
return processDefinition;
}
-
- public void resolve(BPELProcessDefinition model, ModelResolver resolver)
throws ContributionResolveException {
-
- }
+ /**
+ * Resolve the BPEL process
+ * - one of the things that needs doing is to pin down the WSDLs that are
being used by
+ * the process, in particular the partnerLinkType and the related PortType
definitions
+ */
+ public void resolve(BPELProcessDefinition model, ModelResolver resolver)
+ throws ContributionResolveException {
+ // FIXME - serious resolving needs to happen here
+
+ // Step 1 is to resolve the WSDL files referenced from this BPEL process
+ // - one complexity here is that the WSDL definitions hold BPEL
extension elements for
+ // the partnerLinkType declarations - and these must be used in later
steps
+ //
+ // Step 2 is to take all the partnerLink definitions and establish the
PortType being
+ // used, by tracing through the related partnerLinkType declarations -
the PortType is
+ // effectively a definition of the interface used by the partnerLink.
+ // - another consideration here is that each partnerLink can involve 2
interfaces, one
+ // for the forward calls to the process, the other for calls from the
process - depending
+ // on whether the partnerLink is a reference or a service, one of these
interfaces is a
+ // callback interface.
+
+ List<BPELImportElement> theImports = model.getImports();
+ for ( BPELImportElement theImport : theImports ) {
+ // Deal with WSDL imports
+ if (
theImport.getImportType().equals("http://schemas.xmlsoap.org/wsdl/") ) {
+ String WSDLLocation = theImport.getLocation();
+ String WSDLNamespace = theImport.getNamespace();
+ // FIXME both Location & Namespace attributes are
optional - for the present
+ // we don't deal with these cases - they are skipped
+ if ( WSDLLocation == null || WSDLNamespace == null )
continue;
+ // Resolve the WSDL definition
+ WSDLDefinition proxy = WSDLfactory.createWSDLDefinition();
+ proxy.setUnresolved(true);
+ proxy.setNamespace(WSDLNamespace);
+ proxy.setLocation(URI.create(WSDLLocation));
+ WSDLDefinition resolved =
resolver.resolveModel(WSDLDefinition.class, proxy);
+ if (resolved != null && !resolved.isUnresolved()) {
+ theImport.setWSDLDefinition( resolved );
+ } // end if
+ } // end if
+ } // end for
+
+ // Fetch the sets of partner links, port types and interfaces
+ List<BPELPartnerLinkTypeElement> thePLinkTypes = getPartnerLinkTypes(
theImports );
+ Collection<WSDLInterface> theInterfaces =
(Collection<WSDLInterface>)new ArrayList<WSDLInterface>();
+ Collection<PortType> thePortTypes = getAllPortTypes( theImports,
theInterfaces, resolver );
+
+ // Store the Port Types and the Interfaces for later calculation of the
component type...
+ model.setPortTypes(thePortTypes);
+ model.setInterfaces(theInterfaces);
+
+ // Now, for each partnerLink in the BPEL process, find the related
partnerLinkType
+ // element
+ List<BPELPartnerLinkElement> thePartnerLinks = model.getPartnerLinks();
+ for ( BPELPartnerLinkElement thePartnerLink : thePartnerLinks ) {
+ QName partnerLinkType = thePartnerLink.getPartnerLinkType();
+ BPELPartnerLinkTypeElement pLinkType =
+ findPartnerLinkType( partnerLinkType, thePLinkTypes );
+ if( pLinkType == null ) throw new ContributionResolveException(
"PartnerLink "
+ + thePartnerLink.getName() + " has no matching
partner link type");
+ thePartnerLink.setPartnerLinkType(pLinkType);
+ } // end for
+
+ } // end resolve
+
+ /*
+ * Retrieve all the Partner Link types defined in the imported WSDL files
+ */
+ private List<BPELPartnerLinkTypeElement> getPartnerLinkTypes(
List<BPELImportElement> theImports )
+ throws ContributionResolveException {
+
+ List<BPELPartnerLinkTypeElement> thePLinks =
+ new ArrayList<BPELPartnerLinkTypeElement>();
+
+ // We must find the partner link type elements from amongst the
imported WSDLs
+ for ( BPELImportElement theImport : theImports ){
+ WSDLDefinition theWSDL = theImport.getWSDLDefinition();
+ Definition WSDLDefinition = theWSDL.getDefinition();
+ // The BPEL partnerLinkType elements are extension elements
within the WSDL
+ List<ExtensibilityElement> extensibilityElements =
WSDLDefinition.getExtensibilityElements();
+
+ for ( ExtensibilityElement theElement : extensibilityElements )
{
+ QName elementType = theElement.getElementType();
+ if ( elementType.equals( LINKTYPE_ELEMENT ) ) {
+ BPELPartnerLinkTypeExt pLinkExt =
(BPELPartnerLinkTypeExt)theElement;
+ // Fetch the name of the partnerLinkType
+ String name = pLinkExt.getName();
+ QName qName = new QName(
WSDLDefinition.getTargetNamespace(), name );
+ BPELPartnerLinkTypeElement pLinkElement = new
BPELPartnerLinkTypeElement( qName );
+
+ // The partnerLinkType must have one and may
have 2 role child elements
+ int count = 0;
+ for( int i = 0; i < 2; i++ ) {
+ if(pLinkExt.getRoleName(i) == null )
continue;
+ PortType pType =
WSDLDefinition.getPortType(pLinkExt.getRolePortType(i));
+ if ( count == 0 ) {
+
pLinkElement.setRole1(pLinkExt.getRoleName(i),
+
pLinkExt.getRolePortType(i),
+
pType );
+ count++;
+ } else if (count == 1) {
+
pLinkElement.setRole2(pLinkExt.getRoleName(i),
+
pLinkExt.getRolePortType(i),
+ pType
);
+ count++;
+ } else {
+ break;
+ } // end if
+ } // end for
+ if( count == 0 ) throw new
ContributionResolveException( "partnerLinkType "+
+
pLinkElement.getName() +" has no Roles defined" );
+ thePLinks.add( pLinkElement );
+ } // end if
+
+ } // end for
+ } // end for
+ return thePLinks;
+ } // end getPartnerLinkTypes
+
+ protected Collection<PortType> getAllPortTypes( List<BPELImportElement>
theImports,
+
Collection<WSDLInterface> theInterfaces,
+
ModelResolver resolver)
+ throws ContributionResolveException {
+
+ Collection<PortType> thePortTypes = (Collection<PortType>)new
ArrayList<PortType>();
+ for ( BPELImportElement theImport : theImports ){
+ WSDLDefinition theWSDL = theImport.getWSDLDefinition();
+ Definition wsdlDefinition = theWSDL.getDefinition();
+
+ Collection<PortType> portTypes =
(Collection<PortType>)wsdlDefinition.getPortTypes().values();
+ thePortTypes.addAll( portTypes );
+
+ // Create WSDLInterface elements for each PortType found
+ for( PortType portType : portTypes ) {
+ WSDLObject<PortType> wsdlPortType =
theWSDL.getWSDLObject(PortType.class, portType.getQName() );
+ WSDLInterface wsdlInterface;
+ if (wsdlPortType != null) {
+ // Introspect the WSDL portType and add the resulting
+ // WSDLInterface to the resolver
+ try {
+ theWSDL.setDefinition( wsdlPortType.getDefinition() );
+ wsdlInterface =
WSDLfactory.createWSDLInterface(wsdlPortType.getElement(),
+ theWSDL, resolver);
+ wsdlInterface.setWsdlDefinition(theWSDL);
+ } catch (InvalidInterfaceException e) {
+ throw new ContributionResolveException(e);
+ } // end try
+ resolver.addModel(wsdlInterface);
+ theInterfaces.add(wsdlInterface);
+ } // end if
+ } // end for
+
+ //-----------------------
+
+ } // end for
+
+ return thePortTypes;
+ } // end getAllPortTypes
/**
- * Read the namespace for the WSDL definition and inline schemas
- *
- * @param doc
+ * Returns a QName from a string.
+ * @param definition - a WSDL Definition
+ * @param value - the String from which to form the QName in the form
"pref:localName"
* @return
- * @throws IOException
- * @throws XMLStreamException
*/
- protected BPELProcessDefinition indexRead(URL doc) throws Exception {
+ protected QName getQNameValue(Definition definition, String value) {
+ if (value != null && definition != null) {
+ int index = value.indexOf(':');
+ String prefix = index == -1 ? "" : value.substring(0, index);
+ String localName = index == -1 ? value : value.substring(index +
1);
+ String ns = definition.getNamespace(prefix);
+ if (ns == null) {
+ ns = "";
+ }
+ return new QName(ns, localName, prefix);
+ } else {
+ return null;
+ }
+ } // end getQNameValue
+
+
+ /*
+ * Method which finds a partnerLinkType definition within the WSDLs
imported by the BPEL
+ * process.
+ * @param partnerLinkTypeName - the name of the partnerLinkType
+ * @param theImports a list of the WSDL import declarations
+ * @returns a BPELPartnerLinkTypeElement for the partnerLinkType or null
if it cannot be
+ * found
+ */
+ private BPELPartnerLinkTypeElement findPartnerLinkType( QName
partnerLinkTypeName,
+
List<BPELPartnerLinkTypeElement> thePLinkTypes) {
+ // We must find the partner link type element from amongst the imported
WSDLs
+ for ( BPELPartnerLinkTypeElement thePLinkType : thePLinkTypes ){
+ if( thePLinkType.getName().equals(partnerLinkTypeName) ) return
thePLinkType;
+ } // end for
+ return null;
+ } // end findPartnerLinkType
+
+
+
+ protected BPELProcessDefinition indexRead2(URL doc) throws Exception {
BPELProcessDefinition processDefinition =
factory.createBPELProcessDefinition();
processDefinition.setUnresolved(true);
processDefinition.setLocation(doc);
@@ -103,31 +335,138 @@
XMLStreamReader reader = null;
try {
reader = inputFactory.createXMLStreamReader(is);
- int eventType = reader.getEventType();
- while (true) {
- if (eventType == XMLStreamConstants.START_ELEMENT) {
- QName elementName = reader.getName();
- if (BPEL_PROCESS_DEFINITION.equals(elementName) ||
BPEL_EXECUTABLE_DEFINITION.equals(elementName) ) {
- QName processName = new QName(getString(reader,
org.apache.tuscany.sca.assembly.xml.Constants.TARGET_NAMESPACE),
getString(reader, NAME_ELEMENT));
- processDefinition.setName(processName);
+ /*
+ * The principle here is to look for partnerLink elements, which
form either services
+ * or references. A partnerLink can be EITHER - the algorithm for
deciding is:
+ * 1) Explicit marking with sca:reference or sca:service attribute
+ * 2) "first use" of the partnerLink by specific BPEL activity
elements:
+ * <onEvent../>, <receive../> or <pick../> elements imply a service
+ * <invoke../> implies a reference
+ */
+ // TODO - need to handle <scope../> elements as kind of "nested"
processes
+ // - and scopes introduce the possibility of partnerLinks with the
same name at
+ // different levels of scope.... (yuk!!)
+ boolean completed = false;
+ while (!completed) {
+ switch (reader.next()) {
+ case START_ELEMENT:
+ QName qname = reader.getName();
+ //System.out.println("BPEL TypeLoader - found element
with name: " + qname.toString());
+ if (BPEL_PROCESS_DEFINITION.equals(qname) ||
+ BPEL_EXECUTABLE_DEFINITION.equals(qname)) {
+ QName processName = new QName(getString(reader,
org.apache.tuscany.sca.assembly.xml.Constants.TARGET_NAMESPACE),
+ getString(reader,
NAME_ELEMENT));
+ processDefinition.setName(processName);
+ } else if (PARTNERLINK_ELEMENT.equals(qname)) {
+
processDefinition.getPartnerLinks().add(processPartnerLinkElement( reader ));
+ } else if (ONEVENT_ELEMENT.equals(qname) ||
+ RECEIVE_ELEMENT.equals(qname) ||
+ ONMESSAGE_ELEMENT.equals(qname) ) {
+ processPartnerLinkAsService(
reader.getAttributeValue(null, "partnerLink"),
processDefinition.getPartnerLinks() );
+ } else if (INVOKE_ELEMENT.equals(qname)) {
+ processPartnerLinkAsReference(
reader.getAttributeValue(null, "partnerLink"),
processDefinition.getPartnerLinks() );
+ } else if (IMPORT_ELEMENT.equals(qname)) {
+ processDefinition.getImports().add(
processImportElement( reader ) );
+ } // end if
break;
- }
- }
- if (reader.hasNext()) {
- eventType = reader.next();
- } else {
- break;
- }
- }
+ case END_ELEMENT:
+ if (PROCESS_ELEMENT.equals(reader.getName())) {
+ //System.out.println("BPEL TypeLoader - finished
read of process file");
+ completed = true;
+ break;
+ } // end if
+ } // end switch
+ } // end while
} finally {
- if(reader != null) {
- reader.close();
- }
+ if(reader != null) reader.close();
is.close();
- }
+ } // end try
return processDefinition;
- }
-
+ } // end indexRead2
+
+ /*
+ * Processes a partnerLink element from the BPEL process and creates a
+ * BPELPartnerLink object
+ */
+ private BPELPartnerLinkElement processPartnerLinkElement(
XMLStreamReader reader )
+ throws ContributionReadException {
+ BPELPartnerLinkElement partnerLink = new BPELPartnerLinkElement(
+ reader.getAttributeValue(null, "name"),
+ getQNameValue(reader, reader.getAttributeValue(null,
"partnerLinkType") ),
+ reader.getAttributeValue(null, "myRole"),
+ reader.getAttributeValue(null, "partnerRole"));
+ // See if there are any SCA extension attributes
+ String scaService = reader.getAttributeValue( SCA_BPEL_NS,
"service");
+ String scaReference = reader.getAttributeValue( SCA_BPEL_NS,
"reference");
+ if( (scaService != null) && (scaReference != null) ) {
+ // It is incorrect to set both service & reference attributes
+ throw new ContributionReadException( "BPEL PartnerLink "
+ + reader.getAttributeValue(null, "name") +
+ " has both sca:reference and sca:service
attributes set" );
+ }
+ // Set the SCA type and the related name, if present
+ if( scaService != null ) partnerLink.setAsService( scaService );
+ else if ( scaReference != null ) partnerLink.setAsReference(
scaReference );
+ return partnerLink;
+ } // end processPartnerLinkElement
+
+ /*
+ * Processes an <import../> element from the BPEL process and creates a
+ * BPELImportElement object
+ */
+ private BPELImportElement processImportElement( XMLStreamReader reader
) {
+ return ( new BPELImportElement( reader.getAttributeValue(null,
"location"),
+
reader.getAttributeValue(null, "importType"),
+
reader.getAttributeValue(null, "namespace") ));
+ } // end processImportElement
+
+ /*
+ * Mark a named partnerLink as a Service, unless it is already marked
as a Reference
+ */
+ private void processPartnerLinkAsService( String partnerLinkName,
+
List<BPELPartnerLinkElement> partnerLinks ) {
+ BPELPartnerLinkElement partnerLink = findPartnerLinkByName(
partnerLinks, partnerLinkName );
+ if( partnerLink == null ) {
+ System.out.println("BPEL TypeLoader - element
references partnerLink "
+ +
partnerLinkName + " not in the list");
+ } else {
+ // Set the type of the partnerLink to "service" if not
already set...
+ if( !partnerLink.isSCATyped() )
partnerLink.setAsService( partnerLinkName );
+ } // endif
+ } // end processPartnerLinkAsReference
+
+ /*
+ * Mark a named partnerLink as a Reference, unless it is already marked
as a Service
+ */
+ private void processPartnerLinkAsReference( String partnerLinkName,
+ List<BPELPartnerLinkElement> partnerLinks ) {
+ BPELPartnerLinkElement partnerLink = findPartnerLinkByName(
partnerLinks, partnerLinkName );
+ if( partnerLink == null ) {
+ System.out.println("BPEL TypeLoader - element
references partnerLink "
+ +
partnerLinkName + " not in the list");
+ } else {
+ // Set the type of the partnerLink to "service" if not
already set...
+ if( !partnerLink.isSCATyped() )
partnerLink.setAsReference( partnerLinkName );
+ } // endif
+ } // end processPartnerLinkAsReference
+
+ /*
+ * Finds a PartnerLink by name from a List of PartnerLinks
+ *
+ * returns null if there is no partnerLink with a matching name
+ * - returns the PartnerLink with a matching name
+ */
+ private BPELPartnerLinkElement findPartnerLinkByName(
List<BPELPartnerLinkElement> partnerLinks,
+
String partnerLinkName ) {
+ // Scan the list looking for a partner link with the supplied
name
+ Iterator<BPELPartnerLinkElement> it = partnerLinks.iterator();
+ while( it.hasNext() ) {
+ BPELPartnerLinkElement thePartnerLink = it.next();
+ if( thePartnerLink.getName().equals(partnerLinkName) )
return thePartnerLink;
+ }
+ return null;
+ } // end method findPartnerLinkByName
+
}
Modified:
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELImplementationImpl.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELImplementationImpl.java?rev=654282&r1=654281&r2=654282&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELImplementationImpl.java
(original)
+++
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELImplementationImpl.java
Wed May 7 14:17:29 2008
@@ -24,8 +24,11 @@
import javax.xml.namespace.QName;
import org.apache.tuscany.sca.assembly.AssemblyFactory;
+import org.apache.tuscany.sca.assembly.ComponentType;
import org.apache.tuscany.sca.assembly.ConstrainingType;
import org.apache.tuscany.sca.assembly.Property;
+import org.apache.tuscany.sca.assembly.Reference;
+import org.apache.tuscany.sca.assembly.Service;
import org.apache.tuscany.sca.assembly.impl.ImplementationImpl;
import org.apache.tuscany.sca.implementation.bpel.BPELImplementation;
import org.apache.tuscany.sca.implementation.bpel.BPELProcessDefinition;
@@ -40,6 +43,7 @@
private QName _processName;
private BPELProcessDefinition _processDefinition;
+ private ComponentType componentType;
/**
* Constructs a new BPEL implementation.
@@ -88,6 +92,36 @@
return Collections.emptyList();
}
+ /*
+ * Returns the componentType for this BPEL process implementation
+ */
+ public ComponentType getComponentType() {
+ return componentType;
+ }
+
+ /*
+ * Sets the componentType for this BPEL process implementation
+ */
+ public void setComponentType(ComponentType componentType) {
+ this.componentType = componentType;
+ }
+
+ @Override
+ /**
+ * Returns a List of the services for this BPEL process implementation
+ */
+ public List<Service> getServices() {
+ return componentType.getServices();
+ }
+
+ @Override
+ /**
+ * Returns a List of the references for this BPEL process implementation
+ */
+ public List<Reference> getReferences() {
+ return componentType.getReferences();
+ }
+
@Override
public int hashCode() {
return String.valueOf(this.getProcess()).hashCode();
Modified:
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELImplementationProcessor.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELImplementationProcessor.java?rev=654282&r1=654281&r2=654282&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELImplementationProcessor.java
(original)
+++
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELImplementationProcessor.java
Wed May 7 14:17:29 2008
@@ -22,14 +22,19 @@
import java.util.HashMap;
import java.util.Map;
+import java.util.List;
+import java.util.Collection;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
import javax.xml.stream.XMLStreamWriter;
+import javax.wsdl.PortType;
+
import org.apache.tuscany.sca.assembly.AssemblyFactory;
import org.apache.tuscany.sca.assembly.ComponentType;
+import org.apache.tuscany.sca.assembly.Multiplicity;
import org.apache.tuscany.sca.assembly.Property;
import org.apache.tuscany.sca.assembly.Reference;
import org.apache.tuscany.sca.assembly.Service;
@@ -42,10 +47,19 @@
import
org.apache.tuscany.sca.contribution.service.ContributionResolveException;
import org.apache.tuscany.sca.contribution.service.ContributionWriteException;
import org.apache.tuscany.sca.databinding.xml.DOMDataBinding;
+
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterfaceContract;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLFactory;
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface;
+
import org.apache.tuscany.sca.implementation.bpel.BPELFactory;
import org.apache.tuscany.sca.implementation.bpel.BPELImplementation;
import org.apache.tuscany.sca.implementation.bpel.BPELProcessDefinition;
import org.apache.tuscany.sca.implementation.bpel.DefaultBPELFactory;
+import org.apache.tuscany.sca.implementation.bpel.xml.BPELPartnerLinkElement;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterface;
+import org.apache.tuscany.sca.interfacedef.java.JavaInterfaceContract;
/**
* Implements a STAX artifact processor for BPEL implementations.
@@ -64,9 +78,11 @@
private AssemblyFactory assemblyFactory;
private BPELFactory bpelFactory;
+ private WSDLFactory wsdlFactory;
public BPELImplementationProcessor(ModelFactoryExtensionPoint
modelFactories) {
this.assemblyFactory =
modelFactories.getFactory(AssemblyFactory.class);
+ this.wsdlFactory = modelFactories.getFactory(WSDLFactory.class);
this.bpelFactory = new DefaultBPELFactory(modelFactories);
}
@@ -113,6 +129,9 @@
impl.setProcessDefinition(processDefinition);
+ // Get the component type from the process definition
+ generateComponentType( impl );
+
//resolve component type
mergeComponentType(resolver, impl);
@@ -120,7 +139,7 @@
impl.setUnresolved(false);
}
- }
+ } // end resolve
/*
* Write out the XML representation of the BPEL implementation
@@ -149,7 +168,7 @@
writer.writeEndElement();
- }
+ } // end write
private BPELProcessDefinition
resolveBPELProcessDefinition(BPELImplementation impl, ModelResolver resolver)
throws ContributionResolveException {
QName processName = impl.getProcess();
@@ -158,16 +177,136 @@
processDefinition.setUnresolved(true);
return resolver.resolveModel(BPELProcessDefinition.class,
processDefinition);
- }
+ } // end resolveBPELProcessDefinition
+
+ // Calculates the component type of the supplied implementation and
attaches it to the
+ // implementation
+ private void generateComponentType(BPELImplementation impl ) {
+ // Create a ComponentType and mark it unresolved
+ ComponentType componentType = assemblyFactory.createComponentType();
+ componentType.setUnresolved(true);
+ impl.setComponentType(componentType);
+
+ // Each partner link in the process represents either a service or a
reference
+ // - or both, in the sense of involving a callback
+ BPELProcessDefinition theProcess = impl.getProcessDefinition();
+ List<BPELPartnerLinkElement> partnerLinks =
theProcess.getPartnerLinks();
+
+ for( BPELPartnerLinkElement pLink : partnerLinks ) {
+ // check that the partner link has been designated as service
or reference in SCA terms
+ if ( pLink.isSCATyped() ) {
+ String SCAName = pLink.getSCAName();
+ if( pLink.querySCAType().equals("reference") ) {
+ componentType.getReferences().add(
+ generateReference( SCAName,
+
pLink.getMyRolePortType(),
+
pLink.getPartnerRolePortType(),
+
theProcess.getInterfaces() )
+ );
+ } else {
+ componentType.getServices().add(
+ generateService( SCAName,
+
pLink.getMyRolePortType(),
+
pLink.getPartnerRolePortType(),
+
theProcess.getInterfaces() )
+ );
+ } // end if
+ } // end if
+ } // end for
+
+
+ } // end getComponentType
+ /**
+ * Create an SCA reference for a partnerLink
+ * @param name - name of the reference
+ * @param myRolePT - partner link type of myRole
+ * @param partnerRolePT - partner link type of partnerRole
+ * @param theInterfaces - list of WSDL interfaces associated with the BPEL
process
+ * @return
+ */
+ private Reference generateReference( String name, PortType myRolePT,
+ PortType partnerRolePT, Collection<WSDLInterface> theInterfaces
) {
+ Reference reference = assemblyFactory.createReference();
+ WSDLInterfaceContract interfaceContract =
wsdlFactory.createWSDLInterfaceContract();
+ reference.setInterfaceContract(interfaceContract);
+
+ // Set the name of the reference to the supplied name and the
multiplicity of the reference
+ // to 1..1
+ // TODO: support other multiplicities
+ reference.setName(name);
+ reference.setMultiplicity(Multiplicity.ONE_ONE);
+
+ // Set the call interface and, if present, the callback interface
+ WSDLInterface callInterface = null;
+ for( WSDLInterface anInterface : theInterfaces ) {
+ if( anInterface.getPortType().equals(myRolePT)) callInterface =
anInterface;
+ } // end for
+ //TODO need to throw an exception here if no interface is found
+ reference.getInterfaceContract().setInterface(callInterface);
+
+ // There is a callback if the partner role is not null and if the
partner role port type
+ // is not the same as the port type for my role
+ if (partnerRolePT != null && !myRolePT.equals(partnerRolePT) ) {
+ WSDLInterface callbackInterface = null;
+ for( WSDLInterface anInterface : theInterfaces ) {
+ if( anInterface.getPortType().equals(myRolePT))
callbackInterface = anInterface;
+ } // end for
+ //TODO need to throw an exception here if no interface is found
+
reference.getInterfaceContract().setCallbackInterface(callbackInterface);
+ } // end if
+
+ return reference;
+ } // end generateReference
+
+ /**
+ * Create an SCA service for a partnerLink
+ * @param name - name of the reference
+ * @param myRolePT - partner link type of myRole
+ * @param partnerRolePT - partner link type of partnerRole
+ * @param theInterfaces - list of WSDL interfaces associated with the BPEL
process
+ * @return
+ */
+ private Service generateService( String name, PortType myRolePT,
+ PortType partnerRolePT, Collection<WSDLInterface> theInterfaces
) {
+ Service service = assemblyFactory.createService();
+ WSDLInterfaceContract interfaceContract =
wsdlFactory.createWSDLInterfaceContract();
+ service.setInterfaceContract(interfaceContract);
+
+ // Set the name of the service to the supplied name
+ service.setName(name);
+
+ // Set the call interface and, if present, the callback interface
+ WSDLInterface callInterface = null;
+ for( WSDLInterface anInterface : theInterfaces ) {
+ if( anInterface.getPortType().equals(myRolePT)) callInterface =
anInterface;
+ } // end for
+ //TODO need to throw an exception here if no interface is found
+ service.getInterfaceContract().setInterface(callInterface);
+
+ // There is a callback if the partner role is not null and if the
partner role port type
+ // is not the same as the port type for my role
+ if (partnerRolePT != null && !myRolePT.equals(partnerRolePT) ) {
+ WSDLInterface callbackInterface = null;
+ for( WSDLInterface anInterface : theInterfaces ) {
+ if( anInterface.getPortType().equals(myRolePT))
callbackInterface = anInterface;
+ } // end for
+ //TODO need to throw an exception here if no interface is found
+
service.getInterfaceContract().setCallbackInterface(callbackInterface);
+ } // end if
+
+ return service;
+ } // end generateService
/**
- * Merge the componentType from introspection and external file
+ * Merge the componentType from introspection and from external file
* @param resolver
* @param impl
*/
private void mergeComponentType(ModelResolver resolver, BPELImplementation
impl) {
// FIXME: Need to clarify how to merge
+
+ // Load the component type from a component type file, if any
ComponentType componentType = getComponentType(resolver, impl);
if (componentType != null && !componentType.isUnresolved()) {
@@ -184,17 +323,20 @@
impl.getReferences().addAll(refMap.values());
Map<String, Service> serviceMap = new HashMap<String, Service>();
- for (Service svc : impl.getServices()) {
- if(svc != null) {
- serviceMap.put(svc.getName(), svc);
- }
- }
for (Service service : componentType.getServices()) {
//set default dataBinding to DOM
service.getInterfaceContract().getInterface().resetDataBinding(DOMDataBinding.NAME);
serviceMap.put(service.getName(), service);
}
+ // For the present, overwrite anything arising from the component
type sidefile if
+ // equivalent services are defined in the implementation
+ for (Service svc : impl.getServices()) {
+ if(svc != null) {
+ serviceMap.put(svc.getName(), svc);
+ }
+ }
+
impl.getServices().clear();
impl.getServices().addAll(serviceMap.values());
@@ -208,6 +350,8 @@
private ComponentType getComponentType(ModelResolver resolver,
BPELImplementation impl) {
String bpelProcessURI =
impl.getProcessDefinition().getURI().toString();
+
+ // Get the component type definition contained in the componentType
file, if any
String componentTypeURI = bpelProcessURI.replace(".bpel",
".componentType");
ComponentType componentType = assemblyFactory.createComponentType();
componentType.setUnresolved(true);
@@ -217,9 +361,12 @@
return componentType;
}
return null;
- }
+ } // end getComponentType
/*
+ * Returns a QName of a BPEL process as from its string representation in
the process
+ * attribute in the process XML
+ *
* The process attribute of a BPEL process is a QName - this may be
presented in one of
* two alternative formats:
* 1) In the form of a local name with a prefix, with the prefix
referencing a namespace
Modified:
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELProcessDefinitionImpl.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELProcessDefinitionImpl.java?rev=654282&r1=654281&r2=654282&view=diff
==============================================================================
---
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELProcessDefinitionImpl.java
(original)
+++
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELProcessDefinitionImpl.java
Wed May 7 14:17:29 2008
@@ -21,10 +21,18 @@
import java.net.URI;
import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Collection;
import javax.xml.namespace.QName;
+import javax.wsdl.PortType;
+
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLInterface;
import org.apache.tuscany.sca.implementation.bpel.BPELProcessDefinition;
+import org.apache.tuscany.sca.implementation.bpel.xml.BPELImportElement;
+import org.apache.tuscany.sca.implementation.bpel.xml.BPELPartnerLinkElement;
/**
* The BPEL process definition implementation.
@@ -36,6 +44,10 @@
private URI uri;
private URL location;
private boolean unresolved;
+ private List<BPELPartnerLinkElement> partnerLinks = new
ArrayList<BPELPartnerLinkElement>();
+ private List<BPELImportElement> imports = new
ArrayList<BPELImportElement>();
+ private Collection<PortType> thePortTypes = null;
+ private Collection<WSDLInterface> theInterfaces = null;
public QName getName() {
return name;
@@ -67,7 +79,47 @@
public void setUnresolved(boolean undefined) {
this.unresolved = undefined;
- }
+ }
+
+ /**
+ * Return the list of PartnerLinks for this process
+ * @return List<BPELPartnerLinkElement> the list of Partner Links
+ */
+ public List<BPELPartnerLinkElement> getPartnerLinks() {
+ return partnerLinks;
+ }
+
+ /**
+ * Return the list of imports for this process
+ * @return List<BPELImportElement> the list of Import elements
+ */
+ public List<BPELImportElement> getImports() {
+ return imports;
+ }
+
+ public void setPortTypes( Collection<PortType> thePortTypes ) {
+ this.thePortTypes = thePortTypes;
+ }
+
+ public Collection<PortType> getPortTypes() {
+ return thePortTypes;
+ }
+
+ /**
+ * Set the associated collection of WSDL interfaces
+ * @param theInterfaces
+ */
+ public void setInterfaces( Collection<WSDLInterface> theInterfaces ) {
+ this.theInterfaces = theInterfaces;
+ } // end setInterfaces
+
+ /**
+ * Return the collection of associated WSDL interfaces
+ * @return
+ */
+ public Collection<WSDLInterface> getInterfaces() {
+ return theInterfaces;
+ } // end getInterfaces
public void compile() {
/*
Added:
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELImportElement.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELImportElement.java?rev=654282&view=auto
==============================================================================
---
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELImportElement.java
(added)
+++
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELImportElement.java
Wed May 7 14:17:29 2008
@@ -0,0 +1,65 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.implementation.bpel.xml;
+
+import org.apache.tuscany.sca.interfacedef.wsdl.WSDLDefinition;
+
+/**
+ * Represents an <impotr.../> element in a BPEL process
+ * - this has attributes:
+ * location
+ * importType
+ * namespace
+ */
+public class BPELImportElement {
+
+ private String location;
+ private String importType;
+ private String namespace;
+ private WSDLDefinition theWSDL = null;
+
+ public BPELImportElement( String location,
+ String importType,
+ String namespace ) {
+ this.location = location;
+ this.importType = importType;
+ this.namespace = namespace;
+ }
+
+ public String getImportType() {
+ return importType;
+ }
+
+ public String getLocation() {
+ return location;
+ }
+
+ public String getNamespace() {
+ return namespace;
+ }
+
+ public void setWSDLDefinition( WSDLDefinition theDefinition) {
+ theWSDL = theDefinition;
+ }
+
+ public WSDLDefinition getWSDLDefinition() {
+ return theWSDL;
+ }
+
+} // end class BPELImportElement
Added:
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELPartnerLinkElement.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELPartnerLinkElement.java?rev=654282&view=auto
==============================================================================
---
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELPartnerLinkElement.java
(added)
+++
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELPartnerLinkElement.java
Wed May 7 14:17:29 2008
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tuscany.sca.implementation.bpel.xml;
+
+import javax.xml.namespace.QName;
+
+import javax.wsdl.PortType;
+
+/**
+ * Represents a <partnerLink.../> element in a BPEL process
+ * - this has attributes:
+ * name
+ * partnerLinkType
+ * myRole
+ * partnerRole
+ * - plus zero or more property elements as children
+ *
+ * The partnerlink may also be given an SCA Type - either of service or of
reference - this must
+ * generally be calculated and set on the partnerLink by inspecting the BPEL
process
+ *
+ */
+public class BPELPartnerLinkElement {
+
+ private String REFERENCE_TYPE = "reference";
+ private String SERVICE_TYPE = "service";
+ private String name;
+ private QName partnerLinkType;
+ private BPELPartnerLinkTypeElement pLinkType = null;
+ private String myRole;
+ private String partnerRole;
+ private String scaName; // Holds the SCA
reference or service name
+ private String scaType = null; // Holds the SCA type = null |
service | reference
+
+ public BPELPartnerLinkElement(String name,
+ QName partnerLinkType,
+ String myRole,
+ String partnerRole ) {
+ this.name = name;
+ this.partnerLinkType = partnerLinkType;
+ this.myRole = myRole;
+ this.partnerRole = partnerRole;
+
+ scaName = null;
+ }
+
+ public QName getPartnerLinkType() {
+ return partnerLinkType;
+ }
+
+ public void setPartnerLinkType( BPELPartnerLinkTypeElement pLinkType ) {
+ this.pLinkType = pLinkType;
+ }
+
+
+ public PortType getMyRolePortType() {
+ return getRolePortType( myRole );
+ }
+
+ public PortType getPartnerRolePortType() {
+ return getRolePortType( partnerRole );
+ }
+
+ private PortType getRolePortType( String theRole ) {
+ if ( pLinkType.getRole1Name().equals(theRole) ) {
+ return pLinkType.getRole1pType();
+ } else if ( pLinkType.getRole2Name().equals(theRole) ) {
+ return pLinkType.getRole2pType();
+ } // end if
+ return null;
+ } // end getRolePortType
+
+ public String getName() {
+ return name;
+ }
+
+ public String getMyRole() {
+ return myRole;
+ }
+
+ public String getPartnerRole() {
+ return partnerRole;
+ }
+
+ public void setSCAName( String name ) {
+ scaName = name;
+ }
+
+ public String getSCAName() {
+ return scaName;
+ }
+
+ public boolean isSCATyped() {
+ return ( !(scaType == null) );
+ }
+
+ public void setAsReference( String name ) {
+ scaType = REFERENCE_TYPE;
+ scaName = name;
+ }
+
+ public void setAsService( String name ) {
+ scaType = SERVICE_TYPE;
+ scaName = name;
+ }
+
+ public String querySCAType() {
+ return scaType;
+ }
+
+} // end class BPELPartnerLinkElement
Added:
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELPartnerLinkTypeElement.java
URL:
http://svn.apache.org/viewvc/incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELPartnerLinkTypeElement.java?rev=654282&view=auto
==============================================================================
---
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELPartnerLinkTypeElement.java
(added)
+++
incubator/tuscany/java/sca/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/xml/BPELPartnerLinkTypeElement.java
Wed May 7 14:17:29 2008
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */package org.apache.tuscany.sca.implementation.bpel.xml;
+
+ import javax.xml.namespace.QName;
+
+ import javax.wsdl.extensions.ExtensibilityElement;
+ import javax.wsdl.PortType;
+
+ /**
+ * Represents a <partnerLinkType.../> element related to a BPEL process
+ * - this has attributes:
+ * name
+ * Role1 name
+ * Role1 portType
+ * Role2 name
+ * Role2 portType
+ *
+ * - in the XML the 2 roles are child elements of the partnerLinkType
element, but there
+ * seems little point in reflecting this back into this model - it is simpler
to include
+ * both roles within the representation of the partnerLinkType itself
+ *
+ */
+public class BPELPartnerLinkTypeElement implements ExtensibilityElement {
+
+ private QName name;
+ private String Role1name = null;
+ private QName Role1porttype = null;
+ private PortType Role1pType = null;
+ private String Role2name = null;
+ private QName Role2porttype = null;
+ private PortType Role2pType = null;
+
+
+ private QName elementType = null;
+ private Boolean required = false;
+
+ public BPELPartnerLinkTypeElement( QName name ) {
+ this.name = name;
+ }
+
+ public QName getName(){
+ return name;
+ }
+
+ public void setRole1( String name, QName portType, PortType pType ) {
+ Role1name = name;
+ Role1porttype = portType;
+ Role1pType = pType;
+ }
+
+ public void setRole2( String name, QName portType, PortType pType ) {
+ Role2name = name;
+ Role2porttype = portType;
+ Role2pType = pType;
+ }
+
+ public String getRole1Name() {
+ return Role1name;
+ }
+ public String getRole2Name() {
+ return Role2name;
+ }
+
+ public QName getRole1PortType() {
+ return Role1porttype;
+ }
+
+ public QName getRole2PortType() {
+ return Role2porttype;
+ }
+
+ public PortType getRole1pType() {
+ return Role1pType;
+ }
+
+ public PortType getRole2pType() {
+ return Role2pType;
+ }
+
+ public QName getElementType() {
+ return elementType;
+ }
+
+ public Boolean getRequired() {
+ return required;
+ }
+
+ public void setElementType(QName elementType) {
+ this.elementType = elementType;
+ }
+
+ public void setRequired(java.lang.Boolean required) {
+ this.required = required;
+ }
+
+} // end BPELPartnerLinkType