use of edu.harvard.iq.dataverse.workflow.step.Pending in project dataverse by IQSS.
the class WorkflowServiceBean method executeSteps.
/**
* Execute the passed workflow, starting from {@code initialStepIdx}.
* @param wf The workflow to run.
* @param ctxt Execution context to run the workflow in.
* @param initialStepIdx 0-based index of the first step to run.
*/
private void executeSteps(Workflow wf, WorkflowContext ctxt, int initialStepIdx) {
final List<WorkflowStepData> steps = wf.getSteps();
for (int stepIdx = initialStepIdx; stepIdx < steps.size(); stepIdx++) {
WorkflowStepData wsd = steps.get(stepIdx);
WorkflowStep step = createStep(wsd);
WorkflowStepResult res = runStep(step, ctxt);
try {
if (res == WorkflowStepResult.OK) {
logger.log(Level.INFO, "Workflow {0} step {1}: OK", new Object[] { ctxt.getInvocationId(), stepIdx });
} else if (res instanceof Failure) {
logger.log(Level.WARNING, "Workflow {0} failed: {1}", new Object[] { ctxt.getInvocationId(), ((Failure) res).getReason() });
rollback(wf, ctxt, (Failure) res, stepIdx - 1);
return;
} else if (res instanceof Pending) {
pauseAndAwait(wf, ctxt, (Pending) res, stepIdx);
return;
}
} catch (Exception e) {
logger.log(Level.WARNING, "Workflow {0} step {1}: Uncought exception:", new Object[] { ctxt.getInvocationId(), e.getMessage() });
logger.log(Level.WARNING, "Trace:", e);
rollback(wf, ctxt, (Failure) res, stepIdx - 1);
return;
}
}
workflowCompleted(wf, ctxt);
}
use of edu.harvard.iq.dataverse.workflow.step.Pending in project dataverse by IQSS.
the class WorkflowServiceBean method doResume.
private void doResume(PendingWorkflowInvocation pending, String body) {
Workflow wf = pending.getWorkflow();
List<WorkflowStepData> stepsLeft = wf.getSteps().subList(pending.getPendingStepIdx(), wf.getSteps().size());
WorkflowStep pendingStep = createStep(stepsLeft.get(0));
final WorkflowContext ctxt = pending.reCreateContext(roleAssignees);
WorkflowStepResult res = pendingStep.resume(ctxt, pending.getLocalData(), body);
if (res instanceof Failure) {
rollback(wf, ctxt, (Failure) res, pending.getPendingStepIdx() - 1);
} else if (res instanceof Pending) {
pauseAndAwait(wf, ctxt, (Pending) res, pending.getPendingStepIdx());
} else {
executeSteps(wf, ctxt, pending.getPendingStepIdx() + 1);
}
}
use of edu.harvard.iq.dataverse.workflow.step.Pending in project dataverse by IQSS.
the class HttpSendReceiveClientStep method run.
@Override
public WorkflowStepResult run(WorkflowContext context) {
HttpClient client = new HttpClient();
try {
// build method
HttpMethodBase mtd = buildMethod(false, context);
// execute
int responseStatus = client.executeMethod(mtd);
if (responseStatus >= 200 && responseStatus < 300) {
// HTTP OK range
return new Pending();
} else {
String responseBody = mtd.getResponseBodyAsString();
return new Failure("Error communicating with server. Server response: " + responseBody + " (" + responseStatus + ").");
}
} catch (Exception ex) {
logger.log(Level.SEVERE, "Error communicating with remote server: " + ex.getMessage(), ex);
return new Failure("Error executing request: " + ex.getLocalizedMessage(), "Cannot communicate with remote server.");
}
}
use of edu.harvard.iq.dataverse.workflow.step.Pending in project dataverse by IQSS.
the class PauseStep method run.
@Override
public WorkflowStepResult run(WorkflowContext context) {
final Pending result = new Pending();
result.getData().putAll(params);
return result;
}
Aggregations