}
checkNS(taskMetadata);
String taskID = taskMetadata.getTaskId();
if (taskID == null) {
throw new InvalidInputFormatException("No task id specified");
}
String taskStateStr = taskMetadata.getTaskState();
String taskTypeStr = taskMetadata.getTaskType();
String description = taskMetadata.getDescription();
String processID = taskMetadata.getProcessId();
String instanceID = taskMetadata.getInstanceId();
AuthIdentifierSet userOwners = new AuthIdentifierSet(Arrays.asList(taskMetadata.getUserOwnerArray()));
AuthIdentifierSet roleOwners = new AuthIdentifierSet(Arrays.asList(taskMetadata.getRoleOwnerArray()));
Integer priority = null;
if (taskMetadata.xgetPriority() != null && taskMetadata.xgetPriority().validate()) {
priority = taskMetadata.getPriority();
}
String formURLStr = taskMetadata.getFormUrl();
URI formURL = null;
if (formURLStr != null) {
try {
formURL = new URI(formURLStr);
} catch (URISyntaxException e) {
throw new InvalidInputFormatException(e);
}
} else {
throw new InvalidInputFormatException("No URL found for form");
}
String failureCode = taskMetadata.getFailureCode();
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,
// nodescription , ect...
// The reason why is this is added is to
// handle the initial initialization on
// Designer
// In which designer generates by default an
// attachment element as a part of the
// initialization of the message
// even if no attachment is used
// TODO: When Designer and Server will
// support "lazy initialization", this line
// can be omitted
XmlCursor attCursor = attachmentElement.newCursor();
try {
if (attCursor.getTextValue().trim().length() != 0) {
com.intalio.bpms.workflow.taskManagementServices20051109.AttachmentMetadata attachmentMetadata = attachmentElement
.getAttachmentMetadata();
AttachmentMetadata metadata = new AttachmentMetadata();
String mimeType = attachmentMetadata.getMimeType();
if (mimeType != null) {
metadata.setMimeType(mimeType);
}
String fileName = attachmentMetadata.getFileName();
if (fileName != null)
metadata.setFileName(fileName);
String title = attachmentMetadata.getTitle();
if (title != null)
metadata.setTitle(title);
String description2 = attachmentMetadata.getDescription();
if (description2 != null)
metadata.setDescription(description2);
try {
Calendar cal = attachmentMetadata.getCreationDate();
if ((cal != null)) {
metadata.setCreationDate(new XsdDateTime(cal.toString()).getTime());
}
} catch (Exception e) {
_logger.warn("Error in unmarshalling creation date in attachment from metadata");
metadata.setCreationDate(new Date());
}
String payloadURLStr = attachmentElement.getPayloadUrl();
URL payloadURL;
try {
payloadURL = new URL(payloadURLStr);
} catch (MalformedURLException e) {
throw new InvalidInputFormatException(e);
}
Attachment attachment = new Attachment(metadata, payloadURL);
taskWithAttachments.addAttachment(attachment);
}
} finally {
attCursor.dispose();
}
}
}
}
}
if (IChainableTask.class.isAssignableFrom(taskClass)) {
IChainableTask chainableTask = (IChainableTask) resultTask;
if (isChainedBeforeStr != null) {
if ("1".equals(isChainedBeforeStr) || "true".equals(isChainedBeforeStr)) {
if (previousTaskID == null) {
throw new InvalidInputFormatException("tms:previousTaskId is required " + "if tms:isChainedBefore is true");
}
chainableTask.setPreviousTaskID(previousTaskID);
chainableTask.setChainedBefore(true);
} else {
if ((previousTaskID != null) && (!"".equals(previousTaskID))) {
throw new InvalidInputFormatException("tms:previousTaskId must be empty or not present " + "if tms:isChainedBefore is false");
}
}
} else {
if (previousTaskID != null) {
throw new InvalidInputFormatException("tms:isChainedBefore is required " + "if tms:previousTaskId is present");
}
}
}
// / the following is added to support task deadlines