use of edu.harvard.iq.dataverse.workflow.step.WorkflowStepData 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.WorkflowStepData in project dataverse by IQSS.
the class WorkflowServiceBean method rollback.
@Asynchronous
private void rollback(Workflow wf, WorkflowContext ctxt, Failure failure, int lastCompletedStepIdx) {
ctxt = refresh(ctxt);
final List<WorkflowStepData> steps = wf.getSteps();
for (int stepIdx = lastCompletedStepIdx; stepIdx >= 0; --stepIdx) {
WorkflowStepData wsd = steps.get(stepIdx);
WorkflowStep step = createStep(wsd);
try {
logger.log(Level.INFO, "Workflow {0} step {1}: Rollback", new Object[] { ctxt.getInvocationId(), stepIdx });
rollbackStep(step, ctxt, failure);
} catch (Exception e) {
logger.log(Level.WARNING, "Workflow " + ctxt.getInvocationId() + " step " + stepIdx + ": Rollback error: " + e.getMessage(), e);
}
}
logger.log(Level.INFO, "Removing workflow lock");
try {
engine.submit(new RemoveLockCommand(ctxt.getRequest(), ctxt.getDataset(), DatasetLock.Reason.Workflow));
// Corner case - delete locks generated within this same transaction.
Query deleteQuery = em.createQuery("DELETE from DatasetLock l WHERE l.dataset.id=:id AND l.reason=:reason");
deleteQuery.setParameter("id", ctxt.getDataset().getId());
deleteQuery.setParameter("reason", DatasetLock.Reason.Workflow);
deleteQuery.executeUpdate();
} catch (CommandException ex) {
logger.log(Level.SEVERE, "Error restoring dataset locks state after rollback: " + ex.getMessage(), ex);
}
}
use of edu.harvard.iq.dataverse.workflow.step.WorkflowStepData in project dataverse by IQSS.
the class JsonParser method parseStepData.
public WorkflowStepData parseStepData(JsonObject json) throws JsonParseException {
WorkflowStepData wsd = new WorkflowStepData();
validate("step", json, "provider", ValueType.STRING);
validate("step", json, "stepType", ValueType.STRING);
wsd.setProviderId(json.getString("provider"));
wsd.setStepType(json.getString("stepType"));
if (json.containsKey("parameters")) {
JsonObject params = json.getJsonObject("parameters");
Map<String, String> paramMap = new HashMap<>();
params.keySet().forEach(k -> paramMap.put(k, jsonValueToString(params.get(k))));
wsd.setStepParameters(paramMap);
}
return wsd;
}
use of edu.harvard.iq.dataverse.workflow.step.WorkflowStepData in project dataverse by IQSS.
the class JsonParser method parseWorkflow.
public Workflow parseWorkflow(JsonObject json) throws JsonParseException {
Workflow retVal = new Workflow();
validate("", json, "name", ValueType.STRING);
validate("", json, "steps", ValueType.ARRAY);
retVal.setName(json.getString("name"));
JsonArray stepArray = json.getJsonArray("steps");
List<WorkflowStepData> steps = new ArrayList<>(stepArray.size());
for (JsonValue jv : stepArray) {
steps.add(parseStepData((JsonObject) jv));
}
retVal.setSteps(steps);
return retVal;
}
use of edu.harvard.iq.dataverse.workflow.step.WorkflowStepData in project dataverse by IQSS.
the class JsonPrinter method json.
public static JsonObjectBuilder json(Workflow wf) {
JsonObjectBuilder bld = jsonObjectBuilder();
bld.add("name", wf.getName());
if (wf.getId() != null) {
bld.add("id", wf.getId());
}
if (wf.getSteps() != null && !wf.getSteps().isEmpty()) {
JsonArrayBuilder arr = Json.createArrayBuilder();
for (WorkflowStepData stp : wf.getSteps()) {
arr.add(jsonObjectBuilder().add("stepType", stp.getStepType()).add("provider", stp.getProviderId()).add("parameters", mapToObject(stp.getStepParameters())));
}
bld.add("steps", arr);
}
return bld;
}
Aggregations