/******************************************************************************* | |
* Copyright (c) 2008, 2012 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.extensionsample.model.util; | |
import java.util.Map; | |
import javax.wsdl.extensions.ExtensionRegistry; | |
import javax.xml.namespace.QName; | |
import org.eclipse.bpel.extensionsample.model.ModelFactory; | |
import org.eclipse.bpel.extensionsample.model.ModelPackage; | |
import org.eclipse.bpel.extensionsample.model.SampleSimpleActivity; | |
import org.eclipse.bpel.extensionsample.model.SampleStructuredActivity; | |
import org.eclipse.bpel.model.Activity; | |
import org.eclipse.bpel.model.BPELFactory; | |
import org.eclipse.bpel.model.BPELPackage; | |
import org.eclipse.bpel.model.Import; | |
import org.eclipse.bpel.model.Process; | |
import org.eclipse.bpel.model.Variable; | |
import org.eclipse.bpel.model.extensions.BPELActivityDeserializer; | |
import org.eclipse.bpel.model.resource.BPELReader; | |
import org.eclipse.bpel.model.util.BPELUtils; | |
import org.eclipse.bpel.model.util.ImportResolver; | |
import org.eclipse.bpel.model.util.ImportResolverRegistry; | |
import org.eclipse.bpel.model.util.WSDLUtil; | |
import org.eclipse.bpel.ui.util.ModelHelper; | |
import org.eclipse.emf.common.util.URI; | |
import org.eclipse.emf.ecore.EObject; | |
import org.eclipse.wst.wsdl.Definition; | |
import org.eclipse.wst.wsdl.Message; | |
import org.eclipse.xsd.XSDElementDeclaration; | |
import org.eclipse.xsd.XSDTypeDefinition; | |
import org.w3c.dom.Element; | |
import org.w3c.dom.Node; | |
import org.w3c.dom.NodeList; | |
/* | |
* Bug 120110 - this class has been updated to include a Variable | |
* reference for the SampleSimpleActivity and a Variable definition | |
* for the SampleStructuredActivity. | |
*/ | |
public class ExtensionSampleActivityDeserializer implements BPELActivityDeserializer { | |
@Override | |
public Activity unmarshall(QName elementType, Node node, Activity activity, Process process, | |
Map nsMap, ExtensionRegistry extReg, URI uri, BPELReader bpelReader) { | |
/* | |
* SampleSimpleActivity | |
*/ | |
if (ExtensionsampleConstants.ND_SAMPLE_SIMPLE_ACTIVITY.equals(elementType.getLocalPart())) { | |
// create a new SampleSimpleActivity model object if not already created | |
SampleSimpleActivity sa; | |
Element saElement = (Element)node; | |
// https://bugs.eclipse.org/bugs/show_bug.cgi?id=334424 | |
if (activity instanceof SampleSimpleActivity) { | |
sa = (SampleSimpleActivity)activity; | |
} | |
else { | |
sa = ModelFactory.eINSTANCE | |
.createSampleSimpleActivity(); | |
// attach the DOM node to our new activity | |
sa.setElement(saElement); | |
} | |
// handle the SampleExtensionAttribute | |
String attName = ModelPackage.eINSTANCE | |
.getSampleSimpleActivity_SampleExtensionAttribute().getName(); | |
if (saElement.getAttribute(attName) != null) { | |
sa.setSampleExtensionAttribute(saElement.getAttribute(attName)); | |
} | |
// handle variable name: find this variable is in a visible scope | |
String value = saElement.getAttribute("variable"); | |
if (value!=null && !"".equals(value.trim())) { | |
Variable[] vars = ModelHelper.getVisibleVariables(activity); | |
for (int i=vars.length-1; i>=0; --i) { | |
if (value.equals(vars[i].getName())) { | |
sa.setVariable(vars[i]); | |
break; | |
} | |
} | |
} | |
return sa; | |
} | |
/* | |
* SampleStructuredActivity | |
*/ | |
if (ExtensionsampleConstants.ND_SAMPLE_STRUCTURED_ACTIVITY.equals(elementType | |
.getLocalPart())) { | |
Element saElement = (Element) node; | |
// create a new SampleStructuredActivity model object | |
SampleStructuredActivity sa; | |
if (activity instanceof SampleStructuredActivity) { | |
sa = (SampleStructuredActivity)activity; | |
} | |
else | |
{ | |
sa = ModelFactory.eINSTANCE | |
.createSampleStructuredActivity(); | |
// attach the DOM node to our new activity | |
sa.setElement(saElement); | |
} | |
// handle variable definition | |
String value = saElement.getAttribute("variable"); | |
if (value!=null && !"".equals(value.trim())) { | |
Variable variable = sa.getVariable(); | |
if (variable==null) | |
variable = BPELFactory.eINSTANCE.createVariable(); | |
variable.setName(value); | |
value = saElement.getAttribute("messageType"); | |
if (value!=null && !"".equals(value.trim())) { | |
QName qname = BPELUtils.createQName(process.getElement(), value); | |
Message message = (Message)scanImports( process, qname, WSDLUtil.WSDL_MESSAGE ); | |
if (message!=null) | |
variable.setMessageType(message); | |
} | |
value = saElement.getAttribute("type"); | |
if (value!=null && !"".equals(value.trim())) { | |
QName qname = BPELUtils.createQName(process.getElement(), value); | |
XSDTypeDefinition type = (XSDTypeDefinition)scanImports( process, qname, WSDLUtil.XSD_TYPE_DEFINITION ); | |
if (type!=null) | |
variable.setType(type); | |
} | |
value = saElement.getAttribute("element"); | |
if (value!=null && !"".equals(value.trim())) { | |
QName qname = BPELUtils.createQName(process.getElement(), value); | |
XSDElementDeclaration elem = (XSDElementDeclaration)scanImports( process, qname, WSDLUtil.XSD_ELEMENT_DECLARATION ); | |
if (elem!=null) | |
variable.setXSDElement(elem); | |
} | |
sa.setVariable(variable); | |
} | |
// handle the child activity | |
NodeList childElements = saElement.getChildNodes(); | |
Element activityElement = null; | |
if (childElements != null && childElements.getLength() > 0) { | |
for (int i = 0; i < childElements.getLength(); i++) { | |
// the only element node is the child activity | |
if ((childElements.item(i).getNodeType() == Node.ELEMENT_NODE)) { | |
activityElement = (Element) childElements.item(i); | |
Activity childActivity = bpelReader.xml2Activity(activityElement); | |
if (childActivity != null) { | |
sa.setActivity(childActivity); | |
} | |
} | |
} | |
} | |
return sa; | |
} | |
System.err.println("Cannot handle this kind of element"); | |
return null; | |
} | |
static EObject scanImports( Process process, QName qname , String refType ) { | |
EObject result = null; | |
for(Object n : process.getImports()) { | |
Import imp = (Import) n; | |
if (imp.getLocation() == null ) { | |
continue; | |
} | |
ImportResolver[] resolvers = ImportResolverRegistry.INSTANCE.getResolvers(imp.getImportType()); | |
for(ImportResolver r : resolvers) { | |
result = r.resolve(imp, qname, null, refType); | |
if (result != null) { | |
return result; | |
} | |
} | |
} | |
return null; | |
} | |
} |