@namespace("org.apache.oodt.cas.workflow.struct.avrotypes")
protocol WorkflowManager {
import schema "AvroWorkflowCondition.avsc";
import schema "AvroWorkflowTask.avsc";
import schema "AvroWorkflow.avsc";
import schema "AvroWorkflowInstance.avsc";
import schema "AvroWorkflowInstancePage.avsc";

    boolean refreshRepository();

    string executeDynamicWorkflow(array<string> taskIds, map<union {string, array<string>}> metadata);

    array<string> getRegisteredEvents();

    AvroWorkflowInstancePage getFirstPage();

    AvroWorkflowInstancePage getNextPage(AvroWorkflowInstancePage currentPage);

    AvroWorkflowInstancePage getPrevPage(AvroWorkflowInstancePage currentPage);

    AvroWorkflowInstancePage getLastPage();

    AvroWorkflowInstancePage paginateWorkflowInstancesOfStatus(int pageNum, string status);

    AvroWorkflowInstancePage paginateWorkflowInstances(int pageNum);

    array<AvroWorkflow> getWorkflowsByEvent(string eventName);

    map<union {string, array<string>}> getWorkflowInstanceMetadata(string wInstId);

    boolean handleEvent(string eventName, map<union {string, array<string>}> metadata);

    AvroWorkflowInstance getWorkflowInstanceById(string wInstId);

    boolean stopWorkflowInstance(string workflowInstId);

    boolean pauseWorkflowInstance(string workflowInstId);

    boolean resumeWorkflowInstance(string workflowInstId);

    double getWorkflowWallClockMinutes(string workflowInstId);

    double getWorkflowCurrentTaskWallClockMinutes(string workflowInstId);

    int getNumWorkflowInstancesByStatus(string status);

    int getNumWorkflowInstances();

    array<AvroWorkflowInstance> getWorkflowInstancesByStatus(string status);

    array<AvroWorkflowInstance> getWorkflowInstances();

    array<AvroWorkflow> getWorkflows();

    AvroWorkflowTask getTaskById(string taskId);

    AvroWorkflowCondition getConditionById(string conditionId);

    AvroWorkflow getWorkflowById(string workflowId);

    boolean updateMetadataForWorkflow(
            string workflowInstId, map<union {string, array<string>}> metadata);

    boolean updateWorkflowInstance(AvroWorkflowInstance instance);

    boolean setWorkflowInstanceCurrentTaskStartDateTime(
            string wInstId, string startDateTimeIsoStr);

    boolean setWorkflowInstanceCurrentTaskEndDateTime(
            string wInstId, string endDateTimeIsoStr);

    boolean updateWorkflowInstanceStatus(
            string workflowInstId, string status);

}