/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.hise.dao;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinTable;
import javax.persistence.MapKey;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.xml.namespace.QName;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Holds task instance information. Provides task business operations.
*
* @author Kamil Eisenbart
* @author Witek Wołejszo
* @author Mateusz Lipczyński
* @author Warren Crossing
*/
@Entity
@Table(name = "TASK")
public class Task extends JpaBase {
private final Log log = LogFactory.getLog(Task.class);
@Column(nullable = false)
private String taskDefinitionKey;
// public static enum TaskTypes {
// ALL, TASKS, NOTIFICATIONS;
// }
/**
* Task statuses.
*/
public static enum Status {
/**
* Upon creation. Remains CREATED if there are no potential owners.
*/
CREATED,
/**
* Created task with multiple potential owners.
*/
READY,
/**
* Created task with single potential owner. Work started. Actual owner set.
*/
RESERVED,
/**
* Work started and task is being worked on now. Actual owner set.
*/
IN_PROGRESS,
/**
* In any of its active states (Ready, Reserved, InProgress), a task can be suspended,
* transitioning it into the Suspended state. On resumption of the task, it transitions
* back to the original state from which it had been suspended.
*/
SUSPENDED,
/**
* Successful completion of the work. One of the final states.
*/
COMPLETED,
/**
* Unsuccessful completion of the work. One of the final states.
*/
FAILED,
/**
* Unrecoverable error in human task processing. One of the final states.
*/
ERROR,
/**
* TODO javadoc, One of the final states.
*/
EXITED,
/**
* Task is no longer needed - skipped. This is considered a “good” outcome of a task. One of the final states.
*/
OBSOLETE;
public String value() {
return name();
}
public static Status fromValue(String v) {
return valueOf(v);
}
}
/**
* Task operations. Enumeration used to trigger comments.
*/
// public static enum Operations {
// CREATE, STATUS, NOMINATE, CLAIM, START, DELEGATE, RELEASE, COMPLETE, FAIL;
// }
/**
* Task's id. Autogenerated.
*/
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;
/**
* Task input message map. Maps message part to message. If
* document style Web HumanTaskServicesImpl are used to start Task, part name
* should be set to {@link Message.DEFAULT_PART_NAME_KEY}.
*/
@OneToMany(cascade = { CascadeType.ALL })
@MapKey(name = "partName")
@JoinTable(name = "TASK_MSG_INPUT")
private Map<String, Message> input = new HashMap<String, Message>();
/**
* Task output message map. Maps message part to message.
*/
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
@MapKey(name = "partName")
@JoinTable(name = "TASK_MSG_OUTPUT")
private Map<String, Message> output = new HashMap<String, Message>();
/**
* Task status.
*/
@Enumerated(EnumType.STRING)
// @Column(nullable = false)
// @Index(name = "task_status_idx")
private Status status;
/**
* Previous status of SUSPENDED Task. When Task is resumed this
* status is copied to the status field.
*/
@Enumerated(EnumType.STRING)
private Status statusBeforeSuspend;
/**
* Owner of a task.
*/
private String actualOwner;
/**
* This element is used to specify the priority of the task. It is an optional element which value is an integer expression. If not present, the priority of
* the task is unspecified. 0 is the highest priority, larger numbers identify lower priorities.
*/
private int priority;
/**
* Task initiator. Depending on how the task has been instantiated the task initiator may or may not be defined.
*/
private String createdBy;
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date createdOn;
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date activationTime;
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date expirationTime;
@OneToOne
private Job suspendUntil;
private boolean skippable;
private boolean escalated;
private boolean notification = false;
public boolean isNotification() {
return notification;
}
@OneToMany(mappedBy="task", cascade = {CascadeType.ALL})
private Set<TaskOrgEntity> peopleAssignments;
// @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
// @JoinTable(name = "TASK_EXCLUDED_OWNERS", joinColumns = @JoinColumn(name = "TASK"), inverseJoinColumns = @JoinColumn(name = "ASSIGNEE"))
// private Set<TaskOrgEntity> excludedOwners;
//
// @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
// @JoinTable(name = "TASK_STAKEHOLDERS", joinColumns = @JoinColumn(name = "TASK"), inverseJoinColumns = @JoinColumn(name = "ASSIGNEE"))
// private Set<TaskOrgEntity> taskStakeholders;
//
// @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
// @JoinTable(name = "TASK_BUSINESS_AMINISTRATORS", joinColumns = @JoinColumn(name = "TASK"), inverseJoinColumns = @JoinColumn(name = "ASSIGNEE"))
// private Set<TaskOrgEntity> businessAdministrators;
//
// @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
// @JoinTable(name = "TASK_NOTIFICATION_RECIPIENTS", joinColumns = @JoinColumn(name = "TASK"), inverseJoinColumns = @JoinColumn(name = "ASSIGNEE"))
// private Set<TaskOrgEntity> notificationRecipients;
@OneToMany(mappedBy = "task", cascade = { CascadeType.PERSIST, CascadeType.MERGE })
private List<Comment> comments = new ArrayList<Comment>();
@OneToMany(mappedBy = "task", cascade = { CascadeType.PERSIST, CascadeType.MERGE })
private List<Attachment> attachments = new ArrayList<Attachment>();
// @OneToMany(mappedBy = "task", cascade = { CascadeType.PERSIST, CascadeType.MERGE })
// private List<Deadline> deadlines = new ArrayList<Deadline>();
@OneToMany(cascade = {CascadeType.ALL})
@JoinTable(name="DEADLINE")
private Set<Job> deadlines = new HashSet<Job>();
/**
* Fault information. Set when task fail method is called.
*/
private Fault fault;
/**
* Task presentation parameters recalculated on input message change.
* Maps presentation parameter name to its value. Can be used as a where clause parameter
* in task query operations.
*/
@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE }, mappedBy = "task", fetch = FetchType.EAGER)
@MapKey(name = "name")
private Map<String, PresentationParameter> presentationParameters = new HashMap<String, PresentationParameter>();
// public List<Deadline> getDeadlines() {
// return deadlines;
// }
//
// public void setDeadlines(List<Deadline> deadlines) {
// this.deadlines = deadlines;
// }
public Set<Job> getDeadlines() {
return deadlines;
}
public void setDeadlines(Set<Job> deadlines) {
this.deadlines = deadlines;
}
public String getTaskDefinitionKey() {
return taskDefinitionKey;
}
public void setTaskDefinitionKey(String taskDefinitionKey) {
this.taskDefinitionKey = taskDefinitionKey;
}
public QName getTaskDefinitionName() {
return QName.valueOf(getTaskDefinitionKey());
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Map<String, Message> getInput() {
return input;
}
public void setInput(Map<String, Message> input) {
this.input = input;
}
public Map<String, Message> getOutput() {
return output;
}
public void setOutput(Map<String, Message> output) {
this.output = output;
}
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
public Status getStatusBeforeSuspend() {
return statusBeforeSuspend;
}
public void setStatusBeforeSuspend(Status statusBeforeSuspend) {
this.statusBeforeSuspend = statusBeforeSuspend;
}
public String getActualOwner() {
return actualOwner;
}
public void setActualOwner(String actualOwner) {
this.actualOwner = actualOwner;
}
public int getPriority() {
return priority;
}
public void setPriority(int priority) {
this.priority = priority;
}
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public Date getCreatedOn() {
return createdOn;
}
public void setCreatedOn(Date createdOn) {
this.createdOn = createdOn;
}
public Date getActivationTime() {
return activationTime;
}
public void setActivationTime(Date activationTime) {
this.activationTime = activationTime;
}
public Date getExpirationTime() {
return expirationTime;
}
public void setExpirationTime(Date expirationTime) {
this.expirationTime = expirationTime;
}
public boolean isSkippable() {
return skippable;
}
public void setSkippable(boolean skippable) {
this.skippable = skippable;
}
public boolean isEscalated() {
return escalated;
}
public void setEscalated(boolean escalated) {
this.escalated = escalated;
}
// public Set<TaskOrgEntity> getExcludedOwners() {
// return excludedOwners;
// }
//
// public void setExcludedOwners(Set<TaskOrgEntity> excludedOwners) {
// this.excludedOwners = excludedOwners;
// }
//
// public Set<TaskOrgEntity> getTaskStakeholders() {
// return taskStakeholders;
// }
//
// public void setTaskStakeholders(Set<TaskOrgEntity> taskStakeholders) {
// this.taskStakeholders = taskStakeholders;
// }
//
// public Set<TaskOrgEntity> getBusinessAdministrators() {
// return businessAdministrators;
// }
//
// public void setBusinessAdministrators(Set<TaskOrgEntity> businessAdministrators) {
// this.businessAdministrators = businessAdministrators;
// }
//
// public Set<TaskOrgEntity> getNotificationRecipients() {
// return notificationRecipients;
// }
//
// public void setNotificationRecipients(Set<TaskOrgEntity> notificationRecipients) {
// this.notificationRecipients = notificationRecipients;
// }
public Set<TaskOrgEntity> getPeopleAssignments() {
return peopleAssignments;
}
public void setPeopleAssignments(Set<TaskOrgEntity> peopleAssignments) {
this.peopleAssignments = peopleAssignments;
}
public List<Comment> getComments() {
return comments;
}
public void setComments(List<Comment> comments) {
this.comments = comments;
}
public List<Attachment> getAttachments() {
return attachments;
}
public void setAttachments(List<Attachment> attachments) {
this.attachments = attachments;
}
public Fault getFault() {
return fault;
}
public void setFault(Fault fault) {
this.fault = fault;
}
public Map<String, PresentationParameter> getPresentationParameters() {
return presentationParameters;
}
public void setPresentationParameters(Map<String, PresentationParameter> presentationParameters) {
this.presentationParameters = presentationParameters;
}
public void setNotification(boolean notification) {
this.notification = notification;
}
public Job getSuspendUntil() {
return suspendUntil;
}
public void setSuspendUntil(Job suspendUntil) {
this.suspendUntil = suspendUntil;
}
@Override
public Object[] getKeys() {
return new Object[] { id };
}
}