/******************************************************************************* * Copyright (c) 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.bpel.model.resource; import java.io.IOException; import java.io.InputStream; import java.io.StringReader; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.StringTokenizer; import javax.wsdl.WSDLException; import javax.wsdl.extensions.ExtensibilityElement; import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; import org.apache.xerces.parsers.DOMParser; import org.eclipse.bpel.model.Activity; import org.eclipse.bpel.model.Assign; import org.eclipse.bpel.model.BPELFactory; import org.eclipse.bpel.model.BPELPackage; import org.eclipse.bpel.model.BPELPlugin; import org.eclipse.bpel.model.Branches; import org.eclipse.bpel.model.Catch; import org.eclipse.bpel.model.CatchAll; import org.eclipse.bpel.model.Compensate; import org.eclipse.bpel.model.CompensateScope; import org.eclipse.bpel.model.CompensationHandler; import org.eclipse.bpel.model.CompletionCondition; import org.eclipse.bpel.model.Condition; import org.eclipse.bpel.model.Copy; import org.eclipse.bpel.model.Correlation; import org.eclipse.bpel.model.CorrelationPattern; import org.eclipse.bpel.model.CorrelationSet; import org.eclipse.bpel.model.CorrelationSets; import org.eclipse.bpel.model.Correlations; import org.eclipse.bpel.model.Documentation; import org.eclipse.bpel.model.Else; import org.eclipse.bpel.model.ElseIf; import org.eclipse.bpel.model.Empty; import org.eclipse.bpel.model.EndpointReferenceRole; import org.eclipse.bpel.model.EventHandler; import org.eclipse.bpel.model.Exit; import org.eclipse.bpel.model.Expression; import org.eclipse.bpel.model.BPELExtensibleElement; import org.eclipse.bpel.model.Extension; import org.eclipse.bpel.model.Extensions; import org.eclipse.bpel.model.FaultHandler; import org.eclipse.bpel.model.Flow; import org.eclipse.bpel.model.ForEach; import org.eclipse.bpel.model.From; import org.eclipse.bpel.model.FromPart; import org.eclipse.bpel.model.FromParts; import org.eclipse.bpel.model.If; import org.eclipse.bpel.model.Import; import org.eclipse.bpel.model.Invoke; import org.eclipse.bpel.model.Link; import org.eclipse.bpel.model.Links; import org.eclipse.bpel.model.MessageExchange; import org.eclipse.bpel.model.MessageExchanges; import org.eclipse.bpel.model.OnAlarm; import org.eclipse.bpel.model.OnEvent; import org.eclipse.bpel.model.OnMessage; import org.eclipse.bpel.model.OpaqueActivity; import org.eclipse.bpel.model.PartnerActivity; import org.eclipse.bpel.model.PartnerLink; import org.eclipse.bpel.model.PartnerLinks; import org.eclipse.bpel.model.Pick; import org.eclipse.bpel.model.Process; import org.eclipse.bpel.model.Query; import org.eclipse.bpel.model.Receive; import org.eclipse.bpel.model.RepeatUntil; import org.eclipse.bpel.model.Reply; import org.eclipse.bpel.model.Rethrow; import org.eclipse.bpel.model.Scope; import org.eclipse.bpel.model.Sequence; import org.eclipse.bpel.model.ServiceRef; import org.eclipse.bpel.model.Source; import org.eclipse.bpel.model.Sources; import org.eclipse.bpel.model.Target; import org.eclipse.bpel.model.Targets; import org.eclipse.bpel.model.TerminationHandler; import org.eclipse.bpel.model.Throw; import org.eclipse.bpel.model.To; import org.eclipse.bpel.model.ToPart; import org.eclipse.bpel.model.ToParts; import org.eclipse.bpel.model.Validate; import org.eclipse.bpel.model.Variable; import org.eclipse.bpel.model.Variables; import org.eclipse.bpel.model.Wait; import org.eclipse.bpel.model.While; import org.eclipse.bpel.model.extensions.BPELActivityDeserializer; import org.eclipse.bpel.model.extensions.BPELExtensionDeserializer; import org.eclipse.bpel.model.extensions.BPELExtensionRegistry; import org.eclipse.bpel.model.extensions.BPELUnknownExtensionDeserializer; import org.eclipse.bpel.model.extensions.ServiceReferenceDeserializer; import org.eclipse.bpel.model.impl.FromImpl; import org.eclipse.bpel.model.impl.FromPartImpl; import org.eclipse.bpel.model.impl.OnEventImpl; import org.eclipse.bpel.model.impl.OnMessageImpl; import org.eclipse.bpel.model.impl.PartnerActivityImpl; import org.eclipse.bpel.model.impl.ToImpl; import org.eclipse.bpel.model.impl.ToPartImpl; import org.eclipse.bpel.model.messageproperties.Property; import org.eclipse.bpel.model.messageproperties.util.MessagepropertiesConstants; import org.eclipse.bpel.model.proxy.CorrelationSetProxy; import org.eclipse.bpel.model.proxy.LinkProxy; import org.eclipse.bpel.model.proxy.MessageExchangeProxy; import org.eclipse.bpel.model.proxy.MessageProxy; import org.eclipse.bpel.model.proxy.PartnerLinkProxy; import org.eclipse.bpel.model.proxy.PartnerLinkTypeProxy; import org.eclipse.bpel.model.proxy.PropertyProxy; import org.eclipse.bpel.model.proxy.RoleProxy; import org.eclipse.bpel.model.proxy.VariableProxy; import org.eclipse.bpel.model.proxy.XSDElementDeclarationProxy; import org.eclipse.bpel.model.proxy.XSDTypeDefinitionProxy; import org.eclipse.bpel.model.util.BPELConstants; import org.eclipse.bpel.model.util.BPELUtils; import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.WrappedException; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.resource.Resource; import org.eclipse.wst.wsdl.Message; import org.eclipse.wst.wsdl.PortType; import org.eclipse.xsd.XSDElementDeclaration; import org.eclipse.xsd.XSDTypeDefinition; import org.eclipse.xsd.util.XSDConstants; import org.w3c.dom.Attr; import org.w3c.dom.CDATASection; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.w3c.dom.Text; import org.xml.sax.ErrorHandler; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; import org.xml.sax.SAXParseException; /** * BPELReader is invoked from BPELResourceImpl to parse the BPEL file and * create a Process object. */ @SuppressWarnings("nls") public class BPELReader implements ErrorHandler { // The process we are reading private Process process = null; // Bugzilla 324165 // The resource we are reading from private Resource fCurrentResource = null; // The successfully loaded resource private Resource fResource = null; // The document builder controls various DOM characteristics private DocumentBuilder docBuilder = null; // Registry for extensibility element serializers and deserializers private BPELExtensionRegistry extensionRegistry = BPELExtensionRegistry.getInstance(); private DOMParser fDOMParser; /** The XML Error handler */ ErrorHandler fErrorHandler = null; /** The WS-BPEL Specification says how to resolve variables, taking into * account scopes, etc. Technically, no one should override this behavior, * but replacing this field with another implementation could allow * you to optimize the search or provide different behavior. */ public static VariableResolver VARIABLE_RESOLVER = new BPELVariableResolver(); /** * The WS-BPEL Specification says how to resolve links, taking into * account scopes, etc. Technically, no one should override this behavior, * but replacing this field with another implementation could allow * you to optimize the search or provide different behavior. */ public static LinkResolver LINK_RESOLVER = new BPELLinkResolver(); List<Runnable> fPass2Runnables = new ArrayList<Runnable>(); /** * Construct a new BPELReader using the given DocumentBuilder to determine * how the DOM tree is constructed. * * @param builder the document builder to use when parsing the file * @throws IOException if no document builder is specified */ public BPELReader (DocumentBuilder builder) throws IOException { if (builder == null) { throw new IOException(BPELPlugin.INSTANCE.getString("%BPELReader.missing_doc_builder")); } this.docBuilder = builder; } /** * @param parser */ public BPELReader (DOMParser parser ) { this.fDOMParser = parser; } /** * Read from the given Document into the given resource. * * @param resource the EMF resource to construct * @param Document the document to read the BPEL from */ public void read(BPELResource resource, Document doc) { this.fResource = resource; // Pass 1 and 2 are inside the try so they don't occur if // an error happens during parsing. // In pass 1 we parse and create the structural elements and attributes. pass1(doc); // In pass 2, we run any postLoadRunnables which need to happen after // pass 1 (for example, establishing object links to variables). pass2(); } /** * */ public BPELReader () { this.fDOMParser = new LineCapturingDOMParser(); // domParser.setProperty("http://xml.org/sax/features/namespaces",true); try { fDOMParser.setFeature( "http://apache.org/xml/features/dom/defer-node-expansion", false ); fDOMParser.setFeature( "http://apache.org/xml/features/xinclude", false); } catch (SAXNotRecognizedException e) { BPELPlugin.log("Not Recognized DOM Parser Feature",e ); } catch (SAXNotSupportedException e) { BPELPlugin.log("Not Supported DOM Parser Feature",e ); } } /** * Set the error handler * @param errorHandler */ public void setErrorHandler ( ErrorHandler errorHandler ) { fErrorHandler = errorHandler; } void armErrorHandler ( ) { assert (docBuilder != null || fDOMParser != null); if (docBuilder != null) { docBuilder.setErrorHandler(fErrorHandler != null ? fErrorHandler : this); } else { fDOMParser.setErrorHandler(fErrorHandler != null ? fErrorHandler : this); } } Document read ( InputSource inputSource ) throws IOException, SAXException { assert (docBuilder != null || fDOMParser != null) : "No document builder/parser set"; if (docBuilder != null) { return docBuilder.parse(inputSource); } fDOMParser.parse(inputSource); return fDOMParser.getDocument(); } /** * Read from the given input stream into the given resource. * * @param resource the EMF resource to construct * @param inputStream the input stream to read the BPEL from */ public void read (BPELResource resource, InputStream inputStream) { armErrorHandler (); Document doc = null; try { InputSource inputSource = new InputSource(inputStream); inputSource.setPublicId( resource.getURI().toString() ); inputSource.setSystemId( resource.getURI().toString() ); resource.setErrorHandler(fErrorHandler != null ? fErrorHandler : this); // Bugzilla 324165 // set the resource currently being loaded so the error handler can // attach diagnostics to it fCurrentResource = resource; doc = read ( inputSource ); // After the document has successfully parsed, it's okay // to assign the resource. fResource = resource; } catch (SAXException sax) { // the error handlers will catch this. } catch (IOException ioe) { BPELPlugin.log("I/O Error Reading BPEL XML", ioe ) ; } finally { } // Bugzilla 324165 if (doc != null) { pass1(doc); pass2(); } fCurrentResource = null; } /** * Return the resource that was used to read in this BPEL process. * * @return the resource that was used to read in this BPEL process. */ public Resource getResource () { return fResource; } /** * @param xmlSource the XML source * @param sourceDescription some textual description of the source (for example Clipboard). * @return a list of objects */ public List<EObject> fromXML ( String xmlSource , String sourceDescription , Resource resource ) { armErrorHandler (); if (sourceDescription == null) { sourceDescription = "String"; } Document doc = null; try { InputSource inputSource = new InputSource(new StringReader ( xmlSource )); inputSource.setPublicId( sourceDescription ); // Bugzilla 324165 // set the resource currently being loaded so the error handler can // attach diagnostics to it fCurrentResource = resource; doc = read (inputSource); } catch (SAXException sax) { // done by the handler. } catch (IOException ioe) { BPELPlugin.log("I/O Error Reading BPEL XML", ioe ) ; } finally { } if (doc == null) { fCurrentResource = null; return Collections.emptyList(); } fResource = resource; // Pass 1 and 2 are inside the try so they don't occur if // an error happens during parsing. // In pass 1 we parse and create the structural elements and attributes. List<EObject> result = parseDocument(doc); // In pass 2, we run any postLoadRunnables which need to happen after // pass 1 (for example, establishing object links to variables). pass2(); fCurrentResource = null; return result; } /** * In pass 1, we parse and create the structural elements and attributes, * and add the process to the EMF resource's contents * @param document the DOM document to parse */ protected void pass1 (Document document) { Process p = xml2Resource(document); if (p != null) { fResource.getContents().add(p); } } /** * In pass 2, we run any post load runnables which were queued during pass 1. */ protected void pass2() { try { for(Runnable r : fPass2Runnables) { r.run(); } } finally { fPass2Runnables.clear(); } } /** * Returns a list of child nodes of <code>parentElement</code> that are * {@link Element}s. * Returns an empty list if no elements are found. * * @param parentElement the element to find the children of * @return a node list of the children of parentElement */ protected List<Element> getChildElements(Element parentElement) { List<Element> list = new ArrayList<Element>(); NodeList children = parentElement.getChildNodes(); for (int i=0; i < children.getLength(); i++) { if (children.item(i).getNodeType() == Node.ELEMENT_NODE) list.add( (Element) children.item(i)); } return list; } /** * Returns a list of child nodes of <code>parentElement</code> that are * {@link Element}s with a BPEL namespace that have the given <code>localName</code>. * Returns an empty list if no matching elements are found. * * @param parentElement the element to find the children of * @param localName the localName to match against * @return a node list of the matching children of parentElement */ public List<Element> getBPELChildElementsByLocalName(Element parentElement, String localName) { List<Element> list = new ArrayList<Element>(); NodeList children = parentElement.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (localName.equals(node.getLocalName()) && BPELUtils.isBPELElement(node)) { list.add((Element) node); } } return list; } /** * Returns the first child node of <code>parentElement</code> that is an {@link Element} * with a BPEL namespace and the given <code>localName</code>, or <code>null</code> * if a matching element is not found. * * @param parentElement the element to find the children of * @param localName the localName to match against * @return the first matching element, or null if no element was found */ public Element getBPELChildElementByLocalName(Element parentElement, String localName) { NodeList children = parentElement.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (localName.equals(node.getLocalName()) && BPELUtils.isBPELElement(node)) { return (Element) node; } } return null; } /** * Walk from the given element up through its parents, looking for any * xmlns definitions. Collect them all in a map (mapping the prefix to * the namespace value) and return the map. * * @param element the element to get the xmlns definitions for * @return a map of visible xmlns definitions */ protected Map<String,String> getAllNamespacesForElement (Element element) { Map<String,String> nsMap = new HashMap<String,String>(); Node tempNode = element; while (tempNode != null && tempNode.getNodeType() == Node.ELEMENT_NODE) { NamedNodeMap attrs = ((Element)tempNode).getAttributes(); for (int i = 0; i < attrs.getLength(); i++) { Attr attr = (Attr)attrs.item(i); // XML namespace attributes use the reserved namespace "http://www.w3.org/2000/xmlns/". if (XSDConstants.XMLNS_URI_2000.equalsIgnoreCase(attr.getNamespaceURI())) { final String key = BPELUtils.getNSPrefixMapKey(attr.getLocalName()); if (!nsMap.containsKey(key)) { nsMap.put(key, attr.getValue()); } } } tempNode = tempNode.getParentNode(); } return nsMap; } /** * For all attributes of the given element, ensure that their namespace * prefixes are in the resource's prefix-to-namespace-map. * * @param eObject * @param element */ protected void saveNamespacePrefix(EObject eObject, Element element) { Map<String,String> nsMap = null; // lazy init since it may require a new map NamedNodeMap attrs = element.getAttributes(); for (int i=0; i < attrs.getLength(); i++) { Attr attr = (Attr) attrs.item(i); // XML namespace attributes use the reserved namespace "http://www.w3.org/2000/xmlns/". if (XSDConstants.XMLNS_URI_2000.equals(attr.getNamespaceURI())) { if (nsMap == null) { nsMap = BPELUtils.getNamespaceMap(eObject); } nsMap.put(BPELUtils.getNSPrefixMapKey(attr.getLocalName()), attr.getValue()); } } } /** * Given a DOM Element, find the child element which is a BPEL activity * (of some type), parse it, and return the Activity. * * @param element the element in which to find an activity * @return the activity, or null if no activity could be found */ protected Activity getChildActivity(Element element) { NodeList activityElements = element.getChildNodes(); for (int i = 0; i < activityElements.getLength(); i++) { if (activityElements.item(i).getNodeType() != Node.ELEMENT_NODE) { continue; } Element activityElement = (Element)activityElements.item(i); Activity activity = xml2Activity(activityElement); if (activity != null) { return activity; } } return null; } /** * Sets a PartnerLink element for a given EObject. The given activity element * must contain an attribute named "partnerLink". * * @param activityElement the DOM element of the activity * @param eObject the EObject in which to set the partner link */ protected void setPartnerLink(Element activityElement, final EObject eObject, final EReference reference) { if (!activityElement.hasAttribute("partnerLink")) { return; } final String partnerLinkName = activityElement.getAttribute("partnerLink"); // We must do this as a post load runnable because the partner link might not // exist yet. fPass2Runnables.add(new Runnable() { public void run() { PartnerLink targetPartnerLink = BPELUtils.getPartnerLink(eObject, partnerLinkName); if (targetPartnerLink == null) { targetPartnerLink = new PartnerLinkProxy(getResource().getURI(), partnerLinkName); } eObject.eSet(reference, targetPartnerLink); } }); } /** * Sets a Variable element for a given EObject. The given activity element * must contain an attribute with the given name * * @param activityElement the DOM element of the activity * @param eObject the EObject in which to set the variable * @param variableAttrName the name of the attribute containing the variable name * @param reference the EReference which is the variable pointer in EObject */ protected void setVariable(Element activityElement, final EObject eObject, String variableNameAttr, final EReference reference) { if (!activityElement.hasAttribute(variableNameAttr)) { return; } final String variableName = activityElement.getAttribute(variableNameAttr); // We must do this as a post load runnable because the variable might not // exist yet. fPass2Runnables.add(new Runnable() { public void run() { Variable targetVariable = getVariable(eObject, variableName); if (targetVariable == null) { targetVariable = new VariableProxy(getResource().getURI(), variableName); } eObject.eSet(reference, targetVariable); } }); } /** * Find a Property name in element (in the named attribute) and set it * into the given EObject. If EObject is a CorrelationSet, add the property * to the list of properties. If it is a To, set the property. * * @param element the DOM element containing the property name * @param eObject the EObject in which to set the property * @param propertyName the name of the attribute containing the property name */ protected void setProperties(Element element, EObject eObject, String propertyName) { String propertyAttribute = element.getAttribute(propertyName); // added by Grid.Qian // we should permit user add a correlation without properties if(propertyAttribute == null){ return; } StringTokenizer st = new StringTokenizer(propertyAttribute); while (st.hasMoreTokens()) { QName qName = BPELUtils.createQName(element, st.nextToken()); Property property = new PropertyProxy(getResource().getURI(), qName); if (eObject instanceof CorrelationSet) { ((CorrelationSet)eObject).getProperties().add(property); } else if (eObject instanceof To) { ((To)eObject).setProperty(property); } } } /** * Sets a CompensationHandler element for a given eObject. */ protected void setCompensationHandler(Element element, EObject eObject) { Element compensationHandlerElement = getBPELChildElementByLocalName(element, "compensationHandler"); if (compensationHandlerElement != null) { CompensationHandler compensationHandler = xml2CompensationHandler(compensationHandlerElement); xml2ExtensibleElement(compensationHandler, compensationHandlerElement); if (eObject instanceof Invoke) ((Invoke)eObject).setCompensationHandler(compensationHandler); else if (eObject instanceof Scope) ((Scope)eObject).setCompensationHandler(compensationHandler); } } /** * Sets a FaultHandler element for a given extensibleElement. */ protected void setFaultHandler(Element element, BPELExtensibleElement extensibleElement) { List<Element> faultHandlerElements = getBPELChildElementsByLocalName(element, "faultHandlers"); if (faultHandlerElements.size() > 0) { FaultHandler faultHandler = xml2FaultHandler(faultHandlerElements.get(0)); if (extensibleElement instanceof Process) { ((Process)extensibleElement).setFaultHandlers(faultHandler); } else if (extensibleElement instanceof Invoke) { ((Invoke)extensibleElement).setFaultHandler(faultHandler); } } } /** * Sets a EventHandler element for a given extensibleElement. */ protected void setEventHandler(Element element, BPELExtensibleElement extensibleElement) { List<Element> eventHandlerElements = getBPELChildElementsByLocalName(element, "eventHandlers"); if (eventHandlerElements.size() > 0) { EventHandler eventHandler = xml2EventHandler(eventHandlerElements.get(0)); if (extensibleElement instanceof Process) ((Process)extensibleElement).setEventHandlers(eventHandler); else if (extensibleElement instanceof Scope) ((Scope)extensibleElement).setEventHandlers(eventHandler); } } /** * Sets the standard attributes (name, joinCondition, and suppressJoinFailure). */ protected void setStandardAttributes(Element activityElement, Activity activity) { // Set name Attr name = activityElement.getAttributeNode("name"); if (name != null && name.getSpecified()) activity.setName(name.getValue()); // Set suppress join failure Attr suppressJoinFailure = activityElement.getAttributeNode("suppressJoinFailure"); if (suppressJoinFailure != null && suppressJoinFailure.getSpecified()) activity.setSuppressJoinFailure( Boolean.valueOf( suppressJoinFailure.getValue().equals("yes"))); } /** * Sets name, portType, operation, partner, variable and correlation for a given PartnerActivity object. */ protected void setOperationParms(final Element activityElement, final PartnerActivity activity, EReference variableReference, EReference inputVariableReference, EReference outputVariableReference, EReference partnerReference) { // Set partnerLink setPartnerLink(activityElement, activity, partnerReference); // Set portType PortType portType = null; if (activityElement.hasAttribute("portType")) { portType = BPELUtils.getPortType(getResource().getURI(), activityElement, "portType"); activity.setPortType(portType); } // Set operation if (activityElement.hasAttribute("operation")) { if (portType != null) { activity.setOperation(BPELUtils.getOperation(getResource().getURI(), portType, activityElement, "operation")); } else { ((PartnerActivityImpl) activity).setOperationName(activityElement.getAttribute("operation")); } } // Set variable if (variableReference != null) { setVariable(activityElement, activity, "variable", variableReference); } if (inputVariableReference != null) { setVariable(activityElement, activity, "inputVariable", inputVariableReference); } if (outputVariableReference != null) { setVariable(activityElement, activity, "outputVariable", outputVariableReference); } // Set correlations Element correlationsElement = getBPELChildElementByLocalName(activityElement, "correlations"); if (correlationsElement != null) { Correlations correlations = xml2Correlations(correlationsElement); activity.setCorrelations(correlations); } } /** * Sets name, portType, operation, partner, variable and correlation for a given PartnerActivity object. */ protected void setOperationParmsOnMessage(final Element activityElement, final OnMessage onMessage) { // Set partnerLink setPartnerLink(activityElement, onMessage, BPELPackage.eINSTANCE.getOnMessage_PartnerLink()); // Set portType PortType portType = null; if (activityElement.hasAttribute("portType")) { portType = BPELUtils.getPortType(getResource().getURI(), activityElement, "portType"); onMessage.setPortType(portType); } // Set operation if (activityElement.hasAttribute("operation")) { if (portType != null) { onMessage.setOperation(BPELUtils.getOperation(getResource().getURI(), portType, activityElement, "operation")); } else { // If portType is not specified it will be resolved lazily and so will the operation. // Save the deserialized name so the operation can be later resolved. ((OnMessageImpl) onMessage).setOperationName(activityElement.getAttribute("operation")); } } // Set variable setVariable(activityElement, onMessage, "variable", BPELPackage.eINSTANCE.getOnMessage_Variable()); // Set correlations Element correlationsElement = getBPELChildElementByLocalName(activityElement, "correlations"); if (correlationsElement != null) { Correlations correlations = xml2Correlations(correlationsElement); onMessage.setCorrelations(correlations); } } /** * Sets name, portType, operation, partner, variable, messageType and correlation for a given PartnerActivity object. */ protected void setOperationParmsOnEvent(final Element activityElement, final OnEvent onEvent) { // Set partnerLink setPartnerLink(activityElement, onEvent, BPELPackage.eINSTANCE.getOnEvent_PartnerLink()); // Set portType PortType portType = null; if (activityElement.hasAttribute("portType")) { portType = BPELUtils.getPortType(getResource().getURI(), activityElement, "portType"); onEvent.setPortType(portType); } // Set operation if (activityElement.hasAttribute("operation")) { if (portType != null) { onEvent.setOperation(BPELUtils.getOperation(getResource().getURI(), portType, activityElement, "operation")); } else { ((OnEventImpl) onEvent).setOperationName(activityElement.getAttribute("operation")); } } // Set variable if (activityElement.hasAttribute("variable")) { Variable variable = BPELFactory.eINSTANCE.createVariable(); // Set name String name = activityElement.getAttribute("variable"); variable.setName(name); onEvent.setVariable(variable); // Don't set the message type of the variable, this will happen // in the next step. } // Set message type if (activityElement.hasAttribute("messageType")) { QName qName = BPELUtils.createAttributeValue(activityElement, "messageType"); Message messageType = new MessageProxy(getResource().getURI(), qName); onEvent.setMessageType(messageType); } // https://bugs.eclipse.org/bugs/show_bug.cgi?id=336003 // "element" attribute was missing from original model // Set xsd element if (activityElement.hasAttribute("element")) { QName qName = BPELUtils.createAttributeValue(activityElement, "element"); XSDElementDeclaration element = new XSDElementDeclarationProxy( getResource().getURI(), qName); onEvent.setXSDElement(element); } else { onEvent.setXSDElement(null); } // Set correlations Element correlationsElement = getBPELChildElementByLocalName(activityElement, "correlations"); if (correlationsElement != null) { Correlations correlations = xml2Correlations(correlationsElement); onEvent.setCorrelations(correlations); } } /** * */ protected List<EObject> parseDocument (Document document) { Element element = (document != null)? document.getDocumentElement(): null; List<EObject> list = new ArrayList<EObject>(); if (element == null) { return list; } if (element.getLocalName().equals("bag")) { for(Node n = element.getFirstChild(); n != null; n = n.getNextSibling()) { if (n instanceof Element == false) { continue; } EObject next = parseElement ( (Element) n ); if (next != null) { list.add(next); } } } else { EObject next = parseElement(element); if (next != null) { list.add(next); } } return list; } EObject parseElement ( Element element ) { Method parseMethod = getParseMethod ( element ); if (parseMethod == null) { return null; } try { return (EObject) parseMethod.invoke(this, element) ; } catch (Throwable t) { t.printStackTrace(); // } return null; } Method getParseMethod ( Element element ) { if (BPELUtils.isBPELElement( element ) == false) { return null; } String methodName = element.getLocalName(); methodName = "xml2" + Character.toUpperCase(methodName.charAt(0)) + methodName.substring(1); return lookupMethod ( getClass(), methodName, Element.class ); } Method lookupMethod ( Class<?> target, String methodName, Class<?> ... args ) { if (target == null || target == Object.class) { return null ; } for(Method m : target.getDeclaredMethods()) { if (methodName.equals(m.getName()) == false || m.getParameterTypes().length != args.length ) { continue; } Class<?> argTypes[] = m.getParameterTypes(); for(int i=0; i < args.length; i++) { if (argTypes[i].isAssignableFrom(args[i]) == false) { continue; } } return m; } return lookupMethod(target.getSuperclass(), methodName, args); } /** * Converts an XML document to a BPEL Resource object. */ protected Process xml2Resource(Document document) { Element processElement = (document != null)? document.getDocumentElement(): null; if (processElement == null) { return null; } return xml2Process(processElement); } /** * Converts an XML process to a BPEL Process object. */ @SuppressWarnings("nls") protected Process xml2Process(Element processElement) { if (!processElement.getLocalName().equals("process")) { return null; } if (!BPELConstants.isBPELNamespace(processElement.getNamespaceURI())) { return null; } process = BPELFactory.eINSTANCE.createProcess(); process.setElement(processElement); // Save all the references to external namespaces saveNamespacePrefix(process, processElement); // Handle Process element if (processElement.hasAttribute("name")) process.setName(processElement.getAttribute("name")); if (processElement.hasAttribute("targetNamespace")) process.setTargetNamespace(processElement.getAttribute("targetNamespace")); if (processElement.hasAttribute("suppressJoinFailure")) process.setSuppressJoinFailure( Boolean.valueOf( processElement.getAttribute("suppressJoinFailure").equals("yes"))); if (processElement.hasAttribute("exitOnStandardFault")) process.setExitOnStandardFault( Boolean.valueOf( processElement.getAttribute("exitOnStandardFault").equals("yes"))); if (processElement.hasAttribute("variableAccessSerializable")) process.setVariableAccessSerializable( Boolean.valueOf( processElement.getAttribute("variableAccessSerializable").equals("yes"))); if (processElement.hasAttribute("queryLanguage")) process.setQueryLanguage(processElement.getAttribute("queryLanguage")); if (processElement.hasAttribute("expressionLanguage")) process.setExpressionLanguage(processElement.getAttribute("expressionLanguage")); // Handle Import Elements for(Element e : getBPELChildElementsByLocalName(processElement, "import")) { process.getImports().add(xml2Import(e)); } // Handle PartnerLinks Element Element partnerLinksElement = getBPELChildElementByLocalName(processElement, "partnerLinks"); if (partnerLinksElement != null) process.setPartnerLinks(xml2PartnerLinks(partnerLinksElement)); // Handle Variables Element Element variablesElement = getBPELChildElementByLocalName(processElement, "variables"); if (variablesElement != null) process.setVariables(xml2Variables(variablesElement)); // Handle CorrelationSets Element Element correlationSetsElement = getBPELChildElementByLocalName(processElement, "correlationSets"); if (correlationSetsElement != null) process.setCorrelationSets(xml2CorrelationSets(correlationSetsElement)); // Handle MessageExchanges Element Element messageExchangesElements = getBPELChildElementByLocalName(processElement, "messageExchanges"); if (messageExchangesElements != null) process.setMessageExchanges(xml2MessageExchanges(messageExchangesElements)); // Handle Extensions Element Element extensionsElement = getBPELChildElementByLocalName(processElement, "extensions"); if (extensionsElement != null) process.setExtensions(xml2Extensions(extensionsElement)); // Handle FaultHandler element setFaultHandler(processElement, process); // Handle CompensationHandler element // In BPEL 2.0, there is no compensation handler on process //setCompensationHandler(processElement, process); // Handle EventHandler element setEventHandler(processElement, process); // Handle Activity elements Activity activity = xml2Activity(processElement); process.setActivity(activity); xml2ExtensibleElement(process,processElement); return process; } /** * Converts an XML partnerLinks */ public PartnerLinks xml2PartnerLinks(Element partnerLinksElement) { if (!partnerLinksElement.getLocalName().equals("partnerLinks")) { return null; } PartnerLinks partnerLinks = BPELFactory.eINSTANCE.createPartnerLinks(); partnerLinks.setElement(partnerLinksElement); // Save all the references to external namespaces saveNamespacePrefix(partnerLinks, partnerLinksElement); for(Element e : getBPELChildElementsByLocalName(partnerLinksElement, "partnerLink")) { partnerLinks.getChildren().add( xml2PartnerLink(e) ); } xml2ExtensibleElement(partnerLinks, partnerLinksElement); return partnerLinks; } public Variables xml2Variables(Element variablesElement) { if (!variablesElement.getLocalName().equals("variables")) return null; Variables variables = BPELFactory.eINSTANCE.createVariables(); variables.setElement(variablesElement); // Save all the references to external namespaces saveNamespacePrefix(variables, variablesElement); for(Element e : getBPELChildElementsByLocalName(variablesElement, "variable")) { variables.getChildren().add( xml2Variable( e ) ); } xml2ExtensibleElement(variables, variablesElement); // Move variables that are extensibility elements to the list of children // JM: What is this supposed to accomplish? List<Variable> toBeMoved = new BasicEList<Variable>(); for (Object next : variables.getExtensibilityElements() ) { if (next instanceof Variable) { toBeMoved.add((Variable) next); } } List<?> extensibility = variables.getExtensibilityElements(); List<Variable> children = variables.getChildren(); for(Variable element : toBeMoved) { extensibility.remove(element); children.add(element); } return variables; } public CorrelationSets xml2CorrelationSets(Element correlationSetsElement) { if (!correlationSetsElement.getLocalName().equals("correlationSets")) return null; CorrelationSets correlationSets = BPELFactory.eINSTANCE.createCorrelationSets(); correlationSets.setElement(correlationSetsElement); // Save all the references to external namespaces saveNamespacePrefix(correlationSets, correlationSetsElement); for(Element e : getBPELChildElementsByLocalName(correlationSetsElement, "correlationSet")) { correlationSets.getChildren().add(xml2CorrelationSet(e)); } xml2ExtensibleElement(correlationSets, correlationSetsElement); return correlationSets; } protected FromParts xml2FromParts(Element fromPartsElement) { if (!fromPartsElement.getLocalName().equals("fromParts")) return null; FromParts fromParts = BPELFactory.eINSTANCE.createFromParts(); fromParts.setElement(fromPartsElement); // Save all the references to external namespaces saveNamespacePrefix(fromParts, fromPartsElement); for(Element e : getBPELChildElementsByLocalName(fromPartsElement, "fromPart")) { fromParts.getChildren().add(xml2FromPart(e)); } xml2ExtensibleElement(fromParts, fromPartsElement); return fromParts; } protected ToParts xml2ToParts(Element toPartsElement) { if (!toPartsElement.getLocalName().equals("toParts")) return null; ToParts toParts = BPELFactory.eINSTANCE.createToParts(); toParts.setElement(toPartsElement); // Save all the references to external namespaces saveNamespacePrefix(toParts, toPartsElement); for(Element e : getBPELChildElementsByLocalName(toPartsElement, "toPart")) { toParts.getChildren().add(xml2ToPart(e)); } xml2ExtensibleElement(toParts, toPartsElement); return toParts; } public MessageExchanges xml2MessageExchanges(Element messageExchangesElement) { if (!messageExchangesElement.getLocalName().equals("messageExchanges")) return null; MessageExchanges messageExchanges = BPELFactory.eINSTANCE.createMessageExchanges(); messageExchanges.setElement(messageExchangesElement); // Save all the references to external namespaces saveNamespacePrefix(messageExchanges, messageExchangesElement); for(Element e : getBPELChildElementsByLocalName(messageExchangesElement, "messageExchange")) { messageExchanges.getChildren().add(xml2MessageExchange(e)); } xml2ExtensibleElement(messageExchanges, messageExchangesElement); return messageExchanges; } protected Extensions xml2Extensions(Element extensionsElement) { if (!extensionsElement.getLocalName().equals("extensions")) return null; Extensions extensions = BPELFactory.eINSTANCE.createExtensions(); extensions.setElement(extensionsElement); // Save all the references to external namespaces saveNamespacePrefix(extensions, extensionsElement); for(Element e : getBPELChildElementsByLocalName(extensionsElement, "extension")) { extensions.getChildren().add(xml2Extension(e)); } xml2ExtensibleElement(extensions, extensionsElement); return extensions; } /** * Converts an XML compensationHandler element to a BPEL CompensationHandler object. */ protected CompensationHandler xml2CompensationHandler(Element activityElement) { CompensationHandler compensationHandler = BPELFactory.eINSTANCE.createCompensationHandler(); compensationHandler.setElement(activityElement); // Save all the references to external namespaces saveNamespacePrefix(compensationHandler, activityElement); compensationHandler.setActivity(getChildActivity(activityElement)); return compensationHandler; } /** * Converts an XML correlationSet element to a BPEL CorrelationSet object. */ protected CorrelationSet xml2CorrelationSet(Element correlationSetElement) { CorrelationSet correlationSet = BPELFactory.eINSTANCE.createCorrelationSet(); correlationSet.setElement(correlationSetElement); // Save all the references to external namespaces saveNamespacePrefix(correlationSet, correlationSetElement); if (correlationSetElement == null) return correlationSet; // Set name Attr name = correlationSetElement.getAttributeNode("name"); if (name != null && name.getSpecified()) correlationSet.setName(name.getValue()); setProperties(correlationSetElement, correlationSet, "properties"); xml2ExtensibleElement(correlationSet, correlationSetElement); return correlationSet; } /** * Converts an XML messageExchange element to a BPEL MessageExchange object. */ protected MessageExchange xml2MessageExchange(Element messageExchangeElement) { if (!messageExchangeElement.getLocalName().equals("messageExchange")) return null; MessageExchange messageExchange = BPELFactory.eINSTANCE.createMessageExchange(); messageExchange.setElement(messageExchangeElement); // Save all the references to external namespaces saveNamespacePrefix(messageExchange, messageExchangeElement); // Set name if (messageExchangeElement.hasAttribute("name")) messageExchange.setName(messageExchangeElement.getAttribute("name")); xml2ExtensibleElement(messageExchange, messageExchangeElement); return messageExchange; } /** * Converts an XML extension element to a BPEL Extension object. */ protected Extension xml2Extension(Element extensionElement) { Extension extension = BPELFactory.eINSTANCE.createExtension(); extension.setElement(extensionElement); // Save all the references to external namespaces saveNamespacePrefix(extension, extensionElement); if (extensionElement == null) return extension; // Set namespace if (extensionElement.hasAttribute("namespace")) extension.setNamespace(extensionElement.getAttribute("namespace")); // Set mustUnderstand if (extensionElement.hasAttribute("mustUnderstand")) extension.setMustUnderstand( Boolean.valueOf( extensionElement.getAttribute("mustUnderstand").equals("yes"))); xml2ExtensibleElement(extension, extensionElement); return extension; } /** * Converts an XML partnerLink element to a BPEL PartnerLink object. */ protected PartnerLink xml2PartnerLink(Element partnerLinkElement) { if (!partnerLinkElement.getLocalName().equals("partnerLink")) return null; PartnerLink partnerLink = BPELFactory.eINSTANCE.createPartnerLink(); partnerLink.setElement(partnerLinkElement); // Save all the references to external namespaces saveNamespacePrefix(partnerLink, partnerLinkElement); // Set name if (partnerLinkElement.hasAttribute("name")) partnerLink.setName(partnerLinkElement.getAttribute("name")); if (partnerLinkElement.hasAttribute("initializePartnerRole")) partnerLink.setInitializePartnerRole( Boolean.valueOf( partnerLinkElement.getAttribute("initializePartnerRole").equals("yes"))); Attr partnerLinkTypeName = partnerLinkElement.getAttributeNode("partnerLinkType"); if (partnerLinkTypeName != null && partnerLinkTypeName.getSpecified()) { QName sltQName = BPELUtils.createAttributeValue(partnerLinkElement, "partnerLinkType"); PartnerLinkTypeProxy slt = new PartnerLinkTypeProxy(getResource().getURI(), sltQName); partnerLink.setPartnerLinkType(slt); if(slt != null) { partnerLink.setPartnerLinkType(slt); if (partnerLinkElement.hasAttribute("myRole")) { RoleProxy role = new RoleProxy(getResource(), slt, partnerLinkElement.getAttribute("myRole")); partnerLink.setMyRole(role); } if (partnerLinkElement.hasAttribute("partnerRole")) { RoleProxy role = new RoleProxy(getResource(), slt, partnerLinkElement.getAttribute("partnerRole")); partnerLink.setPartnerRole(role); } } } xml2ExtensibleElement(partnerLink,partnerLinkElement); return partnerLink; } /** * Converts an XML variable element to a BPEL Variable object. */ protected Variable xml2Variable(Element variableElement) { if (!variableElement.getLocalName().equals("variable")) return null; Variable variable = BPELFactory.eINSTANCE.createVariable(); variable.setElement(variableElement); // Save all the references to external namespaces saveNamespacePrefix(variable, variableElement); // Set name if (variableElement.hasAttribute("name")) { String name = variableElement.getAttribute("name"); variable.setName(name); } if (variableElement.hasAttribute("messageType")) { QName qName = BPELUtils.createAttributeValue(variableElement,"messageType"); Message messageType = new MessageProxy(getResource().getURI(), qName); variable.setMessageType(messageType); } // Set xsd type if (variableElement.hasAttribute("type")) { QName qName = BPELUtils.createAttributeValue(variableElement, "type"); XSDTypeDefinition type = new XSDTypeDefinitionProxy(getResource().getURI(), qName); variable.setType(type); } // Set xsd element if (variableElement.hasAttribute("element")) { QName qName = BPELUtils.createAttributeValue(variableElement, "element"); XSDElementDeclaration element = new XSDElementDeclarationProxy(getResource().getURI(), qName); variable.setXSDElement(element); } // from-spec Element fromElement = getBPELChildElementByLocalName(variableElement, "from"); if (fromElement != null) { From from = BPELFactory.eINSTANCE.createFrom(); from.setElement(fromElement); xml2From(from, fromElement); variable.setFrom(from); } xml2ExtensibleElement(variable,variableElement); return variable; } /** * Converts an XML faultHandler element to a BPEL FaultHandler object. */ protected FaultHandler xml2FaultHandler(Element faultHandlerElement) { String localName = faultHandlerElement.getLocalName(); if (!(localName.equals("faultHandlers") || localName.equals("invoke"))) return null; FaultHandler faultHandler = BPELFactory.eINSTANCE.createFaultHandler(); if (localName.equals("faultHandlers")) { // This is "overloaded", what's the proper facade for the fault handler element in this case. faultHandler.setElement(faultHandlerElement); } // Save all the references to external namespaces saveNamespacePrefix(faultHandler, faultHandlerElement); for(Element e : getBPELChildElementsByLocalName(faultHandlerElement, "catch")) { faultHandler.getCatch().add( xml2Catch(e)); } Element catchAllElement = getBPELChildElementByLocalName(faultHandlerElement, "catchAll"); if (catchAllElement != null) { CatchAll catchAll = xml2CatchAll(catchAllElement); faultHandler.setCatchAll(catchAll); } // Only do this for an element named faultHandlers. If the element is named // invoke, then there really is no fault handler, only a series of catches. if (faultHandlerElement.getLocalName().equals("faultHandlers")) { xml2ExtensibleElement(faultHandler, faultHandlerElement); } return faultHandler; } /** * Converts an XML catchAll element to a BPEL CatchAll object. */ protected CatchAll xml2CatchAll(Element catchAllElement) { if (!catchAllElement.getLocalName().equals("catchAll")) return null; CatchAll catchAll = BPELFactory.eINSTANCE.createCatchAll(); catchAll.setElement(catchAllElement); // Save all the references to external namespaces saveNamespacePrefix(catchAll, catchAllElement); for(Element e : getChildElements(catchAllElement)) { Activity activity = xml2Activity(e); if (activity != null) { catchAll.setActivity(activity); break; } } xml2ExtensibleElement(catchAll, catchAllElement); return catchAll; } /** * Converts an XML catch element to a BPEL Catch object. */ protected Catch xml2Catch(Element catchElement) { Catch _catch = BPELFactory.eINSTANCE.createCatch(); _catch.setElement(catchElement); // Save all the references to external namespaces saveNamespacePrefix(_catch, catchElement); if (catchElement == null) return _catch; if (catchElement.hasAttribute("faultName")) { QName qName = BPELUtils.createAttributeValue(catchElement, "faultName"); _catch.setFaultName(qName); } if (catchElement.hasAttribute("faultVariable")) { // Set fault variable Variable variable = BPELFactory.eINSTANCE.createVariable(); // TODO: Should not this be the variable proxy ? variable.setName(catchElement.getAttribute("faultVariable")); _catch.setFaultVariable(variable); } if (catchElement.hasAttribute("faultMessageType")) { QName qName = BPELUtils.createAttributeValue(catchElement,"faultMessageType"); Message messageType = new MessageProxy(getResource().getURI(), qName); _catch.setFaultMessageType(messageType); } if (catchElement.hasAttribute("faultElement")) { QName qName = BPELUtils.createAttributeValue(catchElement,"faultElement"); XSDElementDeclaration element = new XSDElementDeclarationProxy(getResource().getURI(), qName); _catch.setFaultElement(element); } // Set Activities NodeList catchElements = catchElement.getChildNodes(); Element activityElement = null; if (catchElements != null && catchElements.getLength() > 0) { for (int i = 0; i < catchElements.getLength(); i++) { if (catchElements.item(i).getNodeType() != Node.ELEMENT_NODE) { continue; } activityElement = (Element)catchElements.item(i); Activity activity = xml2Activity(activityElement); if (activity != null) { _catch.setActivity(activity); break; } } } xml2ExtensibleElement(_catch, catchElement); return _catch; } /** * Converts an XML activity element to a BPEL Activity object. */ public Activity xml2Activity(Element activityElement) { Activity activity = null; boolean checkExtensibility = true; if (!BPELUtils.isBPELElement(activityElement)) return null; String localName = activityElement.getLocalName(); if (localName.equals("process")){ activity = getChildActivity(activityElement); checkExtensibility = false; } else if (localName.equals("receive")) { activity = xml2Receive(activityElement); } else if (localName.equals("reply")) { activity = xml2Reply(activityElement); } else if (localName.equals("invoke")) { activity = xml2Invoke(activityElement); } else if (localName.equals("assign")) { activity = xml2Assign(activityElement); } else if (localName.equals("throw")) { activity = xml2Throw(activityElement); } else if (localName.equals("exit")) { activity = xml2Exit(activityElement); } else if (localName.equals("wait")) { activity = xml2Wait(activityElement); } else if (localName.equals("empty")) { activity = xml2Empty(activityElement); } else if (localName.equals("sequence")) { activity = xml2Sequence(activityElement); } else if (localName.equals("if")) { activity = xml2If(activityElement); } else if (localName.equals("while")) { activity = xml2While(activityElement); } else if (localName.equals("pick")) { activity = xml2Pick(activityElement); } else if (localName.equals("flow")) { activity = xml2Flow(activityElement); } else if (localName.equals("scope")) { activity = xml2Scope(activityElement); } else if (localName.equals("compensate")) { activity = xml2Compensate(activityElement); } else if (localName.equals("compensateScope")) { activity = xml2CompensateScope(activityElement); } else if (localName.equals("rethrow")) { activity = xml2Rethrow(activityElement); } else if (localName.equals("extensionActivity")) { // extensionActivity is a special case. It does not have any standard // attributes or elements, nor is it an extensible element. // Return immediately. activity = xml2ExtensionActivity(activityElement); return activity; } else if (localName.equals("opaqueActivity")) { activity = xml2OpaqueActivity(activityElement); } else if (localName.equals("forEach")) { activity = xml2ForEach(activityElement); } else if (localName.equals("repeatUntil")) { activity = xml2RepeatUntil(activityElement); } else if (localName.equals("validate")) { activity = xml2Validate(activityElement); } else { return null; } setStandardElements(activityElement, activity); if (checkExtensibility) { xml2ExtensibleElement(activity, activityElement); // Save all the references to external namespaces saveNamespacePrefix(activity, activityElement); } return activity; } protected void setStandardElements(Element activityElement, Activity activity) { // Handle targets Element targetsElement = getBPELChildElementByLocalName(activityElement, "targets"); if (targetsElement != null) { activity.setTargets(xml2Targets(targetsElement)); } // Handle sources Element sourcesElement = getBPELChildElementByLocalName(activityElement, "sources"); if (sourcesElement != null) { activity.setSources(xml2Sources(sourcesElement)); } } protected Targets xml2Targets(Element targetsElement) { Targets targets = BPELFactory.eINSTANCE.createTargets(); targets.setElement(targetsElement); for(Element e : getBPELChildElementsByLocalName(targetsElement, "target")) { targets.getChildren().add( xml2Target(e)); } // Join condition Element joinConditionElement = getBPELChildElementByLocalName(targetsElement, "joinCondition"); if (joinConditionElement != null) { targets.setJoinCondition(xml2Condition(joinConditionElement)); } xml2ExtensibleElement(targets, targetsElement); return targets; } protected Target xml2Target(Element targetElement) { final Target target = BPELFactory.eINSTANCE.createTarget(); target.setElement(targetElement); // Save all the references to external namespaces saveNamespacePrefix(target, targetElement); xml2ExtensibleElement(target, targetElement); if (targetElement.hasAttribute("linkName")) { final String linkName = targetElement.getAttribute("linkName"); fPass2Runnables.add(new Runnable() { public void run() { Link link = getLink(target.getActivity(), linkName); if (link != null) target.setLink(link); else target.setLink(new LinkProxy(getResource().getURI(), linkName)); } }); } return target; } protected Sources xml2Sources(Element sourcesElement) { Sources sources = BPELFactory.eINSTANCE.createSources(); sources.setElement(sourcesElement); for(Element e : getBPELChildElementsByLocalName(sourcesElement, "source")) { sources.getChildren().add( xml2Source(e)); } xml2ExtensibleElement(sources, sourcesElement); return sources; } protected Source xml2Source(Element sourceElement) { final String linkName = sourceElement.getAttribute("linkName"); final Source source = BPELFactory.eINSTANCE.createSource(); source.setElement(sourceElement); // Save all the references to external namespaces saveNamespacePrefix(source, sourceElement); // Read transitionCondition element Element transitionConditionElement = getBPELChildElementByLocalName(sourceElement, "transitionCondition"); if (transitionConditionElement != null) { Condition transitionCondition = xml2Condition(transitionConditionElement); source.setTransitionCondition(transitionCondition); } xml2ExtensibleElement(source, sourceElement); fPass2Runnables.add(new Runnable() { public void run() { Link link = getLink(source.getActivity(), linkName); if (link != null) source.setLink(link); else source.setLink(new LinkProxy(getResource().getURI(), linkName)); } }); return source; } /** * Converts an XML scope element to a BPEL Scope object. */ protected Activity xml2Scope(Element scopeElement) { Scope scope = BPELFactory.eINSTANCE.createScope(); scope.setElement(scopeElement); //if (scopeElement == null) { // return scope; //} Attr name = scopeElement.getAttributeNode("name"); if (name != null && name.getSpecified()) { scope.setName(name.getValue()); } Attr isolated = scopeElement.getAttributeNode("isolated"); if (isolated != null && isolated.getSpecified()) scope.setIsolated( Boolean.valueOf( isolated.getValue().equals("yes"))); // Handle attribute exitOnStandardFault Attr exitOnStandardFault = scopeElement.getAttributeNode("exitOnStandardFault"); if (exitOnStandardFault != null && exitOnStandardFault.getSpecified()) scope.setExitOnStandardFault( Boolean.valueOf( exitOnStandardFault.getValue().equals("yes"))); // Handle Variables element Element variablesElement = getBPELChildElementByLocalName(scopeElement, "variables"); if (variablesElement != null) { Variables variables = xml2Variables(variablesElement); scope.setVariables(variables); } // Handle CorrelationSet element Element correlationSetsElement = getBPELChildElementByLocalName(scopeElement, "correlationSets"); if (correlationSetsElement != null) { CorrelationSets correlationSets = xml2CorrelationSets(correlationSetsElement); scope.setCorrelationSets(correlationSets); } // Handle PartnerLinks element Element partnerLinksElement = getBPELChildElementByLocalName(scopeElement, "partnerLinks"); if (partnerLinksElement != null) { PartnerLinks partnerLinks = xml2PartnerLinks(partnerLinksElement); scope.setPartnerLinks(partnerLinks); } // MessageExchanges element Element messageExchangesElement = getBPELChildElementByLocalName(scopeElement, "messageExchanges"); if (messageExchangesElement != null) { MessageExchanges messageExchanges = xml2MessageExchanges(messageExchangesElement); scope.setMessageExchanges(messageExchanges); } // Handle FaultHandler element Element faultHandlerElement = getBPELChildElementByLocalName(scopeElement, "faultHandlers"); if (faultHandlerElement != null) { FaultHandler faultHandler = xml2FaultHandler(faultHandlerElement); scope.setFaultHandlers(faultHandler); } // Handle CompensationHandler element setCompensationHandler(scopeElement, scope); // Handler TerminationHandler element Element terminationHandlerElement = getBPELChildElementByLocalName(scopeElement, "terminationHandler"); if (terminationHandlerElement != null) { TerminationHandler terminationHandler = xml2TerminationHandler(terminationHandlerElement); scope.setTerminationHandler(terminationHandler); } // Handler EventHandler element setEventHandler(scopeElement, scope); setStandardAttributes(scopeElement, scope); // Handle activities NodeList scopeElements = scopeElement.getChildNodes(); Element activityElement = null; if (scopeElements != null && scopeElements.getLength() > 0) { for (int i = 0; i < scopeElements.getLength(); i++) { if (scopeElements.item(i).getNodeType() != Node.ELEMENT_NODE) { continue; } activityElement = (Element)scopeElements.item(i); if (activityElement.getLocalName().equals("faultHandlers") || activityElement.getLocalName().equals("compensationHandler")) { continue; } Activity activity = xml2Activity(activityElement); if (activity != null) { scope.setActivity(activity); break; } } } return scope; } /** * Converts an XML flow element to a BPEL Flow object. */ protected Activity xml2Flow(Element flowElement) { Flow flow = BPELFactory.eINSTANCE.createFlow(); flow.setElement(flowElement); // if (flowElement == null) { // return flow; // } Attr name = flowElement.getAttributeNode("name"); if (name != null && name.getSpecified()) flow.setName(name.getValue()); Element linksElement = getBPELChildElementByLocalName(flowElement, "links"); if (linksElement != null) { Links links = xml2Links(linksElement); flow.setLinks(links); } Element completionConditionElement = getBPELChildElementByLocalName(flowElement, "completionCondition"); if (completionConditionElement != null) { CompletionCondition completionCondition = xml2CompletionCondition(completionConditionElement); flow.setCompletionCondition(completionCondition); } setStandardAttributes(flowElement, flow); NodeList flowElements = flowElement.getChildNodes(); Element activityElement = null; if (flowElements != null && flowElements.getLength() > 0) { for (int i = 0; i < flowElements.getLength(); i++) { if ((flowElements.item(i).getNodeType() != Node.ELEMENT_NODE) || ((Element)flowElements.item(i)).getLocalName().equals("links")) continue; activityElement = (Element)flowElements.item(i); Activity activity = xml2Activity(activityElement); if (activity != null) { flow.getActivities().add(activity); } } } return flow; } protected Links xml2Links(Element linksElement) { if (!linksElement.getLocalName().equals("links")) return null; Links links = BPELFactory.eINSTANCE.createLinks(); links.setElement(linksElement); // Save all the references to external namespaces saveNamespacePrefix(links, linksElement); for(Element e : getBPELChildElementsByLocalName(linksElement, "link")) { links.getChildren().add( xml2Link (e)); } // extensibility elements xml2ExtensibleElement(links, linksElement); return links; } /** * Converts an XML link element to a BPEL Link object. */ protected Link xml2Link(Element linkElement) { Link link = BPELFactory.eINSTANCE.createLink(); link.setElement(linkElement); // Save all the references to external namespaces saveNamespacePrefix(link, linkElement); Attr name = linkElement.getAttributeNode("name"); if (name != null && name.getSpecified()) link.setName(name.getValue()); xml2ExtensibleElement(link,linkElement); return link; } /** * Converts an XML pick element to a BPEL Pick object. */ protected Activity xml2Pick(Element pickElement) { Pick pick = BPELFactory.eINSTANCE.createPick(); pick.setElement(pickElement); // Set name Attr name = pickElement.getAttributeNode("name"); if (name != null && name.getSpecified()) pick.setName(name.getValue()); // Set createInstance Attr createInstance = pickElement.getAttributeNode("createInstance"); if (createInstance != null && createInstance.getSpecified()) pick.setCreateInstance(Boolean.valueOf(createInstance.getValue().equals("yes") ? "True":"False")); NodeList pickElements = pickElement.getChildNodes(); Element pickInstanceElement = null; if (pickElements != null && pickElements.getLength() > 0) { for (int i = 0; i < pickElements.getLength(); i++) { if (pickElements.item(i).getNodeType() != Node.ELEMENT_NODE) continue; pickInstanceElement = (Element)pickElements.item(i); if (pickInstanceElement.getLocalName().equals("onAlarm")) { OnAlarm onAlarm = xml2OnAlarm( pickInstanceElement ); pick.getAlarm().add(onAlarm); } else if (pickInstanceElement.getLocalName().equals("onMessage")) { OnMessage onMessage = xml2OnMessage(pickInstanceElement); pick.getMessages().add(onMessage); } } } setStandardAttributes(pickElement, pick); return pick; } /** * Converts an XML eventHandler element to a BPEL eventHandler object. */ protected EventHandler xml2EventHandler(Element eventHandlerElement) { EventHandler eventHandler = BPELFactory.eINSTANCE.createEventHandler(); eventHandler.setElement(eventHandlerElement); // Save all the references to external namespaces saveNamespacePrefix(eventHandler, eventHandlerElement); NodeList eventHandlerElements = eventHandlerElement.getChildNodes(); Element eventHandlerInstanceElement = null; if (eventHandlerElements != null && eventHandlerElements.getLength() > 0) { for (int i = 0; i < eventHandlerElements.getLength(); i++) { if (eventHandlerElements.item(i).getNodeType() != Node.ELEMENT_NODE) continue; eventHandlerInstanceElement = (Element)eventHandlerElements.item(i); if (eventHandlerInstanceElement.getLocalName().equals("onAlarm")) { OnAlarm onAlarm = xml2OnAlarm(eventHandlerInstanceElement); eventHandler.getAlarm().add(onAlarm); } else if (eventHandlerInstanceElement.getLocalName().equals("onEvent")) { OnEvent onEvent = xml2OnEvent(eventHandlerInstanceElement); eventHandler.getEvents().add(onEvent); } } } xml2ExtensibleElement(eventHandler, eventHandlerElement); return eventHandler; } /** * Converts an XML onMessage element to a BPEL OnMessage object. */ protected OnMessage xml2OnMessage(Element onMessageElement) { OnMessage onMessage = BPELFactory.eINSTANCE.createOnMessage(); onMessage.setElement(onMessageElement); // Save all the references to external namespaces saveNamespacePrefix(onMessage, onMessageElement); // Set several parms setOperationParmsOnMessage(onMessageElement, onMessage); // Set activity onMessage.setActivity(getChildActivity(onMessageElement)); // Set fromParts Element fromPartsElement = getBPELChildElementByLocalName(onMessageElement, "fromParts"); if (fromPartsElement != null) { FromParts fromParts = xml2FromParts(fromPartsElement); onMessage.setFromParts(fromParts); } // Set messageExchange setMessageExchange(onMessageElement, onMessage, BPELPackage.eINSTANCE.getOnMessage_MessageExchange()); xml2ExtensibleElement(onMessage, onMessageElement); return onMessage; } /** * Converts an XML onEvent element to a BPEL OnEvent object. */ protected OnEvent xml2OnEvent(Element onEventElement) { OnEvent onEvent = BPELFactory.eINSTANCE.createOnEvent(); onEvent.setElement(onEventElement); // Save all the references to external namespaces saveNamespacePrefix(onEvent, onEventElement); // Set several parms setOperationParmsOnEvent(onEventElement, onEvent); // Set activity onEvent.setActivity(getChildActivity(onEventElement)); // Set fromParts Element fromPartsElement = getBPELChildElementByLocalName(onEventElement, "fromParts"); if (fromPartsElement != null) { FromParts fromParts = xml2FromParts(fromPartsElement); onEvent.setFromParts(fromParts); } // Handle CorrelationSets Element Element correlationSetsElement = getBPELChildElementByLocalName(onEventElement, "correlationSets"); if (correlationSetsElement != null) onEvent.setCorrelationSets(xml2CorrelationSets(correlationSetsElement)); // Set messageExchange setMessageExchange(onEventElement, onEvent, BPELPackage.eINSTANCE.getOnEvent_MessageExchange()); xml2ExtensibleElement(onEvent, onEventElement); return onEvent; } /** * Converts an XML onAlarm element to a BPEL OnAlarm object. */ protected OnAlarm xml2OnAlarm(Element onAlarmElement) { OnAlarm onAlarm = BPELFactory.eINSTANCE.createOnAlarm(); onAlarm.setElement(onAlarmElement); // Save all the references to external namespaces saveNamespacePrefix(onAlarm, onAlarmElement); // Set for element Element forElement = getBPELChildElementByLocalName(onAlarmElement, "for"); if (forElement != null) { Expression expression = xml2Expression(forElement); onAlarm.setFor(expression); } // Set until element Element untilElement = getBPELChildElementByLocalName(onAlarmElement, "until"); if (untilElement != null) { Expression expression = xml2Expression(untilElement); onAlarm.setUntil(expression); } // Set repeatEvery element Element repeatEveryElement = getBPELChildElementByLocalName(onAlarmElement, "repeatEvery"); if (repeatEveryElement != null) { Expression expression = xml2Expression(repeatEveryElement); onAlarm.setRepeatEvery(expression); } // Set activity onAlarm.setActivity(getChildActivity(onAlarmElement)); xml2ExtensibleElement(onAlarm, onAlarmElement); return onAlarm; } /** * Converts an XML while element to a BPEL While object. */ protected Activity xml2While(Element whileElement) { While _while = BPELFactory.eINSTANCE.createWhile(); _while.setElement(whileElement); // Handle condition element Element conditionElement = getBPELChildElementByLocalName(whileElement, "condition"); if (conditionElement != null) { Condition condition = xml2Condition(conditionElement); _while.setCondition(condition); } NodeList whileElements = whileElement.getChildNodes(); Element activityElement = null; if (whileElements != null && whileElements.getLength() > 0) { for (int i = 0; i < whileElements.getLength(); i++) { if (whileElements.item(i).getNodeType() != Node.ELEMENT_NODE) { continue; } activityElement = (Element) whileElements.item(i); Activity activity = xml2Activity(activityElement); if (activity != null) { _while.setActivity(activity); // only the first one break ; } } } setStandardAttributes(whileElement, _while); return _while; } /** * Converts an XML terminationHandler element to a BPEL TerminationHandler object. */ protected TerminationHandler xml2TerminationHandler(Element terminationHandlerElement) { TerminationHandler terminationHandler = BPELFactory.eINSTANCE.createTerminationHandler(); terminationHandler.setElement(terminationHandlerElement); // Save all the references to external namespaces saveNamespacePrefix(terminationHandler, terminationHandlerElement); terminationHandler.setActivity(getChildActivity(terminationHandlerElement)); xml2ExtensibleElement(terminationHandler, terminationHandlerElement); return terminationHandler; } /** * Converts an XML if element to a BPEL If object. */ protected Activity xml2If(Element ifElement) { If _if = BPELFactory.eINSTANCE.createIf(); _if.setElement(ifElement); // Set activity Activity activity = getChildActivity(ifElement); if (activity != null) { _if.setActivity(activity); } // Handle condition element Element conditionElement = getBPELChildElementByLocalName(ifElement, "condition"); if (conditionElement != null) { Condition condition = xml2Condition(conditionElement); _if.setCondition(condition); } // Handle elseif for(Element e : getBPELChildElementsByLocalName(ifElement, "elseif")) { _if.getElseIf().add( xml2ElseIf ( e )); } // Handle else Element elseElement = getBPELChildElementByLocalName(ifElement, "else"); if (elseElement != null) { Else _else = xml2Else(elseElement); _if.setElse(_else); } setStandardAttributes(ifElement, _if); return _if; } /** * Converts an XML elseIf element to a BPEL ElseIf object. */ protected ElseIf xml2ElseIf(Element elseIfElement) { ElseIf elseIf = BPELFactory.eINSTANCE.createElseIf(); elseIf.setElement(elseIfElement); // Save all the references to external namespaces saveNamespacePrefix(elseIf, elseIfElement); // Handle condition element Element conditionElement = getBPELChildElementByLocalName(elseIfElement, "condition"); if (conditionElement != null) { Condition condition = xml2Condition(conditionElement); elseIf.setCondition(condition); } // Set activity Activity activity = getChildActivity(elseIfElement); if (activity != null) { elseIf.setActivity(activity); } return elseIf; } /** * Converts an XML condition element to a BPEL Condition object. */ protected Condition xml2Condition(Element conditionElement) { Condition condition = BPELFactory.eINSTANCE.createCondition(); condition.setElement(conditionElement); xml2Expression(conditionElement, condition); return condition; } /** * Converts an XML expression element to a BPEL Expression object. * * Accept a pre-constructed argument. This is good for sub-types * of expression. * * Returns the second argument as a convenience. * */ protected Expression xml2Expression(Element expressionElement, Expression expression) { // Save all the references to external namespaces saveNamespacePrefix(expression, expressionElement); if (expressionElement == null) { return expression; } // Set expressionLanguage if (expressionElement.hasAttribute("expressionLanguage")) { expression.setExpressionLanguage(expressionElement.getAttribute("expressionLanguage")); } // Set opaque if (expressionElement.hasAttribute("opaque")) { expression.setOpaque( Boolean.valueOf( expressionElement.getAttribute("opaque").equals("yes"))); } String data = getText(expressionElement); if (data != null) { expression.setBody(data); } return expression; } /** * Converts an XML expression element to a BPEL Expression object. */ protected Expression xml2Expression(Element expressionElement) { Expression expression = BPELFactory.eINSTANCE.createExpression(); expression.setElement(expressionElement); return xml2Expression(expressionElement, expression); } protected Else xml2Else(Element elseElement) { Else _else = BPELFactory.eINSTANCE.createElse(); _else.setElement(elseElement); // Save all the references to external namespaces saveNamespacePrefix(_else, elseElement); Activity activity = getChildActivity(elseElement); _else.setActivity(activity); return _else; } /** * Converts an XML sequence element to a BPEL Sequence object. */ protected Activity xml2Sequence(Element sequenceElement) { Sequence sequence = BPELFactory.eINSTANCE.createSequence(); sequence.setElement(sequenceElement); // Set name Attr name = sequenceElement.getAttributeNode("name"); if (name != null && name.getSpecified()) { sequence.setName(name.getValue()); } NodeList sequenceElements = sequenceElement.getChildNodes(); Element activityElement = null; if (sequenceElements != null && sequenceElements.getLength() > 0) { for (int i = 0; i < sequenceElements.getLength(); i++) { if (sequenceElements.item(i).getNodeType() != Node.ELEMENT_NODE) { continue; } activityElement = (Element)sequenceElements.item(i); Activity activity = xml2Activity(activityElement); if (activity != null) { sequence.getActivities().add(activity); } } } setStandardAttributes(sequenceElement, sequence); return sequence; } /** * Converts an XML empty element to a BPEL Empty object. */ protected Activity xml2Empty(Element emptyElement) { Empty empty = BPELFactory.eINSTANCE.createEmpty(); empty.setElement(emptyElement); setStandardAttributes(emptyElement, empty); return empty; } /** * Converts an XML opaqueActivity element to a BPEL OpaqueActivity object. */ protected Activity xml2OpaqueActivity(Element opaqueActivityElement) { OpaqueActivity opaqueActivity = BPELFactory.eINSTANCE.createOpaqueActivity(); opaqueActivity.setElement(opaqueActivityElement); setStandardAttributes(opaqueActivityElement, opaqueActivity); return opaqueActivity; } /** * Converts an XML valdateXML element to a BPEL ValidateXML object. */ protected Activity xml2Validate(Element validateElement) { final Validate validate = BPELFactory.eINSTANCE.createValidate(); validate.setElement(validateElement); setStandardAttributes(validateElement, validate); if (validateElement.hasAttribute("variables")) { String variables = validateElement.getAttribute("variables"); StringTokenizer st = new StringTokenizer(variables); while (st.hasMoreTokens()) { final String variableName = st.nextToken(); // We must do this as a post load runnable because the variable might not // exist yet. fPass2Runnables.add(new Runnable() { public void run() { Variable targetVariable = getVariable(validate, variableName); if (targetVariable == null) { targetVariable = new VariableProxy(getResource().getURI(), variableName); } validate.getVariables().add(targetVariable); } }); } } return validate; } /** * Converts an XML rethrow element to a BPEL Rethrow object. */ protected Activity xml2Rethrow(Element rethrowElement) { Rethrow rethrow = BPELFactory.eINSTANCE.createRethrow(); rethrow.setElement(rethrowElement); setStandardAttributes(rethrowElement, rethrow); return rethrow; } /** * Converts an XML extensionactivity element to a BPEL ExtensionActivity object. */ protected Activity xml2ExtensionActivity(Element extensionActivityElement) { // Do not call setStandardAttributes here because extensionActivityElement // doesn't have them. Activity extensionActivity = BPELFactory.eINSTANCE.createExtensionActivity(); // Find the child element. List<Element> nodeList = getChildElements(extensionActivityElement); if (nodeList.size() == 1) { final Element child = nodeList.get(0); // We found a child element. Look up a deserializer for this // activity and call it. String localName = child.getLocalName(); String namespace = child.getNamespaceURI(); final QName qname = new QName(namespace, localName); final BPELActivityDeserializer deserializer = extensionRegistry.getActivityDeserializer(qname); if (deserializer != null) { // Deserialize the DOM element and return the new Activity final Map<String,String> nsMap = getAllNamespacesForElement(child); // https://bugs.eclipse.org/bugs/show_bug.cgi?id=334424 extensionActivity = deserializer.unmarshall(qname,child,extensionActivity,process,nsMap,extensionRegistry, getResource().getURI(), this); // Now let's do the standard attributes and elements setStandardAttributes(child, extensionActivity); setStandardElements(child, extensionActivity); // Don't do extensibility because extensionActivity is not extensible. // If individual extensionActivity subclasses are actually extensible, they // have to do this themselves in their deserializer. // The created Activity that extends from ExtensioActivity should get the // whole <extensionActivity>-DOM-Fragment, this is done here. extensionActivity.setElement(extensionActivityElement); final Activity ea = extensionActivity; // Bug 120110 - run the deserializer again so it can resolve references to // objects that were not fully realized in pass 1. fPass2Runnables.add(new Runnable() { public void run() { deserializer.unmarshall(qname,child,ea,process,nsMap,extensionRegistry, getResource().getURI(), BPELReader.this); } }); return extensionActivity; } } // Fallback is to create a new extensionActivity. // Bugzilla 324115 setStandardAttributes(extensionActivityElement, extensionActivity); setStandardElements(extensionActivityElement, extensionActivity); extensionActivity.setElement(extensionActivityElement); return extensionActivity; } /** * Converts an XML wait element to a BPEL Wait object. */ protected Activity xml2Wait(Element waitElement) { Wait wait = BPELFactory.eINSTANCE.createWait(); wait.setElement(waitElement); // Set name Attr name = waitElement.getAttributeNode("name"); if (name != null && name.getSpecified()) wait.setName(name.getValue()); // Set for element Element forElement = getBPELChildElementByLocalName(waitElement, "for"); if (forElement != null) { Expression expression = xml2Expression(forElement); wait.setFor(expression); } // Set until element Element untilElement = getBPELChildElementByLocalName(waitElement, "until"); if (untilElement != null) { Expression expression = xml2Expression(untilElement); wait.setUntil(expression); } setStandardAttributes(waitElement, wait); return wait; } /** * Converts an XML exit element to a BPEL Exit object. */ protected Activity xml2Exit(Element exitElement) { Exit exit = BPELFactory.eINSTANCE.createExit(); exit.setElement(exitElement); Attr name = exitElement.getAttributeNode("name"); if (name != null && name.getSpecified()) exit.setName(name.getValue()); setStandardAttributes(exitElement, exit); return exit; } /** * Converts an XML throw element to a BPEL Throw object. */ protected Activity xml2Throw(Element throwElement) { Throw _throw = BPELFactory.eINSTANCE.createThrow(); _throw.setElement(throwElement); if (throwElement.hasAttribute("name")) { _throw.setName(throwElement.getAttribute("name")); } if (throwElement.hasAttribute("faultName")) { QName qName = BPELUtils.createAttributeValue(throwElement, "faultName"); _throw.setFaultName(qName); } // Set fault variable name setVariable(throwElement, _throw, "faultVariable", BPELPackage.eINSTANCE.getThrow_FaultVariable()); setStandardAttributes(throwElement, _throw); return _throw; } /** * Converts an XML assign element to a BPEL Assign object. */ protected Activity xml2Assign(Element assignElement) { Assign assign = BPELFactory.eINSTANCE.createAssign(); assign.setElement(assignElement); if (assignElement.hasAttribute("validate")) { assign.setValidate( Boolean.valueOf( assignElement.getAttribute("validate").equals("yes"))); } for (Element copyElement : getBPELChildElementsByLocalName(assignElement, "copy") ) { assign.getCopy().add( xml2Copy ( copyElement )); } setStandardAttributes(assignElement, assign); return assign; } /** * Converts an XML copy element to a BPEL Copy object. */ protected Copy xml2Copy(Element copyElement) { Copy copy = BPELFactory.eINSTANCE.createCopy(); copy.setElement(copyElement); // Save all the references to external namespaces saveNamespacePrefix(copy, copyElement); Element fromElement = getBPELChildElementByLocalName(copyElement, "from"); if (fromElement != null) { From from = BPELFactory.eINSTANCE.createFrom(); from.setElement(fromElement); xml2From(from, fromElement); copy.setFrom(from); } Element toElement = getBPELChildElementByLocalName(copyElement, "to"); if (toElement != null) { To to = BPELFactory.eINSTANCE.createTo(); to.setElement(toElement); xml2To(to, toElement); copy.setTo(to); } if (copyElement.hasAttribute("keepSrcElementName")) copy.setKeepSrcElementName( Boolean.valueOf( copyElement.getAttribute("keepSrcElementName").equals("yes"))); if (copyElement.hasAttribute("ignoreMissingFromData")) copy.setIgnoreMissingFromData( Boolean.valueOf( copyElement.getAttribute("ignoreMissingFromData").equals("yes"))); xml2ExtensibleElement(copy, copyElement); return copy; } /** * Converts an XML toPart element to a BPEL ToPart object. */ protected ToPart xml2ToPart(Element toPartElement) { ToPart toPart = BPELFactory.eINSTANCE.createToPart(); toPart.setElement(toPartElement); // Save all the references to external namespaces saveNamespacePrefix(toPart, toPartElement); // Set part Attr part = toPartElement.getAttributeNode("part"); if (part != null && part.getSpecified()) { final String partAttr = toPartElement.getAttribute("part"); ((ToPartImpl) toPart).setPartName(partAttr); } // Set fromVariable setVariable(toPartElement, toPart, "fromVariable", BPELPackage.eINSTANCE.getToPart_FromVariable()); return toPart; } /** * Converts an XML fromPart element to a BPEL FromPart object. */ protected FromPart xml2FromPart(Element fromPartElement) { FromPart fromPart = BPELFactory.eINSTANCE.createFromPart(); fromPart.setElement(fromPartElement); // Save all the references to external namespaces saveNamespacePrefix(fromPart, fromPartElement); // Set part Attr part = fromPartElement.getAttributeNode("part"); if (part != null && part.getSpecified()) { final String partAttr = fromPartElement.getAttribute("part"); ((FromPartImpl) fromPart).setPartName(partAttr); } // Set toVariable setVariable(fromPartElement, fromPart, "toVariable", BPELPackage.eINSTANCE.getFromPart_ToVariable()); return fromPart; } /** * Converts an XML "to" element to a BPEL To object. */ protected To xml2To(To to, Element toElement) { // The to-spec MUST be one of the following variants: // 1. <to variable="BPELVariableName" part="NCName"?> // <query queryLanguage="anyURI"?>? // queryContent // </query> // </to> // // 2. <to partnerLink="NCName" /> // // 3. <to variable="BPELVariableName" property="QName" /> // // 4. <to expressionLanguage="anyURI"?>expression</to> // // 5. <to/> // Save all the references to external namespaces saveNamespacePrefix(to, toElement); // Set variable Attr variable = toElement.getAttributeNode("variable"); if (variable != null && variable.getSpecified()) { setVariable(toElement, to, "variable", BPELPackage.eINSTANCE.getAbstractAssignBound_Variable()); } // Set part Attr part = toElement.getAttributeNode("part"); if (part != null && part.getSpecified()) { final String partAttr = toElement.getAttribute("part"); ((ToImpl) to).setPartName(partAttr); } // Set partnerLink Attr partnerLink = toElement.getAttributeNode("partnerLink"); if (partnerLink != null && partnerLink.getSpecified()) { setPartnerLink(toElement, to, BPELPackage.eINSTANCE.getAbstractAssignBound_PartnerLink()); } // Set property Attr property = toElement.getAttributeNode("property"); if (property != null && property.getSpecified()) { setProperties(toElement, to, "property"); } // Set query element Element queryElement = getBPELChildElementByLocalName(toElement, "query"); if (queryElement != null) { Query queryObject = BPELFactory.eINSTANCE.createQuery(); queryObject.setElement(queryElement); to.setQuery(queryObject); // Set queryLanguage if (queryElement.hasAttribute("queryLanguage")) { String queryLanguage = queryElement.getAttribute("queryLanguage"); queryObject.setQueryLanguage(queryLanguage); } // Set query text // Get the condition text String data = getText( queryElement ); if (data != null) { queryObject.setValue(data); } } else { if (partnerLink == null && variable == null){ // must be expression Expression expressionObject = BPELFactory.eINSTANCE.createExpression(); to.setExpression(expressionObject); // Set expressionLanguage if (toElement.hasAttribute("expressionLanguage")) { expressionObject.setExpressionLanguage(toElement.getAttribute("expressionLanguage")); } // Set expression text // Get the condition text String data = getText( toElement ); if (data != null) { expressionObject.setBody(data); } } } return to; } /** * Converts an XML "from" element to a BPEL From object. */ protected From xml2From(From from, Element fromElement) { /** This is basically what's in xml2To */ // Save all the references to external namespaces saveNamespacePrefix(from, fromElement); // Set variable Attr variable = fromElement.getAttributeNode("variable"); if (variable != null && variable.getSpecified()) { setVariable(fromElement, from, "variable", BPELPackage.eINSTANCE.getAbstractAssignBound_Variable() ); } // Set part Attr part = fromElement.getAttributeNode("part"); if (part != null && part.getSpecified()) { final String partAttr = fromElement.getAttribute("part"); ((FromImpl) from).setPartName(partAttr); } // Set partnerLink Attr partnerLink = fromElement.getAttributeNode("partnerLink"); if (partnerLink != null && partnerLink.getSpecified()) { setPartnerLink(fromElement, from, BPELPackage.eINSTANCE.getAbstractAssignBound_PartnerLink()); } // Set property Attr property = fromElement.getAttributeNode("property"); if (property != null && property.getSpecified()) { setProperties(fromElement, from, "property"); } // Set query element Element queryElement = getBPELChildElementByLocalName(fromElement, "query"); if (queryElement != null) { Query queryObject = BPELFactory.eINSTANCE.createQuery(); queryObject.setElement(queryElement); from.setQuery(queryObject); // Set queryLanguage if (queryElement.hasAttribute("queryLanguage")) { String queryLanguage = queryElement.getAttribute("queryLanguage"); queryObject.setQueryLanguage(queryLanguage); } // Set query text // Get the condition text String data = getText ( queryElement ); if (data != null) { queryObject.setValue(data); } } Attr endpointReference = fromElement.getAttributeNode("endpointReference"); if (endpointReference != null && endpointReference.getSpecified()) { from.setEndpointReference(EndpointReferenceRole.get(endpointReference.getValue())); } // Set service-ref element Element serviceRefElement = getBPELChildElementByLocalName(fromElement, "service-ref"); Element literalElement = getBPELChildElementByLocalName(fromElement, "literal"); if (serviceRefElement != null) { ServiceRef serviceRef = BPELFactory.eINSTANCE.createServiceRef(); // TODO: ? serviceRef.setElement(serviceRefElement); from.setServiceRef(serviceRef); // Set reference scheme if (serviceRefElement.hasAttribute("reference-scheme")) { String scheme = serviceRefElement.getAttribute("reference-scheme"); serviceRef.setReferenceScheme(scheme); } // Set the value of the service reference // Determine whether or not there is an element in the child list. Node candidateChild = null; NodeList nodeList = serviceRefElement.getChildNodes(); int length = nodeList.getLength(); for (int i = 0; i < length; i++) { Node child = nodeList.item(i); if (child.getNodeType() == Node.ELEMENT_NODE) { candidateChild = child; break; } } if (candidateChild == null) { candidateChild = serviceRefElement.getFirstChild(); } String data = getText(candidateChild); if (data == null) { // No text or CDATA node. If it's an element node, then // deserialize and install. if (candidateChild != null && candidateChild.getNodeType() == Node.ELEMENT_NODE) { // Look if there's an ExtensibilityElement deserializer for this element Element childElement = (Element)candidateChild; QName qname = new QName(childElement.getNamespaceURI(), childElement.getLocalName()); BPELExtensionDeserializer deserializer=null; try { deserializer = (BPELExtensionDeserializer)extensionRegistry.queryDeserializer(BPELExtensibleElement.class,qname); } catch (WSDLException e) { // nothing } if (deserializer != null && !(deserializer instanceof BPELUnknownExtensionDeserializer)) { // Deserialize the DOM element and add the new Extensibility element to the parent // BPELExtensibleElement try { Map<String,String> nsMap = getAllNamespacesForElement(serviceRefElement); ExtensibilityElement extensibilityElement=deserializer.unmarshall(BPELExtensibleElement.class,qname,childElement,process,nsMap,extensionRegistry,getResource().getURI(),this); serviceRef.setValue(extensibilityElement); } catch (WSDLException e) { throw new WrappedException(e); } } else { ServiceReferenceDeserializer referenceDeserializer = extensionRegistry.getServiceReferenceDeserializer(serviceRef.getReferenceScheme()); if (referenceDeserializer != null) { Object serviceReference = referenceDeserializer.unmarshall(childElement, process); serviceRef.setValue(serviceReference); } } } } else { serviceRef.setValue(data); } } // Literal node if (literalElement != null) { StringBuilder elementData = new StringBuilder(256); NodeList nl = literalElement.getChildNodes(); outer : for (int i=0; i < nl.getLength(); i++) { Node n = nl.item(i); switch (n.getNodeType()) { case Node.ELEMENT_NODE : elementData.setLength(0); elementData.append(BPELUtils.elementToString((Element)n)); break outer; case Node.TEXT_NODE : case Node.CDATA_SECTION_NODE : // elementData.append( n.getTextContent() ); elementData.append( getText(n) ); break; } } from.setUnsafeLiteral(Boolean.FALSE); String elementDataFinal = elementData.toString(); if (isEmptyOrWhitespace(elementDataFinal) == false) { from.setUnsafeLiteral(Boolean.TRUE); from.setLiteral( elementDataFinal ); } } else { // must be expression Expression expressionObject = BPELFactory.eINSTANCE.createExpression(); from.setExpression(expressionObject); // Set expressionLanguage if (fromElement.hasAttribute("expressionLanguage")) { expressionObject.setExpressionLanguage(fromElement.getAttribute("expressionLanguage")); } // Set expression text // Get the condition text String data = getText( fromElement ); if (data != null) { expressionObject.setBody(data); } } // Set opaque Attr opaque = fromElement.getAttributeNode("opaque"); if (opaque != null && opaque.getSpecified()) { from.setOpaque( Boolean.valueOf( opaque.getValue().equals("yes"))); } // See if there is an xsi:type attribue. if (fromElement.hasAttribute("xsi:type")) { QName qName = BPELUtils.createAttributeValue(fromElement, "xsi:type"); XSDTypeDefinition type = new XSDTypeDefinitionProxy(getResource().getURI(), qName); from.setType(type); } return from; } /** * Converts an XML import element to a BPEL Import object. */ protected Import xml2Import(Element importElement) { if (!importElement.getLocalName().equals("import")) return null; Import imp = BPELFactory.eINSTANCE.createImport(); imp.setElement(importElement); // Save all the references to external namespaces saveNamespacePrefix(imp, importElement); // namespace if (importElement.hasAttribute("namespace")) imp.setNamespace(importElement.getAttribute("namespace")); // location if (importElement.hasAttribute("location")) imp.setLocation(importElement.getAttribute("location")); // importType if (importElement.hasAttribute("importType")) imp.setImportType(importElement.getAttribute("importType")); return imp; } /** * Converts an XML invoke element to a BPEL Invoke object. */ protected Activity xml2Invoke(Element invokeElement) { Invoke invoke = BPELFactory.eINSTANCE.createInvoke(); invoke.setElement(invokeElement); // Set several parms setStandardAttributes(invokeElement, invoke); setOperationParms(invokeElement, invoke, null, BPELPackage.eINSTANCE.getInvoke_InputVariable(), BPELPackage.eINSTANCE.getInvoke_OutputVariable(), BPELPackage.eINSTANCE.getPartnerActivity_PartnerLink()); // Set compensationHandler setCompensationHandler(invokeElement, invoke); // Set the fault handler (for catche-s and catchAll-s) FaultHandler faultHandler = xml2FaultHandler(invokeElement); if (faultHandler != null && (!faultHandler.getCatch().isEmpty() || faultHandler.getCatchAll() != null)) { // Only set this on the activity if there is at least one catch clause, or a catchAll clause invoke.setFaultHandler(faultHandler); } Element toPartsElement = getBPELChildElementByLocalName(invokeElement, "toParts"); if (toPartsElement != null) { ToParts toParts = xml2ToParts(toPartsElement); invoke.setToParts(toParts); } // Set fromParts Element fromPartsElement = getBPELChildElementByLocalName(invokeElement, "fromParts"); if (fromPartsElement != null) { FromParts fromParts = xml2FromParts(fromPartsElement); invoke.setFromParts(fromParts); } return invoke; } /** * Converts an XML reply element to a BPEL Reply object. */ protected Activity xml2Reply(Element replyElement) { Reply reply = BPELFactory.eINSTANCE.createReply(); reply.setElement(replyElement); // Set several parms setStandardAttributes(replyElement, reply); setOperationParms(replyElement, reply, BPELPackage.eINSTANCE.getReply_Variable(), null, null, BPELPackage.eINSTANCE.getPartnerActivity_PartnerLink()); if (replyElement.hasAttribute("faultName")) { QName qName = BPELUtils.createAttributeValue(replyElement, "faultName"); reply.setFaultName(qName); } Element toPartsElement = getBPELChildElementByLocalName(replyElement, "toParts"); if (toPartsElement != null) { ToParts toParts = xml2ToParts(toPartsElement); reply.setToParts(toParts); } // Set messageExchange setMessageExchange(replyElement, reply, BPELPackage.eINSTANCE.getReply_MessageExchange()); return reply; } /** * Converts an XML receive element to a BPEL Receive object. */ protected Activity xml2Receive(Element receiveElement) { Receive receive = BPELFactory.eINSTANCE.createReceive(); receive.setElement(receiveElement); // Set several parms setStandardAttributes(receiveElement, receive); setOperationParms(receiveElement, receive, BPELPackage.eINSTANCE.getReceive_Variable(), null, null, BPELPackage.eINSTANCE.getPartnerActivity_PartnerLink()); // Set createInstance if (receiveElement.hasAttribute("createInstance")) { String createInstance = receiveElement.getAttribute("createInstance"); receive.setCreateInstance( Boolean.valueOf( createInstance.equals("yes"))); } Element fromPartsElement = getBPELChildElementByLocalName(receiveElement, "fromParts"); if (fromPartsElement != null) { FromParts fromParts = xml2FromParts(fromPartsElement); receive.setFromParts(fromParts); } // Set messageExchange setMessageExchange(receiveElement, receive, BPELPackage.eINSTANCE.getReceive_MessageExchange()); return receive; } /** * Sets a MessageExchange element for a given EObject. The given activity * element must contain an attribute named "messageExchange". * * @param activityElement * the DOM element of the activity * @param eObject * the EObject in which to set the partner link */ protected void setMessageExchange(Element activityElement, final EObject eObject, final EReference reference) { if (!activityElement.hasAttribute("messageExchange")) { return; } final String messageExchangeName = activityElement.getAttribute("messageExchange"); // We must do this as a post load runnable because the partner link might not // exist yet. fPass2Runnables.add(new Runnable() { public void run() { MessageExchange targetMessageExchange = BPELUtils.getMessageExchange(eObject, messageExchangeName); if (targetMessageExchange == null) { targetMessageExchange = new MessageExchangeProxy(getResource().getURI(), messageExchangeName); } eObject.eSet(reference, targetMessageExchange); } }); } /** * Converts an XML forEach element to a BPEL ForEach object. */ protected Activity xml2ForEach(Element forEachElement) { ForEach forEach = BPELFactory.eINSTANCE.createForEach(); forEach.setElement(forEachElement); // Set several parms setStandardAttributes(forEachElement, forEach); if (forEachElement.hasAttribute("parallel")) { forEach.setParallel(forEachElement.getAttribute("parallel").equals("yes")); } // Set counterName variable if (forEachElement.hasAttribute("counterName")) { Variable variable = BPELFactory.eINSTANCE.createVariable(); // TODO: How to facade this ? variable.setName(forEachElement.getAttribute("counterName")); QName qName = new QName(XSDConstants.SCHEMA_FOR_SCHEMA_URI_2001, "unsignedInt"); XSDTypeDefinition type = new XSDTypeDefinitionProxy(getResource().getURI(), qName); variable.setType(type); forEach.setCounterName(variable); } // Set startCounterValue element Element startCounterValueElement = getBPELChildElementByLocalName(forEachElement, "startCounterValue"); if (startCounterValueElement != null) { Expression expression = xml2Expression(startCounterValueElement); forEach.setStartCounterValue(expression); } // Set finalCounterValue element Element finalCounterValueElement = getBPELChildElementByLocalName(forEachElement, "finalCounterValue"); if (finalCounterValueElement != null) { Expression expression = xml2Expression(finalCounterValueElement); forEach.setFinalCounterValue(expression); } // Set completionCondition element Element completionConditionElement = getBPELChildElementByLocalName(forEachElement, "completionCondition"); if (completionConditionElement != null) { CompletionCondition completionCondition = xml2CompletionCondition(completionConditionElement); forEach.setCompletionCondition(completionCondition); } // Set activity Activity activity = getChildActivity(forEachElement); if (activity instanceof Scope) { forEach.setActivity(activity); } return forEach; } /** * Converts an XML completionCondition element to a BPEL CompletionCondition object. */ protected CompletionCondition xml2CompletionCondition(Element completionConditionElement) { CompletionCondition completionCondition = BPELFactory.eINSTANCE.createCompletionCondition(); completionCondition.setElement(completionConditionElement); // Set branches element Element branchesElement = getBPELChildElementByLocalName(completionConditionElement, "branches"); if (branchesElement != null) { Branches branches = xml2Branches(branchesElement); completionCondition.setBranches(branches); } return completionCondition; } /** * Converts an XML branches element to a BPEL Branches object. */ protected Branches xml2Branches(Element branchesElement) { Branches branches = BPELFactory.eINSTANCE.createBranches(); branches.setElement(branchesElement); xml2Expression(branchesElement, branches); if (branchesElement.hasAttribute("successfulBranchesOnly")) branches.setCountCompletedBranchesOnly( Boolean.valueOf( branchesElement.getAttribute("successfulBranchesOnly").equals("yes"))); return branches; } /** * Converts an XML documentation element to a BPEL Documentation object. */ protected Documentation xml2Documentation(Element documentationElement) { Documentation documentation = BPELFactory.eINSTANCE.createDocumentation(); documentation.setElement(documentationElement); if (documentationElement.hasAttribute("xml:lang")) { documentation.setLang(documentationElement.getAttribute("xml:lang")); } if (documentationElement.hasAttribute("source")) { documentation.setSource(documentationElement.getAttribute("source")); } String text = getText(documentationElement); if (text != null) { documentation.setValue(text); } return documentation; } /** * Converts an XML repeatUntil element to a BPEL RepeatUntil object. */ protected Activity xml2RepeatUntil(Element repeatUntilElement) { RepeatUntil repeatUntil = BPELFactory.eINSTANCE.createRepeatUntil(); repeatUntil.setElement(repeatUntilElement); // Set several parms setStandardAttributes(repeatUntilElement, repeatUntil); // Handle condition element Element conditionElement = getBPELChildElementByLocalName(repeatUntilElement, "condition"); if (conditionElement != null) { Condition condition = xml2Condition(conditionElement); repeatUntil.setCondition(condition); } NodeList repeatUntilElements = repeatUntilElement.getChildNodes(); Element activityElement = null; if (repeatUntilElements != null && repeatUntilElements.getLength() > 0) { for (int i = 0; i < repeatUntilElements.getLength(); i++) { if (repeatUntilElements.item(i).getNodeType() != Node.ELEMENT_NODE) { continue; } activityElement = (Element)repeatUntilElements.item(i); Activity activity = xml2Activity(activityElement); if (activity != null) { repeatUntil.setActivity(activity); break; } } } return repeatUntil; } protected Correlations xml2Correlations(Element correlationsElement) { if (!correlationsElement.getLocalName().equals("correlations")) return null; Correlations correlations = BPELFactory.eINSTANCE.createCorrelations(); correlations.setElement(correlationsElement); // Save all the references to external namespaces saveNamespacePrefix(correlations, correlationsElement); for(Element e : getBPELChildElementsByLocalName(correlationsElement, "correlation")) { correlations.getChildren().add( xml2Correlation(e)); } // extensibility elements xml2ExtensibleElement(correlations, correlationsElement); return correlations; } /** * Converts an XML correlation element to a BPEL Correlation object. */ protected Correlation xml2Correlation(Element correlationElement) { final Correlation correlation = BPELFactory.eINSTANCE.createCorrelation(); correlation.setElement(correlationElement); // Save all the references to external namespaces saveNamespacePrefix(correlation, correlationElement); if (correlationElement == null) return correlation; // Set set if (correlationElement.hasAttribute("set")) { final String correlationSetName = correlationElement.getAttribute("set"); fPass2Runnables.add(new Runnable() { public void run() { CorrelationSet cSet = BPELUtils.getCorrelationSetForActivity(correlation, correlationSetName); if (cSet == null) { cSet = new CorrelationSetProxy(getResource().getURI(), correlationSetName); } correlation.setSet(cSet); } }); } // Set initiation Attr initiation = correlationElement.getAttributeNode("initiate"); if (initiation != null && initiation.getSpecified()) { if (initiation.getValue().equals("yes")) correlation.setInitiate("yes"); else if (initiation.getValue().equals("no")) correlation.setInitiate("no"); else if (initiation.getValue().equals("join")) correlation.setInitiate("join"); } // Set pattern Attr pattern = correlationElement.getAttributeNode("pattern"); if (pattern != null && pattern.getSpecified()) { if (pattern.getValue().equals("request")) correlation.setPattern(CorrelationPattern.REQUEST_LITERAL); else if (pattern.getValue().equals("response")) correlation.setPattern(CorrelationPattern.RESPONSE_LITERAL); else if (pattern.getValue().equals("request-response")) correlation.setPattern(CorrelationPattern.REQUESTRESPONSE_LITERAL); } xml2ExtensibleElement(correlation, correlationElement); return correlation; } protected Compensate xml2Compensate(Element compensateElement) { final Compensate compensate = BPELFactory.eINSTANCE.createCompensate(); compensate.setElement(compensateElement); setStandardAttributes(compensateElement, compensate); return compensate; } protected CompensateScope xml2CompensateScope (Element compensateScopeElement) { final CompensateScope compensateScope = BPELFactory.eINSTANCE.createCompensateScope(); compensateScope.setElement(compensateScopeElement); final String target = compensateScopeElement.getAttribute("target"); if (target != null && target.length() > 0) { fPass2Runnables.add(new Runnable() { public void run() { compensateScope.setTarget(target); } }); } setStandardAttributes(compensateScopeElement, compensateScope); return compensateScope; } /** * Converts an XML extensible element to a BPEL extensible element */ protected void xml2ExtensibleElement (BPELExtensibleElement extensibleElement, Element element) { if (extensionRegistry == null) { return; } // Handle the documentation element first Element documentationElement = getBPELChildElementByLocalName(element, "documentation"); if (documentationElement != null) { Documentation documentation = xml2Documentation(documentationElement); extensibleElement.setDocumentation(documentation); } // Get the child nodes, elements and attributes List<Node> nodes=new ArrayList<Node>(); NodeList nodeList = element.getChildNodes(); for (int i=0, n=nodeList.getLength(); i<n; i++) { if (nodeList.item(i) instanceof Element) { final String namespaceURI = ((Element)nodeList.item(i)).getNamespaceURI(); if (!(BPELConstants.isBPELNamespace(namespaceURI))) nodes.add(nodeList.item(i)); } } NamedNodeMap nodeMap=element.getAttributes(); for (int i=0, n=nodeMap.getLength(); i<n; i++) { Attr attr = (Attr)nodeMap.item(i); if (attr.getNamespaceURI() != null && !attr.getNamespaceURI().equals(XSDConstants.XMLNS_URI_2000)) { nodes.add(attr); } } for (Node node : nodes ) { // TODO What is this check for? If we're actually checking for // the BPEL namespace, use BPELConstants instead. if (MessagepropertiesConstants.isMessagePropertiesNamespace(node.getNamespaceURI())) { continue; } if (node.getNodeType() == Node.ELEMENT_NODE) { deserialize ( extensibleElement, (Element) node); } else if (node.getNodeType() == Node.ATTRIBUTE_NODE) { deserialize ( extensibleElement, (Attr) node); } } } protected void deserialize ( BPELExtensibleElement ee, Element elm ) { QName qname = new QName(elm.getNamespaceURI(),elm.getLocalName()); BPELExtensionDeserializer deserializer = null; try { deserializer = (BPELExtensionDeserializer)extensionRegistry.queryDeserializer (BPELExtensibleElement.class,qname); } catch (WSDLException e) { // we don't have one. } if (deserializer == null) { return ; } // Deserialize the DOM element and add the new Extensibility element to the parent // BPELExtensibleElement Map<String,String> nsMap = getAllNamespacesForElement (elm); try { ExtensibilityElement extensibilityElement = deserializer.unmarshall(ee.getClass(),qname,elm,process,nsMap,extensionRegistry,getResource().getURI(),this); ee.addExtensibilityElement(extensibilityElement); } catch (WSDLException e) { throw new WrappedException(e); } } protected void deserialize ( BPELExtensibleElement ee, Attr attr) { if (attr.getSpecified() == false) { return ; } QName qname = new QName (attr.getNamespaceURI(),"extensibilityAttributes"); BPELExtensionDeserializer deserializer = null; try { deserializer = (BPELExtensionDeserializer) extensionRegistry.queryDeserializer(BPELExtensibleElement.class,qname); } catch (WSDLException e) { // ignore } if (deserializer == null) { return ; } // Create a temp element to host the extensibility attribute // // This turns something that looks like this: // <bpws:X someNS:Y="Z"/> // into something that looks like this: // <someNS:extensibilityAttributes xmlns:someNS="http://the.namespace" Y="Z"/> Element tempElement = attr.getOwnerDocument().createElementNS(attr.getNamespaceURI(), attr.getPrefix() + ":extensibilityAttributes"); tempElement.setAttribute(BPELUtils.ATTR_XMLNS + ":" + attr.getPrefix(), attr.getNamespaceURI()); tempElement.setAttribute(attr.getLocalName(), attr.getNodeValue()); // Deserialize the temp DOM element and add the new Extensibility element to the parent // BPELExtensibleElement Map<String,String> nsMap = getAllNamespacesForElement( (Element) attr.getParentNode() ); try { ExtensibilityElement extensibilityElement = deserializer.unmarshall(BPELExtensibleElement.class,qname,tempElement,process,nsMap,extensionRegistry,getResource().getURI(),this); if (extensibilityElement!=null) { ee.addExtensibilityElement (extensibilityElement); } } catch (WSDLException e) { throw new WrappedException(e); } } /** * Checks for process type * @param processElement * @return true if process is abstract, false otherwise */ public boolean isAbstractProcess(Element processElement) { if (processElement != null) { Map<String, String> nsMap = this.getAllNamespacesForElement(processElement); if (nsMap.containsValue(BPELConstants.NAMESPACE_ABSTRACT_2007)) { return true; } } return false; } /** * returns abstract process profile * @param processElement * @return namespace of abstract process profile */ public String getProfileNamespace(Element processElement) { if (processElement.getAttribute(BPELConstants.AT_ABSTRACT_PROFILES) != null){ return processElement.getAttribute(BPELConstants.AT_ABSTRACT_PROFILES); } return null; } /** * Returns true if the string is either null or contains just whitespace. * @param value * @return true if empty or whitespace, false otherwise. */ static public boolean isEmptyOrWhitespace( String value ) { if( value == null || value.length() == 0) { return true; } for( int i = 0, j = value.length(); i < j; i++ ) { if( ! Character.isWhitespace( value.charAt(i) ) ) { return false; } } return true; } /** * Returns the text of the given node. If the node is an element node, its * children text value is returned. Otherwise, the node is assumed to be * the first child node and the siblings sequence is scanned. * * */ String getText (Node node) { StringBuilder sb = new StringBuilder(128); if (node instanceof Element) { node = ((Element)node).getFirstChild(); } boolean bCData = false; while (node != null) { switch (node.getNodeType()) { case Node.TEXT_NODE : if (bCData) { break; } Text text = (Text) node; sb.append(text.getData()); break; case Node.CDATA_SECTION_NODE : if (bCData == false) { sb.setLength(0); bCData = true; } CDATASection cdata = (CDATASection) node; sb.append( cdata.getData() ); break; } node = node.getNextSibling(); } String data = sb.toString(); if (isEmptyOrWhitespace(data)) { return null; } return data; } /** * @param eObject * @param variableName * @return the resolved variable */ public static Variable getVariable(EObject eObject, String variableName) { return VARIABLE_RESOLVER.getVariable(eObject, variableName); } /** * @param activity * @param linkName * @return the resolved link */ public static Link getLink(Activity activity, String linkName) { return LINK_RESOLVER.getLink(activity, linkName); } /** * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException) */ @SuppressWarnings("boxing") public void error (SAXParseException exception) { String message = java.text.MessageFormat.format( "Error in {0} [{2}:{3}] {4}", exception.getPublicId(), exception.getSystemId(), exception.getLineNumber(), exception.getColumnNumber(), exception.getLocalizedMessage() ); BPELPlugin.logMessage(message, exception, IStatus.ERROR); // Bugzilla 324165 // add the error to resource if (fCurrentResource!=null) fCurrentResource.getErrors().add(new SAXParseDiagnostic(exception, SAXParseDiagnostic.ERROR)); } /** * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException) */ @SuppressWarnings("boxing") public void fatalError(SAXParseException exception) { String message = java.text.MessageFormat.format( "Fatal Error in {0} [{2}:{3}] {4}", exception.getPublicId(), exception.getSystemId(), exception.getLineNumber(), exception.getColumnNumber(), exception.getLocalizedMessage() ); BPELPlugin.logMessage(message, exception, IStatus.ERROR); // Bugzilla 324165 // add the error to resource if (fCurrentResource!=null) fCurrentResource.getErrors().add(new SAXParseDiagnostic(exception, SAXParseDiagnostic.FATAL_ERROR)); } /** * @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException) */ @SuppressWarnings("boxing") public void warning (SAXParseException exception) { String message = java.text.MessageFormat.format( "Warning in {0} [{2}:{3}] {4}", exception.getPublicId(), exception.getSystemId(), exception.getLineNumber(), exception.getColumnNumber(), exception.getLocalizedMessage() ); BPELPlugin.logMessage(message, exception, IStatus.WARNING); // Bugzilla 324165 // add the error to resource if (fCurrentResource!=null) fCurrentResource.getErrors().add(new SAXParseDiagnostic(exception, SAXParseDiagnostic.WARNING)); } }