May 14, 2011

Πώς μπορούμε να αλλάξουμε προγραμματιστικά το payload ενός human task notification

Κάτι χρήσιμο, ιδιαίτερα αν κατασκευάζουμε ένα custom worklist για το Oracle SOA Suite, είναι η αλλαγή του payload ενός human task notification. Όταν δηλώνουμε το data μοντέλο ενός human task, φροντίζουμε να προσδιορίσουμε ως editable τις μεταβλητές που μας ενδιαφέρουν.

Μετά, με την χρήση του workflow API (http://download.oracle.com/docs/cd/E12839_01/apirefs.1111/e10660/toc.htm) μπορούμε να χειριστούμε το payload ως στιγμιότυπο της κλάσης org.w3c.Document.

//Get the task query service
ITaskQueryService querySvc = wfSvcClient.getTaskQueryService();
Task task = querySvc.getTaskDetailsById(ctx, taskId);
Element elPayload = task.getPayloadAsElement();
if (elPayload != null && elPayload.getOwnerDocument() != null) {
Document myDoc = elPayload.getOwnerDocument();
Node currentPayload = myDoc.getElementsByTagName("payload").item(0);
}
Για να αλλάξουμε μια μεταβλητή δεν έχουμε παρά να κάνουμε τον κατάλληλο χειρισμό της XML, πχ για ένα string attribute:

Node newParam = myDoc.getElementsByTagName("attributeName");
newParam.setTextContent("newValue");

H τελική αποθήκευση του payload απαιτεί την κλήση στη μέθοδο setPayloadAsElement() καθώς και την ενημέρωση της κατάστασης του human task (πχ "APPROVE", "REJECT")
task.setPayloadAsElement((Element)currentPayload);
ITaskService taskSvc = wfSvcClient.getTaskService();
taskSvc.updateTaskOutcome(ctx, task, action);

No comments: