summaryrefslogtreecommitdiffstats
path: root/branches/sca-java-1.3.3/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELDocumentProcessor.java
diff options
context:
space:
mode:
Diffstat (limited to 'branches/sca-java-1.3.3/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELDocumentProcessor.java')
-rw-r--r--branches/sca-java-1.3.3/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELDocumentProcessor.java524
1 files changed, 0 insertions, 524 deletions
diff --git a/branches/sca-java-1.3.3/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELDocumentProcessor.java b/branches/sca-java-1.3.3/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELDocumentProcessor.java
deleted file mode 100644
index 0079272521..0000000000
--- a/branches/sca-java-1.3.3/modules/implementation-bpel/src/main/java/org/apache/tuscany/sca/implementation/bpel/impl/BPELDocumentProcessor.java
+++ /dev/null
@@ -1,524 +0,0 @@
-/*
- * 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.impl;
-
-import static javax.xml.stream.XMLStreamConstants.END_ELEMENT;
-import static javax.xml.stream.XMLStreamConstants.START_ELEMENT;
-
-import java.io.InputStream;
-import java.net.URI;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.wsdl.Definition;
-import javax.wsdl.PortType;
-import javax.wsdl.extensions.ExtensibilityElement;
-import javax.xml.namespace.QName;
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLStreamReader;
-
-import org.apache.tuscany.sca.assembly.builder.impl.ProblemImpl;
-import org.apache.tuscany.sca.contribution.ModelFactoryExtensionPoint;
-import org.apache.tuscany.sca.contribution.processor.BaseStAXArtifactProcessor;
-import org.apache.tuscany.sca.contribution.processor.URLArtifactProcessor;
-import org.apache.tuscany.sca.contribution.resolver.ModelResolver;
-import org.apache.tuscany.sca.contribution.service.ContributionReadException;
-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.WSDLInterface;
-import org.apache.tuscany.sca.interfacedef.wsdl.WSDLObject;
-import org.apache.tuscany.sca.interfacedef.wsdl.xml.BPELPartnerLinkTypeExt;
-import org.apache.tuscany.sca.monitor.Monitor;
-import org.apache.tuscany.sca.monitor.Problem;
-import org.apache.tuscany.sca.monitor.Problem.Severity;
-
-/**
- * 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;
- private Monitor monitor;
-
- public BPELDocumentProcessor(ModelFactoryExtensionPoint modelFactories, Monitor monitor) {
- this.factory = modelFactories.getFactory(BPELFactory.class);
- this.WSDLfactory = modelFactories.getFactory(WSDLFactory.class);
- this.monitor = monitor;
- }
-
- /**
- * Report a warning.
- *
- * @param problems
- * @param message
- * @param model
- */
- private void warning(String message, Object model, Object... messageParameters) {
- if (monitor != null) {
- Problem problem = new ProblemImpl(this.getClass().getName(), "impl-bpel-validation-messages", Severity.WARNING, model, message, (Object[])messageParameters);
- monitor.problem(problem);
- }
- }
-
- /**
- * Report a error.
- *
- * @param problems
- * @param message
- * @param model
- */
- private void error(String message, Object model, Object... messageParameters) {
- if (monitor != null) {
- Problem problem = new ProblemImpl(this.getClass().getName(), "impl-bpel-validation-messages", Severity.ERROR, model, message, (Object[])messageParameters);
- monitor.problem(problem);
- }
- }
-
- /**
- * Report a exception.
- *
- * @param problems
- * @param message
- * @param model
- */
- private void error(String message, Object model, Exception ex) {
- if (monitor != null) {
- Problem problem = new ProblemImpl(this.getClass().getName(), "impl-bpel-validation-messages", Severity.ERROR, model, message, ex);
- monitor.problem(problem);
- }
- }
-
-
- public String getArtifactType() {
- return "*.bpel";
- }
-
- public Class<BPELProcessDefinition> getModelType() {
- return BPELProcessDefinition.class;
- }
-
- public BPELProcessDefinition read(URL contributionURL, URI artifactURI, URL artifactURL) throws ContributionReadException {
- BPELProcessDefinition processDefinition = null;
- try {
- //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 = indexRead2(artifactURL);
- processDefinition.setURI(artifactURI);
- processDefinition.setUnresolved(false);
- } catch (Exception e) {
- ContributionReadException ce = new ContributionReadException(e);
- error("ContributionReadException", artifactURL, ce);
- //throw ce;
- }
-
- return processDefinition;
- }
-
- /**
- * 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();
-
- // Resolve the WSDL definition
- WSDLDefinition proxy = WSDLfactory.createWSDLDefinition();
- proxy.setUnresolved(true);
- proxy.setNamespace(WSDLNamespace);
- if ( WSDLLocation != null ) proxy.setLocation(URI.create(WSDLLocation));
- WSDLDefinition resolved = resolver.resolveModel(WSDLDefinition.class, proxy);
- if (resolved != null && !resolved.isUnresolved()) {
- theImport.setWSDLDefinition( resolved );
- } else {
- error("CannotResolveWSDLReference", resolver, WSDLLocation, WSDLNamespace);
- //throw new ContributionResolveException("BPELDocumentProcessor:resolve -" +
- //" unable to resolve WSDL referenced by BPEL import" +
- //"WSDL location: " + WSDLLocation + " WSDLNamespace: " +
- //WSDLNamespace );
- return;
- } // 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 ) {
- error("PartnerLinkNoMatchingType", thePartnerLink, thePartnerLink.getName());
- //throw new ContributionResolveException( "PartnerLink "
- //+ thePartnerLink.getName() + " has no matching partner link type");
- } else
- 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 ) {
- error("PartnerLinkTypeNoRoles", theElement, pLinkElement.getName());
- throw new ContributionResolveException( "partnerLinkType " +
- pLinkElement.getName() +" has no Roles defined" );
- } else
- 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) {
- ContributionResolveException ce = new ContributionResolveException(e);
- error("ContributionResolveException", resolver, ce);
- throw ce;
- } // end try
- resolver.addModel(wsdlInterface);
- theInterfaces.add(wsdlInterface);
- } // end if
- } // end for
-
- //-----------------------
-
- } // end for
-
- return thePortTypes;
- } // end getAllPortTypes
-
- /**
- * 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
- */
- 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);
-
- InputStream is = doc.openStream();
- XMLStreamReader reader = null;
- try {
- reader = inputFactory.createXMLStreamReader(is);
- /*
- * 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;
- 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();
- 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
- error("PartnerLinkHasBothAttr", partnerLink, reader.getAttributeValue(null, "name"));
- 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 ) {
- warning("ReferencePartnerLinkNotInList", partnerLinkName, partnerLinkName);
- } 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 ) {
- warning("ReferencePartnerLinkNotInList", partnerLinkName, partnerLinkName);
- } 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
-
-
-}