String failureReason = taskMetadata.getFailureReason();
expectElementValue(taskMetadata, "userProcessEndpoint");
// TODO: these violate the WSDL! do something
expectElementValue(taskMetadata, "userProcessNamespaceURI");
String completeSOAPAction = taskMetadata.getUserProcessCompleteSOAPAction();
Attachments attachmentsElement = taskMetadata.getAttachments();
String isChainedBeforeStr = expectElementValue(taskMetadata, "isChainedBefore");
String previousTaskID = expectElementValue(taskMetadata, "previousTaskId");
Class<? extends Task> taskClass = TaskTypeMapper.getTypeClassByName(taskTypeStr);
Task resultTask = null;
TaskState taskState = null;
if (!ITaskWithState.class.isAssignableFrom(taskClass)) {
forbidParameter(taskStateStr, "task state");
forbidParameter(failureCode, "failure code");
forbidParameter(failureReason, "failure reason");
} else {
try {
taskState = (taskStateStr == null) ? TaskState.READY : TaskState.valueOf(taskStateStr.toUpperCase());
} catch (IllegalArgumentException e) {
_logger.error("Error in unmarshalling task from metadata", e);
throw new InvalidInputFormatException("Unknown task state: '" + taskStateStr + "'");
}
}
if (IProcessBoundTask.class.isAssignableFrom(taskClass)) {
if (taskMetadata.xgetProcessId() == null) {
/*
* The following line will be commented to support versions of
* designer that do not generate the processId
*/
// throw new
// InvalidInputFormatException("ProcessID not specified");
}
} else {
forbidParameter(processID, "processID");
}
if (IInstanceBoundTask.class.isAssignableFrom(taskClass)) {
if (taskMetadata.xgetInstanceId() == null) {
/*
* The following line will be commented to support versions of
* designer that do not generate the InstanceId
*/
// throw new
// InvalidInputFormatException("instanceID not specified");
}
} else {
forbidParameter(instanceID, "instanceID");
}
if (ICompleteReportingTask.class.isAssignableFrom(taskClass)) {
requireParameter(completeSOAPAction, "completion SOAPAction");
} else {
forbidParameter(completeSOAPAction, "completion SOAPAction");
}
if (!ITaskWithAttachments.class.isAssignableFrom(taskClass)) {
forbidParameter(attachmentsElement, "task attachment(s)");
}
if (!IChainableTask.class.isAssignableFrom(taskClass)) {
forbidParameter(isChainedBeforeStr, "is-chained-before flag");
forbidParameter(previousTaskID, "previous chained task ID");
}
resultTask = TaskTypeMapper.getNewInstance(taskClass, taskID, formURL);
resultTask.getUserOwners().addAll(userOwners);
resultTask.getRoleOwners().addAll(roleOwners);
resultTask.setDescription(description == null ? "" : description);
try {
Calendar creationDate = taskMetadata.getCreationDate();
if (creationDate != null)
resultTask.setCreationDate(creationDate.getTime());
else
resultTask.setCreationDate(new Date());
} catch (XmlValueOutOfRangeException e) {
resultTask.setCreationDate(new Date());
}
for (String action : actions) {
ACL acl = readACL(taskMetadata, action);
authorize(resultTask, action, acl);
}
if (ITaskWithState.class.isAssignableFrom(taskClass)) {
ITaskWithState taskWithState = (ITaskWithState) resultTask;
taskWithState.setState(taskState);
if (taskWithState.getState().equals(TaskState.FAILED)) {
requireParameter(failureCode, "failure code");
taskWithState.setFailureCode(failureCode);
taskWithState.setFailureReason(failureReason == null ? "" : failureReason);
} else {
forbidParameter(failureCode, "failure code");
forbidParameter(failureReason, "failure reason");
}
}
if (InitTask.class.isAssignableFrom(taskClass)) {
InitTask task = (InitTask) resultTask;
String uri1 = taskMetadata.getInitMessageNamespaceURI();
if (uri1 != null)
task.setInitMessageNamespaceURI(URI.create(uri1));
String soap = taskMetadata.getInitOperationSOAPAction();
if (soap != null)
task.setInitOperationSOAPAction(soap);
String uri2 = taskMetadata.getProcessEndpoint();
if (uri2 != null)
task.setProcessEndpoint(URI.create(uri2));
}
if (IProcessBoundTask.class.isAssignableFrom(taskClass)) {
if (taskMetadata.xgetProcessId() != null && processID != null)
((IProcessBoundTask) resultTask).setProcessID(processID);
}
if (IInstanceBoundTask.class.isAssignableFrom(taskClass)) {
if (taskMetadata.xgetInstanceId() != null && taskMetadata.getInstanceId() != null) {
((IInstanceBoundTask) resultTask).setInstanceId(instanceID);
}
}
if (ICompleteReportingTask.class.isAssignableFrom(taskClass)) {
((ICompleteReportingTask) resultTask).setCompleteSOAPAction(completeSOAPAction);
}
if (ITaskWithAttachments.class.isAssignableFrom(taskClass)) {
ITaskWithAttachments taskWithAttachments = (ITaskWithAttachments) resultTask;
if (attachmentsElement != null) {
for (int i = 0; i < attachmentsElement.sizeOfAttachmentArray(); i++) {
com.intalio.bpms.workflow.taskManagementServices20051109.Attachment attachmentElement = attachmentsElement.getAttachmentArray(i);
if (attachmentElement != null) {
// The following line has been added to handle the case
// where an attachment element is present
// but do not contain any data: no title,