/**
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.airavata.workflow.model.wf;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.xml.namespace.QName;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import org.apache.airavata.common.exception.AiravataException;
import org.apache.airavata.common.utils.JSONUtil;
import org.apache.airavata.common.utils.XMLUtil;
import org.apache.airavata.workflow.model.component.Component;
import org.apache.airavata.workflow.model.component.ComponentException;
import org.apache.airavata.workflow.model.component.ws.WSComponent;
import org.apache.airavata.workflow.model.component.ws.WSComponentKey;
import org.apache.airavata.workflow.model.component.ws.WSComponentPort;
import org.apache.airavata.workflow.model.exceptions.WorkflowException;
import org.apache.airavata.workflow.model.exceptions.WorkflowRuntimeException;
import org.apache.airavata.workflow.model.gpel.script.BPELScript;
import org.apache.airavata.workflow.model.graph.GraphException;
import org.apache.airavata.workflow.model.graph.GraphSchema;
import org.apache.airavata.workflow.model.graph.Node;
import org.apache.airavata.workflow.model.graph.impl.NodeImpl;
import org.apache.airavata.workflow.model.graph.system.InputNode;
import org.apache.airavata.workflow.model.graph.system.OutputNode;
import org.apache.airavata.workflow.model.graph.util.GraphUtil;
import org.apache.airavata.workflow.model.graph.ws.WSGraph;
import org.apache.airavata.workflow.model.graph.ws.WSGraphFactory;
import org.apache.airavata.workflow.model.graph.ws.WSNode;
//import org.apache.airavata.workflow.model.ode.ODEBPELTransformer;
//import org.apache.airavata.workflow.model.ode.ODEDeploymentDescriptor;
//import org.apache.airavata.workflow.model.ode.ODEWSDLTransformer;
//import org.apache.airavata.workflow.model.ode.WSDLCleaner;
import org.apache.airavata.workflow.model.utils.ApplicationVersion;
import org.apache.airavata.workflow.model.utils.WorkflowConstants;
import org.apache.commons.codec.binary.Base64;
//import org.gpel.GpelConstants;
//import org.gpel.model.GpelProcess;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xmlpull.infoset.XmlElement;
import org.xmlpull.infoset.XmlInfosetBuilder;
import org.xmlpull.infoset.XmlNamespace;
//import xsul5.XmlConstants;
//import xsul5.wsdl.WsdlDefinitions;
public class Workflow implements Cloneable {
/**
* Namespace prefix
*/
public static final String NS_PREFIX_XWF = "xwf";
/**
* Namespace URI
*/
public static final String NS_URI_XWF = WorkflowConstants.NS_URI_XBAYA + "xwf";
/**
* Namespace
*/
public static final XmlNamespace NS_XWF = XMLUtil.BUILDER.newNamespace(NS_PREFIX_XWF, NS_URI_XWF);
/**
* WORKFLOW_TAG
*/
public static final String WORKFLOW_TAG = "workflow";
private static final String VERSION_ATTRIBUTE = "version";
private static final String WSDLS_TAG = "wsdls";
private static final String WSDL_TAG = "wsdl";
private static final String BPEL_TAG = "bpel";
private static final String WORKFLOW_WSDL_TAG = "workflowWSDL";
private static final String IMAGE_TAG = "image";
private static final String ID_ATTRIBUTE = "id";
private static final Logger logger = LoggerFactory.getLogger(Workflow.class);
private WSGraph graph;
private BufferedImage image;
private URI gpelTemplateID;
private URI gpelInstanceID;
// private GpelProcess gpelProcess;
//
// private WsdlDefinitions workflowWSDL;
//
// private WsdlDefinitions odeInvokableWSDL;
//
// private WsdlDefinitions odeWorkflowWSDL;
//
// private GpelProcess odeProcess;
//
// private Map<String, WsdlDefinitions> odeWsdlMap;
private boolean editable=true;
/**
* used only during the parsing xwf or loading from GPEL.
*/
// private Map<String, WsdlDefinitions> wsdlMap;
private XmlElement odeDeploymentDiscriptor;
private volatile WorkflowExecutionState executionState = WorkflowExecutionState.NONE;
// private WsdlDefinitions tridentWSDL;
/**
* Constructs a Workflow.
*/
public Workflow() {
// this.wsdlMap = new HashMap<String, WsdlDefinitions>();
// Create a empty graph here to avoid null checks.
this.graph = WSGraphFactory.createGraph();
}
/**
* Constructs a Workflow.
*
* @param workflowString
* Workflow XML in String.
* @throws GraphException
* @throws ComponentException
*/
public Workflow(String workflowString) throws GraphException, ComponentException {
this();
try {
// XmlElement workflowElement = XMLUtil.stringToXmlElement(workflowString);
JsonObject workflowElement = JSONUtil.stringToJSONObject(workflowString);
parse(workflowElement);
} catch (RuntimeException e) {
throw new GraphException(e);
}
}
/**
* Constructs a workflow from a given URI.
* @param workflowFilePath The workflow URI path.
* @throws GraphException If an error occurred while creating workflow.
* @throws ComponentException If an error occurred while parsing the workflow content.
*/
public Workflow(URI workflowFilePath) throws GraphException, ComponentException {
this();
try {
XmlElement workflowElement = XMLUtil.loadXML(workflowFilePath.toURL().openStream());
parse(workflowElement);
} catch (RuntimeException e) {
throw new GraphException(e);
} catch (IOException e) {
throw new GraphException(e);
}
}
/**
* Constructs a Workflow.
*
* @param workflowElement
* @throws GraphException
* @throws ComponentException
*/
public Workflow(XmlElement workflowElement) throws GraphException, ComponentException {
this();
parse(workflowElement);
}
public Workflow(JsonObject workflowObject) throws GraphException, ComponentException {
this();
parse(workflowObject);
}
/**
* This is used for ODE
*
* @return The Template ID like id
*/
public URI getUniqueWorkflowName() {
try {
return new URI(WorkflowConstants.LEAD_NS + "/" + this.getName());
} catch (URISyntaxException e) {
throw new WorkflowRuntimeException(e);
}
}
public URI getNameSpace() {
try {
return new URI(WorkflowConstants.LEAD_NS);
} catch (URISyntaxException e) {
throw new WorkflowRuntimeException(e);
}
}
/**
* Returns the gpelInstanceID.
*
* @return The gpelInstanceID
*/
public URI getGPELInstanceID() {
return this.gpelInstanceID;
}
/**
* Sets gpelInstanceID.
*
* @param gpelInstanceID
* The gpelInstanceID to set.
*/
public void setGPELInstanceID(URI gpelInstanceID) {
this.gpelInstanceID = gpelInstanceID;
}
/**
* Returns the name.
*
* @return The name
*/
public String getName() {
return this.graph.getName();
}
/**
* Sets name.
*
* @param name
* The name to set.
*/
public void setName(String name) {
this.graph.setName(name);
}
/**
* Returns the description.
*
* @return The description
*/
public String getDescription() {
return this.graph.getDescription();
}
/**
* Sets description.
*
* @param description
* The description to set.
*/
public void setDescription(String description) {
this.graph.setDescription(description);
}
/**
* Returns the graph.
*
* @return The graph
*/
public WSGraph getGraph() {
return this.graph;
}
/**
* Sets graph.
*
* @param graph
* The graph to set.
*/
public void setGraph(WSGraph graph) {
this.graph = graph;
}
/**
* Returns the image.
*
* @return The image
*/
public BufferedImage getImage() {
return this.image;
}
/**
* Sets image.
*
* @param image
* The image to set.
*/
public void setImage(BufferedImage image) {
this.image = image;
}
// /**
// * Returns the gpelProcess.
// *
// * @return The gpelProcess
// */
// public GpelProcess getGpelProcess() {
// return this.gpelProcess;
// }
//
// /**
// * Sets gpelProcess.
// *
// * @param gpelProcess
// * The gpelProcess to set.
// */
// public void setGpelProcess(GpelProcess gpelProcess) {
// this.gpelProcess = gpelProcess;
// }
//
// /**
// * Returns the workflowWSDL.
// *
// * @return The workflowWSDL
// */
// public WsdlDefinitions getWorkflowWSDL() {
// return this.workflowWSDL;
// }
//
// /**
// * Sets workflowWSDL.
// *
// * @param workflowWSDL
// * The workflowWSDL to set.
// */
// public void setWorkflowWSDL(WsdlDefinitions workflowWSDL) {
// this.workflowWSDL = workflowWSDL;
// }
//
// /**
// * @return The set of WSDLs
// */
// public Map<String, WsdlDefinitions> getWSDLs() {
//
// Map<String, WsdlDefinitions> wsdls = new LinkedHashMap<String, WsdlDefinitions>();
//// Map<WsdlDefinitions, String> ids = new HashMap<WsdlDefinitions, String>();
//// // Use LinkedHashMap to preserve the order of WSDLs, which is useful for
//// // some unit tests.
////
//// for (WSNode node : GraphUtil.getNodes(this.graph, WSNode.class)) {
//// WsdlDefinitions wsdl = node.getComponent().getWSDL();
//// if (wsdls.containsValue(wsdl)) {
//// String id = ids.get(wsdl);
//// node.setWSDLID(id);
//// } else {
//// // Assign unique key
//// String name = WSDLUtil.getWSDLName(wsdl);
//// String id = StringUtil.convertToJavaIdentifier(name);
//// while (wsdls.containsKey(id)) {
//// id = StringUtil.incrementName(id);
//// }
//// wsdls.put(id, wsdl);
//// ids.put(wsdl, id);
//// node.setWSDLID(id);
//// }
//// }
// return wsdls;
// }
//
// /**
// * This method is called by GPELClient during loading a workflow.
// *
// * @param id
// * @param wsdl
// */
// public void addWSDL(String id, WsdlDefinitions wsdl) {
// logger.debug("id: " + id);
// this.wsdlMap.put(id, wsdl);
// }
/**
* Creates a node from a specified component and adds it to the graph.
*
* @param component
* The specified component
* @return The node added
*/
public Node addNode(Component component) {
Node node = component.createNode(this.graph);
return node;
}
/**
* Removes a specified node from the graph.
*
* @param node
* The specified node
* @throws GraphException
*/
public void removeNode(Node node) throws GraphException {
this.graph.removeNode(node);
}
/**
* Imports a specified workflow to the current workflow.
*
* @param workflow
* The specified workflow to import
* @throws GraphException
*/
public void importWorkflow(Workflow workflow) throws GraphException {
this.graph.importGraph(workflow.getGraph());
}
/**
* Returns the inputs of the workflow.
*
* @return The inputs of the workflow.
* @throws ComponentException
*/
public List<WSComponentPort> getInputs() throws ComponentException {
List<InputNode> nodes = GraphUtil.getNodes(this.graph, InputNode.class);
List<WSComponentPort> ports = new ArrayList<WSComponentPort>();
for (InputNode inputNode : nodes) {
ports.add(new WSComponentPort(inputNode.getName(), inputNode.getOutputPorts().get(0).getType(), null));
}
return ports;
}
public List<WorkflowInput> getWorkflowInputs() throws Exception{
List<InputNode> inputNodes = GraphUtil.getInputNodes(getGraph());
List<WorkflowInput> results=new ArrayList<WorkflowInput>();
for (InputNode port : inputNodes) {
results.add(new WorkflowInput(port.getID(), port.getParameterType(), port.getDefaultValue(), port.getDefaultValue(), !port.isVisibility()));
}
return results;
}
/**
* Returns the outputs of the workflow.
*
* @return The outputs of the workflow.
* @throws ComponentException
*/
public List<WSComponentPort> getOutputs() throws ComponentException {
List<OutputNode> nodes = GraphUtil.getNodes(this.graph, OutputNode.class);
List<WSComponentPort> ports = new ArrayList<WSComponentPort>();
for (OutputNode outputNode : nodes) {
ports.add(new WSComponentPort(outputNode.getName(), outputNode.getOutputPorts().get(0).getType(), null));
}
return ports;
}
/**
* Returns the XML Text of the workflow.
*
* @return The XML Text of the workflow
*/
@Deprecated
public String toXMLText() {
return XMLUtil.xmlElementToString(toXML());
}
public void setGraphID(String id){
getGraph().setID(id);
}
/**
* Returns the XmlElement of the workflow.
*
* @return The XmlElement of the workflow
*/
public XmlElement toXML() {
// This must be before graph.toXML() to set WSDL ID to each node.
//FIXME
// Map<String, WsdlDefinitions> wsdls = getWSDLs();
XmlElement workflowElement = XMLUtil.BUILDER.newFragment(NS_XWF, WORKFLOW_TAG);
// Version
workflowElement.setAttributeValue(NS_XWF, VERSION_ATTRIBUTE, ApplicationVersion.VERSION.getVersion());
// Date
// TODO add modification time
// XmlElement modifiedTimeElement = graphElement.addElement(
// XgraphSchema.NS, "modifiedTime");
// modifiedTimeElement.addChild(new GregorianCalendar().toString());
// Graph
workflowElement.addElement(this.graph.toXML());
// WSDLs
XmlElement wsdlsElement = workflowElement.addElement(NS_XWF, WSDLS_TAG);
// for (String id : wsdls.keySet()) {
// WsdlDefinitions wsdl = wsdls.get(id);
// XmlElement wsdlElement = wsdlsElement.addElement(NS_XWF, WSDL_TAG);
// wsdlElement.setAttributeValue(NS_XWF, ID_ATTRIBUTE, id);
// wsdlElement.setText(XMLUtil.xmlElementToString(wsdl.xml()));
// }
// Image
if (this.image != null) {
try {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
ImageIO.write(this.image, WorkflowConstants.PNG_FORMAT_NAME, outStream);
byte[] bytes = outStream.toByteArray();
byte[] base64 = Base64.encodeBase64Chunked(bytes);
XmlElement imageElement = workflowElement.addElement(NS_XWF, IMAGE_TAG);
imageElement.setText(new String(base64));
} catch (IOException e) {
// No image
logger.error(e.getMessage(), e);
}
}
// BPEL
// if (this.gpelProcess != null) {
// XmlElement bpelElement = workflowElement.addElement(NS_XWF, BPEL_TAG);
// bpelElement.setText(this.gpelProcess.xmlStringPretty());
// }
//
// // Workflow WSDL
// if (this.workflowWSDL != null) {
// XmlElement workflowWSDLElement = workflowElement.addElement(NS_XWF, WORKFLOW_WSDL_TAG);
// workflowWSDLElement.setText(this.workflowWSDL.xmlStringPretty());
// }
return workflowElement;
}
public JsonObject toJSON() {
JsonObject workflowRoot = new JsonObject();
JsonObject workflow = new JsonObject();
workflowRoot.add(WORKFLOW_TAG, workflow);
workflow.addProperty(VERSION_ATTRIBUTE, ApplicationVersion.VERSION.getVersion());
workflow.add(GraphSchema.GRAPH_TAG, this.graph.toJSON());
if (this.image != null) {
try {
workflow.addProperty(IMAGE_TAG, getBase64String());
} catch (IOException e) {
logger.error("Failed to attached image to workflow description", e);
}
}
return workflowRoot;
}
private String getBase64String() throws IOException {
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
ImageIO.write(this.image, WorkflowConstants.PNG_FORMAT_NAME, outputStream);
byte[] bytes = outputStream.toByteArray();
byte[] base64 = Base64.encodeBase64Chunked(bytes);
return new String(base64);
}
/**
* Binds WSNodes to components
*
* @throws ComponentException
* @throws GraphException
*/
public void bindComponents() throws ComponentException, GraphException {
// This map is to avoid creating multiple instances for the a component
Map<WSComponentKey, WSComponent> components = new HashMap<WSComponentKey, WSComponent>();
for (WSNode node : GraphUtil.getWSNodes(this.graph)) {
String id = node.getWSDLID();
logger.debug("id: " + id);
// WsdlDefinitions wsdl = this.wsdlMap.get(id);
//
// if (wsdl == null) {
// // XXX This happens while loading a workflow that is created by
// // the version 2.2.6_2 or below from GPEL.
// // Need to look for wsdl manually.
// // id should be look like
// // {http://www.extreme.indiana.edu/math/}Adder
// for (WsdlDefinitions w : this.wsdlMap.values()) {
// QName name = WSDLUtil.getWSDLQName(w);
// if (name.toString().equals(id)) {
// wsdl = w;
// break;
// }
// }
// }
// if (wsdl == null) {
// continue;
// }
// try {
// QName portType = node.getPortTypeQName();
// if (portType == null) {
// // XXX This happens while parsing xwf created by the version
// // 2.2.6_1 or below.
// portType = WSDLUtil.getFirstPortTypeQName(wsdl);
// }
// String operation = node.getOperationName();
// if (operation == null) {
// // XXX This happens while parsing xwf created by the version
// // 2.2.6_1 or below.
// operation = WSDLUtil.getFirstOperationName(wsdl, portType);
// }
// WSComponentKey key = new WSComponentKey(id, portType, operation);
//
// WSComponent component = null;
// if (components.containsKey(key)) {
// component = components.get(key);
// } else {
// //FIXME
//// component = WSComponentFactory.createComponent(wsdl, portType, operation);
// components.put(key, component);
// }
// node.setComponent(component);
// } catch (UtilsException e) {
// logger.error(e.getMessage(), e);
// }
}
this.graph.fixParameterNodes();
GraphUtil.propagateTypes(this.graph);
}
/**
* @see java.lang.Object#clone()
*/
@Override
public Workflow clone() {
XmlElement originalXML = toXML();
try {
XmlElement newXML = XMLUtil.deepClone(originalXML);
Workflow newWorkflow = new Workflow(newXML);
return newWorkflow;
} catch (GraphException e) {
// This should not happen.
throw new WorkflowRuntimeException(e);
} catch (WorkflowException e) {
// This should not happen.
throw new WorkflowRuntimeException(e);
} catch (AiravataException e) {
// This should not happen.
throw new WorkflowRuntimeException(e);
}
}
/**
* @param graph
* @return The workflow
*/
public static Workflow graphToWorkflow(WSGraph graph) {
Workflow workflow = new Workflow();
workflow.setGraph(graph);
workflow.setName(graph.getName());
workflow.setDescription(graph.getDescription());
return workflow;
}
/**
* @param workflowElement
* @throws GraphException
* @throws ComponentException
*/
private void parse(XmlElement workflowElement) throws GraphException, ComponentException {
// Graph
XmlElement graphElement = workflowElement.element(GraphSchema.GRAPH_TAG);
this.graph = WSGraphFactory.createGraph(graphElement);
// WsdlDefinitions wsdl = null;
// XmlElement wsdlsElement = workflowElement.element(WSDLS_TAG);
// for (XmlElement wsdlElement : wsdlsElement.elements(null, WSDL_TAG)) {
// String wsdlText = wsdlElement.requiredText();
// try {
// wsdl = WSDLUtil.stringToWSDL(wsdlText);
// } catch (UtilsException e) {
// logger.error(e.getMessage(), e);
// }
// String id = wsdlElement.attributeValue(NS_XWF, ID_ATTRIBUTE);
// if (id == null || id.length() == 0) {
// // xwf up to 2.2.6_2 doesn't have ID.
// id = WSDLUtil.getWSDLQName(wsdl).toString();
// }
// addWSDL(id, wsdl);
// }
bindComponents();
// Image
XmlElement imageElement = workflowElement.element(IMAGE_TAG);
if (imageElement != null) {
String base64 = imageElement.requiredText();
byte[] bytes = Base64.decodeBase64(base64.getBytes());
try {
this.image = ImageIO.read(new ByteArrayInputStream(bytes));
} catch (IOException e) {
// This should not happen and it's OK that image is broken. We
// can reproduce it anytime.
logger.error(e.getMessage(), e);
}
}
XmlElement bpelElement = workflowElement.element(BPEL_TAG);
if (bpelElement != null) {
try {
String bpelString = bpelElement.requiredText();
XmlNamespace gpelNS = XmlInfosetBuilder.newInstance().newNamespace(BPELScript.GPEL, BPELScript.GPELNS);
// GpelConstants.GPEL_NS = gpelNS;
// this.gpelProcess = new GpelProcess(XMLUtil.stringToXmlElement(bpelString));
} catch (RuntimeException e) {
String error = "Failed to parse the BPEL document.";
throw new GraphException(error, e);
}
}
XmlElement workflowWSDLElement = workflowElement.element(WORKFLOW_WSDL_TAG);
if (workflowWSDLElement != null) {
try {
String wsdlText = workflowWSDLElement.requiredText();
// this.workflowWSDL = new WsdlDefinitions(XMLUtil.stringToXmlElement(wsdlText));
} catch (RuntimeException e) {
String error = "Failed to parse the workflow WSDL.";
throw new GraphException(error, e);
}
}
}
private void parse(JsonObject workflowObject) throws GraphException, ComponentException {
// Graph
if (workflowObject.getAsJsonObject(WORKFLOW_TAG) == null) {
throw new GraphException("Failed to parse the json object, workflow object doesn't exist");
}
JsonObject workflowObj = workflowObject.getAsJsonObject(WORKFLOW_TAG);
JsonObject graphObject = workflowObj.getAsJsonObject(GraphSchema.GRAPH_TAG);
this.graph = WSGraphFactory.createGraph(graphObject);
bindComponents();
// Image
JsonPrimitive imagePrimitive = workflowObj.getAsJsonPrimitive(IMAGE_TAG);
if (imagePrimitive != null) {
String base64 = imagePrimitive.getAsString();
byte[] bytes = Base64.decodeBase64(base64.getBytes());
try {
this.image = ImageIO.read(new ByteArrayInputStream(bytes));
} catch (IOException e) {
logger.error(e.getMessage(), e);
}
}
}
public XmlElement getODEDeploymentDescriptor(URI dscUrl, String odeEprEndingWithPort) throws GraphException,
ComponentException {
// if (this.odeDeploymentDiscriptor == null) {
// this.odeDeploymentDiscriptor = new ODEDeploymentDescriptor().generate(this.getName(),
// getOdeWorkflowWSDL(dscUrl, odeEprEndingWithPort), getOdeProcess(dscUrl, odeEprEndingWithPort),
// getOdeServiceWSDLs(dscUrl, odeEprEndingWithPort));
// }
return this.odeDeploymentDiscriptor;
}
// /**
// * Returns the odeWorkflowWSDL.
// *
// * @return The odeWorkflowWSDL
// * @throws GraphException
// * @throws ComponentException
// */
// public WsdlDefinitions getOdeInvokableWSDL(URI dscUrl, String odeEprEndingWithPort) throws GraphException,
// ComponentException {
// if (this.odeInvokableWSDL == null) {
// generateODEScripts(dscUrl, odeEprEndingWithPort);
// }
// return this.odeInvokableWSDL;
// }
//
// /**
// * Returns the odeProcess.
// *
// * @return The odeProcess
// * @throws ComponentException
// * @throws GraphException
// */
// public GpelProcess getOdeProcess(URI dscUrl, String odeEprEndingWithPort) throws GraphException, ComponentException {
// if (this.odeProcess == null) {
// generateODEScripts(dscUrl, odeEprEndingWithPort);
// }
// return this.odeProcess;
// }
//
// /**
// * Returns the odeWsdlMap.
// *
// * @return The odeWsdlMap
// * @throws ComponentException
// * @throws GraphException
// */
// public Map<String, WsdlDefinitions> getOdeServiceWSDLs(URI dscUrl, String odeEprEndingWithPort)
// throws GraphException, ComponentException {
// if (this.odeWsdlMap == null) {
// generateODEScripts(dscUrl, odeEprEndingWithPort);
// }
//
// return this.odeWsdlMap;
// }
//
// /**
// * Returns the odeWorkflowWSDL.
// *
// * @return The odeWorkflowWSDL
// * @throws ComponentException
// * @throws GraphException
// */
// public WsdlDefinitions getOdeWorkflowWSDL(URI dscUrl, String odeEprEndingWithPort) throws GraphException,
// ComponentException {
// if (this.odeWorkflowWSDL == null) {
// generateODEScripts(dscUrl, odeEprEndingWithPort);
// }
//
// return this.odeWorkflowWSDL;
// }
//
// public WsdlDefinitions getTridentWorkflowWSDL(URI dscUrl, String odeEprEndingWithPort) throws GraphException,
// ComponentException {
// if (this.tridentWSDL == null) {
// generateODEScripts(dscUrl, odeEprEndingWithPort);
// }
//
// return this.tridentWSDL;
// }
//
// private void generateODEScripts(URI dscUrl, String odeEprEndingWithPort) throws GraphException, ComponentException {
// this.getGraph().setID(this.getName());
//
// BPELScript script = null;
//
// script = new BPELScript(this);
// ODEWSDLTransformer wsdlTransformer = new ODEWSDLTransformer();
// script.create(BPELScriptType.BPEL2);
// this.odeProcess = script.getGpelProcess();
// this.odeProcess.setTargetNamespace(WorkflowConstants.LEAD_NS);
//
// WsdlDefinitions abstractWorkflowWsdl = script.getWorkflowWSDL().getWsdlDefinitions();
// this.odeWorkflowWSDL = abstractWorkflowWsdl;
// try {
// this.odeInvokableWSDL = WSDLUtil.stringToWSDL(abstractWorkflowWsdl.xmlString());
// wsdlTransformer.makeWorkflowWSDLConcrete(this.odeInvokableWSDL, this.getName(), dscUrl);
// wsdlTransformer.setOdeLocation(odeEprEndingWithPort, this.getName(), this.odeInvokableWSDL);
//
// this.odeWsdlMap = new HashMap<String, WsdlDefinitions>();
// Collection<XmlElement> itr = script.getWSDLs();
// for (XmlElement xmlElement : itr) {
// WsdlDefinitions wsdl = WSDLUtil.stringToWSDL(XmlConstants.BUILDER.serializeToString(xmlElement));
// String id = xmlElement.attributeValue(NS_XWF, ID_ATTRIBUTE);
// if (id == null || id.length() == 0) {
// // xwf up to 2.2.6_2 doesn't have ID.
// id = WSDLUtil.getWSDLQName(wsdl).toString();
// if (null == id || "".equals(id) || (id.startsWith("{") && id.endsWith("}"))) {
// QName wsdlQname = new QName(NS_XWF.getName(), WSDLUtil.getFirstOperationName(wsdl,
// WSDLUtil.getFirstPortTypeQName(wsdl)));
// id = wsdlQname.toString();
// wsdl.xml().setAttributeValue("name", wsdlQname.getLocalPart());
// }
// }
// WSDLCleaner.cleanWSDL(wsdl);
// this.odeWsdlMap.put(id, wsdl);
// }
// } catch (Exception e) {
// logger.error(e.getMessage(), e);
// }
// new ODEBPELTransformer()
// .generateODEBPEL(this.odeProcess, this.getName(), this.odeWorkflowWSDL, this.odeWsdlMap);
//
// wsdlTransformer.trasnformToODEWsdls(this.getName(), dscUrl, this.odeWorkflowWSDL, this.odeWsdlMap);
//
// String wsdlString = XMLUtil.xmlElementToString(this.odeWorkflowWSDL.xml());
// this.tridentWSDL = new WsdlDefinitions(XMLUtil.stringToXmlElement(wsdlString));
// new TridentTransformer().process(this.tridentWSDL);
//
// }
/**
* @return
*/
public QName getQname() {
return new QName(WorkflowConstants.LEAD_NS, this.getName());
}
/**
* @param templateID
*/
public void setGPELTemplateID(URI templateID) {
this.gpelTemplateID = templateID;
}
/**
* @return
*/
public URI getGPELTemplateID() {
return this.gpelTemplateID;
}
public boolean equals(Workflow workflow) {
return this.graph.equals(workflow.getGraph());
}
private Object executionStateLock=new Object();
/**
* @return
*/
public synchronized WorkflowExecutionState getExecutionState() {
WorkflowExecutionState result;
synchronized (executionStateLock) {
result=this.executionState;
}
return result;
}
/**
* @param state
*/
public synchronized void setExecutionState(WorkflowExecutionState state) {
synchronized (executionStateLock) {
this.executionState = state;
}
}
public boolean isEditable() {
return editable;
}
public void setEditable(boolean editable) {
this.editable = editable;
getGraph().setEditable(isEditable());
}
public void createScript() throws GraphException {
// Generate a BPEL process.
BPELScript script = new BPELScript(this);
// script.create(BPELScriptType.GPEL);
// this.setGpelProcess(script.getGpelProcess());
// this.setWorkflowWSDL(script.getWorkflowWSDL().getWsdlDefinitions());
}
public List<String> getWorkflowServiceNodeIDs() {
List<NodeImpl> nodes = getGraph().getNodes();
ArrayList<String> nodeIDs = new ArrayList<String>();
for (Node node : nodes) {
if (node instanceof WSNode) {
nodeIDs.add(node.getID());
}
}
return nodeIDs;
}
}