You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by ch...@apache.org on 2016/02/08 17:48:57 UTC
[15/50] [abbrv] airavata git commit: Fixed some compilation issues
with workflow-core model
Fixed some compilation issues with workflow-core model
Project: http://git-wip-us.apache.org/repos/asf/airavata/repo
Commit: http://git-wip-us.apache.org/repos/asf/airavata/commit/b65079a7
Tree: http://git-wip-us.apache.org/repos/asf/airavata/tree/b65079a7
Diff: http://git-wip-us.apache.org/repos/asf/airavata/diff/b65079a7
Branch: refs/heads/master
Commit: b65079a75e8a67d4c48832bcd7a168a0aa3b7d99
Parents: b5d568d
Author: Shameera Rathnayaka <sh...@gmail.com>
Authored: Mon Feb 1 12:01:48 2016 -0500
Committer: Shameera Rathnayaka <sh...@gmail.com>
Committed: Mon Feb 1 12:01:48 2016 -0500
----------------------------------------------------------------------
.../airavata/workflow/core/ProcessContext.java | 62 -----------
.../core/SimpleWorkflowInterpreter.java | 111 +++++++++----------
.../airavata/workflow/core/WorkflowContext.java | 60 ++++++++++
.../workflow/core/WorkflowEnactmentService.java | 22 ++--
.../core/parser/JsonWorkflowParser.java | 21 ++++
5 files changed, 140 insertions(+), 136 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/airavata/blob/b65079a7/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/ProcessContext.java
----------------------------------------------------------------------
diff --git a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/ProcessContext.java b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/ProcessContext.java
deleted file mode 100644
index cf78f9e..0000000
--- a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/ProcessContext.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.airavata.workflow.core;
-
-import org.apache.airavata.model.experiment.TaskDetails;
-import org.apache.airavata.model.experiment.WorkflowNodeDetails;
-import org.apache.airavata.workflow.core.dag.nodes.WorkflowNode;
-
-public class ProcessContext {
- private WorkflowNode workflowNode;
- private WorkflowNodeDetails wfNodeDetails;
- private TaskDetails taskDetails;
-
- public ProcessContext(WorkflowNode workflowNode, WorkflowNodeDetails wfNodeDetails, TaskDetails taskDetails) {
- this.workflowNode = workflowNode;
- this.wfNodeDetails = wfNodeDetails;
- this.taskDetails = taskDetails;
- }
-
- public WorkflowNode getWorkflowNode() {
- return workflowNode;
- }
-
- public void setWorkflowNode(WorkflowNode workflowNode) {
- this.workflowNode = workflowNode;
- }
-
- public WorkflowNodeDetails getWfNodeDetails() {
- return wfNodeDetails;
- }
-
- public void setWfNodeDetails(WorkflowNodeDetails wfNodeDetails) {
- this.wfNodeDetails = wfNodeDetails;
- }
-
- public TaskDetails getTaskDetails() {
- return taskDetails;
- }
-
- public void setTaskDetails(TaskDetails taskDetails) {
- this.taskDetails = taskDetails;
- }
-}
http://git-wip-us.apache.org/repos/asf/airavata/blob/b65079a7/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/SimpleWorkflowInterpreter.java
----------------------------------------------------------------------
diff --git a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/SimpleWorkflowInterpreter.java b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/SimpleWorkflowInterpreter.java
index 5d00354..defbad4 100644
--- a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/SimpleWorkflowInterpreter.java
+++ b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/SimpleWorkflowInterpreter.java
@@ -24,23 +24,15 @@ package org.apache.airavata.workflow.core;
import org.apache.airavata.common.exception.AiravataException;
import org.apache.airavata.common.utils.AiravataUtils;
import org.apache.airavata.messaging.core.MessageContext;
-import org.apache.airavata.messaging.core.impl.RabbitMQProcessPublisher;
+import org.apache.airavata.messaging.core.impl.RabbitMQProcessLaunchPublisher;
import org.apache.airavata.messaging.core.impl.RabbitMQStatusConsumer;
-import org.apache.airavata.model.appcatalog.appinterface.OutputDataObjectType;
-import org.apache.airavata.model.messaging.event.MessageType;
-import org.apache.airavata.model.messaging.event.ProcessSubmitEvent;
-import org.apache.airavata.model.messaging.event.TaskIdentifier;
-import org.apache.airavata.model.messaging.event.TaskOutputChangeEvent;
-import org.apache.airavata.model.messaging.event.TaskStatusChangeEvent;
-import org.apache.airavata.model.util.ExperimentModelUtil;
-import org.apache.airavata.model.experiment.ExecutionUnit;
+import org.apache.airavata.model.application.io.OutputDataObjectType;
import org.apache.airavata.model.experiment.ExperimentModel;
-import org.apache.airavata.model.experiment.TaskDetails;
-import org.apache.airavata.model.experiment.TaskState;
-import org.apache.airavata.model.experiment.WorkflowNodeDetails;
-import org.apache.airavata.model.experiment.WorkflowNodeState;
-import org.apache.airavata.model.experiment.WorkflowNodeStatus;
+import org.apache.airavata.model.messaging.event.*;
+import org.apache.airavata.model.status.ProcessState;
+import org.apache.airavata.model.util.ExperimentModelUtil;
import org.apache.airavata.registry.core.experiment.catalog.impl.RegistryFactory;
+import org.apache.airavata.registry.core.experiment.catalog.model.Experiment;
import org.apache.airavata.registry.cpi.*;
import org.apache.airavata.workflow.core.dag.edge.Edge;
import org.apache.airavata.workflow.core.dag.nodes.ApplicationNode;
@@ -69,7 +61,7 @@ class SimpleWorkflowInterpreter{
private static final Logger log = LoggerFactory.getLogger(SimpleWorkflowInterpreter.class);
private List<WorkflowInputNode> workflowInputNodes;
- private Experiment experiment;
+ private ExperimentModel experiment;
private String credentialToken;
@@ -77,23 +69,23 @@ class SimpleWorkflowInterpreter{
private Map<String, WorkflowNode> readyList = new ConcurrentHashMap<String, WorkflowNode>();
private Map<String, WorkflowNode> waitingList = new ConcurrentHashMap<String, WorkflowNode>();
- private Map<String, ProcessContext> processingQueue = new ConcurrentHashMap<String, ProcessContext>();
- private Map<String, ProcessContext> completeList = new HashMap<String, ProcessContext>();
+ private Map<String, WorkflowContext> processingQueue = new ConcurrentHashMap<String, WorkflowContext>();
+ private Map<String, WorkflowContext> completeList = new HashMap<String, WorkflowContext>();
private Registry registry;
private List<WorkflowOutputNode> completeWorkflowOutputs = new ArrayList<WorkflowOutputNode>();
- private RabbitMQProcessPublisher publisher;
+ private RabbitMQProcessLaunchPublisher publisher;
private RabbitMQStatusConsumer statusConsumer;
private String consumerId;
private boolean continueWorkflow = true;
- public SimpleWorkflowInterpreter(String experimentId, String credentialToken, String gatewayName, RabbitMQProcessPublisher publisher) throws RegistryException {
+ public SimpleWorkflowInterpreter(String experimentId, String credentialToken, String gatewayName, RabbitMQProcessLaunchPublisher publisher) throws RegistryException {
this.gatewayName = gatewayName;
setExperiment(experimentId);
this.credentialToken = credentialToken;
this.publisher = publisher;
}
- public SimpleWorkflowInterpreter(Experiment experiment, String credentialStoreToken, String gatewayName, RabbitMQProcessPublisher publisher) {
+ public SimpleWorkflowInterpreter(ExperimentModel experiment, String credentialStoreToken, String gatewayName, RabbitMQProcessLaunchPublisher publisher) {
this.gatewayName = gatewayName;
this.experiment = experiment;
this.credentialToken = credentialStoreToken;
@@ -106,7 +98,7 @@ class SimpleWorkflowInterpreter{
*/
void launchWorkflow() throws Exception {
WorkflowFactoryImpl wfFactory = WorkflowFactoryImpl.getInstance();
- WorkflowParser workflowParser = wfFactory.getWorkflowParser(experiment.getExperimentID(), credentialToken);
+ WorkflowParser workflowParser = wfFactory.getWorkflowParser(experiment.getExperimentId(), credentialToken);
log.debug("Initialized workflow parser");
setWorkflowInputNodes(workflowParser.parse());
log.debug("Parsed the workflow and got the workflow input nodes");
@@ -144,8 +136,8 @@ class SimpleWorkflowInterpreter{
}
WorkflowNodeDetails workflowNodeDetails = createWorkflowNodeDetails(readyNode);
TaskDetails process = getProcess(workflowNodeDetails);
- ProcessContext processContext = new ProcessContext(readyNode, workflowNodeDetails, process);
- addToProcessingQueue(processContext);
+ WorkflowContext workflowContext = new WorkflowContext(readyNode, workflowNodeDetails, process);
+ addToProcessingQueue(workflowContext);
publishToProcessQueue(process);
}
if (processingQueue.isEmpty()) {
@@ -277,16 +269,16 @@ class SimpleWorkflowInterpreter{
/**
* First remove the node from ready list and then add the WfNodeContainer to the process queue.
* Note that underline data structure of the process queue is a Map.
- * @param processContext - has both workflow and correspond workflowNodeDetails and TaskDetails
+ * @param workflowContext - has both workflow and correspond workflowNodeDetails and TaskDetails
*/
- private synchronized void addToProcessingQueue(ProcessContext processContext) {
- readyList.remove(processContext.getWorkflowNode().getId());
- processingQueue.put(processContext.getTaskDetails().getTaskID(), processContext);
+ private synchronized void addToProcessingQueue(WorkflowContext workflowContext) {
+ readyList.remove(workflowContext.getWorkflowNode().getId());
+ processingQueue.put(workflowContext.getTaskDetails().getTaskID(), workflowContext);
}
- private synchronized void addToCompleteQueue(ProcessContext processContext) {
- processingQueue.remove(processContext.getTaskDetails().getTaskID());
- completeList.put(processContext.getTaskDetails().getTaskID(), processContext);
+ private synchronized void addToCompleteQueue(WorkflowContext workflowContext) {
+ processingQueue.remove(workflowContext.getTaskDetails().getTaskID());
+ completeList.put(workflowContext.getTaskDetails().getTaskID(), workflowContext);
}
@@ -309,10 +301,10 @@ class SimpleWorkflowInterpreter{
String taskId = taskOutputChangeEvent.getTaskIdentity().getTaskId();
log.debug("Task Output changed event received for workflow node : " +
taskOutputChangeEvent.getTaskIdentity().getWorkflowNodeId() + ", task : " + taskId);
- ProcessContext processContext = processingQueue.get(taskId);
+ WorkflowContext workflowContext = processingQueue.get(taskId);
Set<WorkflowNode> tempWfNodeSet = new HashSet<WorkflowNode>();
- if (processContext != null) {
- WorkflowNode workflowNode = processContext.getWorkflowNode();
+ if (workflowContext != null) {
+ WorkflowNode workflowNode = workflowContext.getWorkflowNode();
if (workflowNode instanceof ApplicationNode) {
ApplicationNode applicationNode = (ApplicationNode) workflowNode;
// Workflow node can have one to many output ports and each output port can have one to many links
@@ -331,7 +323,7 @@ class SimpleWorkflowInterpreter{
}
}
}
- addToCompleteQueue(processContext);
+ addToCompleteQueue(workflowContext);
log.debug("removed task from processing queue : " + taskId);
try {
processReadyList();
@@ -342,67 +334,64 @@ class SimpleWorkflowInterpreter{
}
}
- void handleTaskStatusChangeEvent(TaskStatusChangeEvent taskStatusChangeEvent) {
- TaskState taskState = taskStatusChangeEvent.getState();
- TaskIdentifier taskIdentity = taskStatusChangeEvent.getTaskIdentity();
- String taskId = taskIdentity.getTaskId();
- ProcessContext processContext = processingQueue.get(taskId);
- if (processContext != null) {
+ void handleProcessStatusChangeEvent(ProcessStatusChangeEvent processStatusChangeEvent) {
+ ProcessState processState = processStatusChangeEvent.getState();
+ ProcessIdentifier processIdentity = processStatusChangeEvent.getProcessIdentity();
+ String processId = processIdentity.getProcessId();
+ WorkflowContext workflowContext = processingQueue.get(processId);
+ if (workflowContext != null) {
WorkflowNodeState wfNodeState = WorkflowNodeState.INVOKED;
- switch (taskState) {
- case WAITING:
- break;
+ switch (processState) {
+ case CREATED:
+ case VALIDATED:
case STARTED:
break;
+ case CONFIGURING_WORKSPACE:
+ wfNodeState = WorkflowNodeState.COMPLETED;
+ break;
case PRE_PROCESSING:
wfNodeState = WorkflowNodeState.INVOKED;
- processContext.getWorkflowNode().setState(NodeState.PRE_PROCESSING);
+ workflowContext.getWorkflowNode().setState(NodeState.PRE_PROCESSING);
break;
case INPUT_DATA_STAGING:
wfNodeState = WorkflowNodeState.INVOKED;
- processContext.getWorkflowNode().setState(NodeState.PRE_PROCESSING);
+ workflowContext.getWorkflowNode().setState(NodeState.PRE_PROCESSING);
break;
case EXECUTING:
wfNodeState = WorkflowNodeState.EXECUTING;
- processContext.getWorkflowNode().setState(NodeState.EXECUTING);
+ workflowContext.getWorkflowNode().setState(NodeState.EXECUTING);
break;
case OUTPUT_DATA_STAGING:
wfNodeState = WorkflowNodeState.COMPLETED;
- processContext.getWorkflowNode().setState(NodeState.POST_PROCESSING);
+ workflowContext.getWorkflowNode().setState(NodeState.POST_PROCESSING);
break;
case POST_PROCESSING:
wfNodeState = WorkflowNodeState.COMPLETED;
- processContext.getWorkflowNode().setState(NodeState.POST_PROCESSING);
+ workflowContext.getWorkflowNode().setState(NodeState.POST_PROCESSING);
break;
case COMPLETED:
wfNodeState = WorkflowNodeState.COMPLETED;
- processContext.getWorkflowNode().setState(NodeState.EXECUTED);
+ workflowContext.getWorkflowNode().setState(NodeState.EXECUTED);
break;
case FAILED:
wfNodeState = WorkflowNodeState.FAILED;
- processContext.getWorkflowNode().setState(NodeState.FAILED);
- break;
- case UNKNOWN:
- wfNodeState = WorkflowNodeState.UNKNOWN;
- break;
- case CONFIGURING_WORKSPACE:
- wfNodeState = WorkflowNodeState.COMPLETED;
+ workflowContext.getWorkflowNode().setState(NodeState.FAILED);
break;
case CANCELED:
- case CANCELING:
+ case CANCELLING:
wfNodeState = WorkflowNodeState.CANCELED;
- processContext.getWorkflowNode().setState(NodeState.FAILED);
+ workflowContext.getWorkflowNode().setState(NodeState.FAILED);
break;
default:
break;
}
if (wfNodeState != WorkflowNodeState.UNKNOWN) {
try {
- updateWorkflowNodeStatus(processContext.getWfNodeDetails(), wfNodeState);
+ updateWorkflowNodeStatus(workflowContext.getWfNodeDetails(), wfNodeState);
} catch (RegistryException e) {
log.error("Error while updating workflow node status update to the registry. nodeInstanceId :"
- + processContext.getWfNodeDetails().getNodeInstanceId() + " status to: "
- + processContext.getWfNodeDetails().getWorkflowNodeStatus().toString() , e);
+ + workflowContext.getWfNodeDetails().getNodeInstanceId() + " status to: "
+ + workflowContext.getWfNodeDetails().getWorkflowNodeStatus().toString() , e);
}
}
}
http://git-wip-us.apache.org/repos/asf/airavata/blob/b65079a7/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/WorkflowContext.java
----------------------------------------------------------------------
diff --git a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/WorkflowContext.java b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/WorkflowContext.java
new file mode 100644
index 0000000..47bd9ca
--- /dev/null
+++ b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/WorkflowContext.java
@@ -0,0 +1,60 @@
+/*
+ *
+ * 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.core;
+
+import org.apache.airavata.workflow.core.dag.nodes.WorkflowNode;
+
+public class WorkflowContext {
+ private WorkflowNode workflowNode;
+ private WorkflowNodeDetails wfNodeDetails;
+ private TaskDetails taskDetails;
+
+ public WorkflowContext(WorkflowNode workflowNode, WorkflowNodeDetails wfNodeDetails, TaskDetails taskDetails) {
+ this.workflowNode = workflowNode;
+ this.wfNodeDetails = wfNodeDetails;
+ this.taskDetails = taskDetails;
+ }
+
+ public WorkflowNode getWorkflowNode() {
+ return workflowNode;
+ }
+
+ public void setWorkflowNode(WorkflowNode workflowNode) {
+ this.workflowNode = workflowNode;
+ }
+
+ public WorkflowNodeDetails getWfNodeDetails() {
+ return wfNodeDetails;
+ }
+
+ public void setWfNodeDetails(WorkflowNodeDetails wfNodeDetails) {
+ this.wfNodeDetails = wfNodeDetails;
+ }
+
+ public TaskDetails getTaskDetails() {
+ return taskDetails;
+ }
+
+ public void setTaskDetails(TaskDetails taskDetails) {
+ this.taskDetails = taskDetails;
+ }
+}
http://git-wip-us.apache.org/repos/asf/airavata/blob/b65079a7/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/WorkflowEnactmentService.java
----------------------------------------------------------------------
diff --git a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/WorkflowEnactmentService.java b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/WorkflowEnactmentService.java
index 7795296..8ca0706 100644
--- a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/WorkflowEnactmentService.java
+++ b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/WorkflowEnactmentService.java
@@ -26,12 +26,9 @@ import org.apache.airavata.common.utils.ServerSettings;
import org.apache.airavata.messaging.core.MessageContext;
import org.apache.airavata.messaging.core.MessageHandler;
import org.apache.airavata.messaging.core.MessagingConstants;
-import org.apache.airavata.messaging.core.impl.RabbitMQProcessPublisher;
+import org.apache.airavata.messaging.core.impl.RabbitMQProcessLaunchPublisher;
import org.apache.airavata.messaging.core.impl.RabbitMQStatusConsumer;
-import org.apache.airavata.model.messaging.event.MessageType;
-import org.apache.airavata.model.messaging.event.TaskIdentifier;
-import org.apache.airavata.model.messaging.event.TaskOutputChangeEvent;
-import org.apache.airavata.model.messaging.event.TaskStatusChangeEvent;
+import org.apache.airavata.model.messaging.event.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -74,7 +71,7 @@ public class WorkflowEnactmentService {
public void submitWorkflow(String experimentId,
String credentialToken,
String gatewayName,
- RabbitMQProcessPublisher publisher) throws Exception {
+ RabbitMQProcessLaunchPublisher publisher) throws Exception {
SimpleWorkflowInterpreter simpleWorkflowInterpreter = new SimpleWorkflowInterpreter(
experimentId, credentialToken,gatewayName, publisher);
@@ -129,18 +126,17 @@ public class WorkflowEnactmentService {
private void process() {
String message;
SimpleWorkflowInterpreter simpleWorkflowInterpreter;
- if (msgCtx.getType() == MessageType.TASK) {
- TaskStatusChangeEvent event = (TaskStatusChangeEvent) msgCtx.getEvent();
- TaskIdentifier taskIdentifier = event.getTaskIdentity();
- simpleWorkflowInterpreter = getInterpreter(taskIdentifier.getExperimentId());
+ if (msgCtx.getType() == MessageType.PROCESS) {
+ ProcessStatusChangeEvent event = ((ProcessStatusChangeEvent) msgCtx.getEvent());
+ ProcessIdentifier processIdentity = event.getProcessIdentity();
+ simpleWorkflowInterpreter = getInterpreter(processIdentity.getExperimentId());
if (simpleWorkflowInterpreter != null) {
- simpleWorkflowInterpreter.handleTaskStatusChangeEvent(event);
+ simpleWorkflowInterpreter.handleProcessStatusChangeEvent(event);
} else {
// this happens when Task status messages comes after the Taskoutput messages,as we have worked on
// output changes it is ok to ignore this.
}
- message = "Received task output change event , expId : " + taskIdentifier.getExperimentId() + ", taskId : " + taskIdentifier.getTaskId() + ", workflow node Id : " + taskIdentifier.getWorkflowNodeId();
- log.debug(message);
+
}else if (msgCtx.getType() == MessageType.TASKOUTPUT) {
TaskOutputChangeEvent event = (TaskOutputChangeEvent) msgCtx.getEvent();
TaskIdentifier taskIdentifier = event.getTaskIdentity();
http://git-wip-us.apache.org/repos/asf/airavata/blob/b65079a7/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/parser/JsonWorkflowParser.java
----------------------------------------------------------------------
diff --git a/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/parser/JsonWorkflowParser.java b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/parser/JsonWorkflowParser.java
new file mode 100644
index 0000000..6c839e7
--- /dev/null
+++ b/modules/workflow/workflow-core/src/main/java/org/apache/airavata/workflow/core/parser/JsonWorkflowParser.java
@@ -0,0 +1,21 @@
+package org.apache.airavata.workflow.core.parser;
+
+import org.apache.airavata.workflow.core.WorkflowParser;
+import org.apache.airavata.workflow.core.dag.nodes.WorkflowInputNode;
+
+import java.util.List;
+
+/**
+ * Created by syodage on 1/27/16.
+ */
+public class JsonWorkflowParser implements WorkflowParser {
+
+ public JsonWorkflowParser(String workflowDescription) {
+
+ }
+
+ @Override
+ public List<WorkflowInputNode> parse() throws Exception {
+ return null;
+ }
+}