/*
* Copyright (c) 2012 Data Harmonisation Panel
*
* All rights reserved. This program and the accompanying materials are made
* available under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution. If not, see <http://www.gnu.org/licenses/>.
*
* Contributors:
* HUMBOLDT EU Integrated Project #030962
* Data Harmonisation Panel <http://www.dhpanel.eu>
*/
package eu.esdihumboldt.hale.ui.views.tasks.model;
import java.util.List;
import eu.esdihumboldt.hale.schemaprovider.model.Definition;
import eu.esdihumboldt.hale.ui.views.tasks.model.TaskType.SeverityLevel;
import eu.esdihumboldt.hale.ui.views.tasks.model.TaskUserData.TaskStatus;
import eu.esdihumboldt.hale.ui.views.tasks.service.TaskService;
/**
* Task decorator that provides convenience methods for accessing the task
* type information
*
* @author Simon Templer
* @partner 01 / Fraunhofer Institute for Computer Graphics Research
* @version $Id$
*/
public class ResolvedTask implements Task {
private final Task task;
private final TaskType type;
private final TaskUserData userData;
/**
* Create a resolved task
*
* @param task the task
* @param type the task's type
* @param userData the task user data, may be <code>null</code>
*/
public ResolvedTask(Task task, TaskType type, TaskUserData userData) {
super();
this.task = task;
this.type = type;
this.userData = userData;
}
/**
* Resolve a task
*
* @param registry the task type registry
* @param task the task to be resolved
* @param userData the task user data, may be <code>null</code>
*
* @return the resolved task or <code>null</code> if the task type could not
* be resolved
*/
public static ResolvedTask resolveTask(TaskRegistry registry, Task task,
TaskUserData userData) {
TaskType type = registry.getType(task.getTypeName());
if (type != null) {
return new ResolvedTask(task, type, userData);
}
else {
return null;
}
}
/**
* @see Task#dispose()
*/
@Override
public void dispose() {
task.dispose();
}
/**
* @see Task#getContext()
*/
@Override
public List<? extends Definition> getContext() {
return task.getContext();
}
/**
* @see Task#getMainContext()
*/
@Override
public Definition getMainContext() {
return task.getMainContext();
}
/**
* Get the task status
*
* @return the task status
*/
public TaskStatus getTaskStatus() {
if (userData == null) {
return TaskStatus.NEW;
}
else {
return userData.getTaskStatus();
}
}
/**
* Get the user comment
*
* @return the user comment or <code>null</code>
*/
public String getUserComment() {
if (userData == null) {
return null;
}
else {
return userData.getUserComment();
}
}
/**
* @see Task#getTypeName()
*/
@Override
public String getTypeName() {
return task.getTypeName();
}
/**
* Get the value of the task
*
* @return the task value
*/
public double getValue() {
return type.getValue(task);
}
/**
* The task factory that provides tasks of this type
*
* @return the task factory
*/
public TaskFactory getTaskFactory() {
return type.getTaskFactory();
}
/**
* Get the severity level
*
* @see TaskType#getSeverityLevel(Task)
*
* @return the severity level of the task
*/
public SeverityLevel getSeverityLevel() {
return type.getSeverityLevel(task);
}
/**
* Get the creation reason
*
* @see TaskType#getReason(Task)
*
* @return the task's creation reason
*/
public String getReason() {
return type.getReason(task);
}
/**
* Get the task title
*
* @see TaskType#getTitle(Task)
*
* @return the task title
*/
public String getTitle() {
return type.getTitle(task);
}
/**
* Get the task type
*
* @return the task type
*/
public TaskType getType() {
return type;
}
/**
* @see Task#setTaskService(TaskService)
*/
@Override
public void setTaskService(TaskService taskService) {
task.setTaskService(taskService);
}
/**
* @see Comparable#compareTo(Object)
*/
@Override
public int compareTo(Task other) {
if (other instanceof ResolvedTask) {
int result = getSeverityLevel().compareTo(((ResolvedTask) other).getSeverityLevel());
if (result == 0) {
if (getValue() > ((ResolvedTask) other).getValue()) {
return -1;
}
else if (getValue() < ((ResolvedTask) other).getValue()) {
return 1;
}
}
else {
return result;
}
}
return task.compareTo(other);
}
/**
* @return the task
*/
public Task getTask() {
return task;
}
/**
* @return the userData
*/
public TaskUserData getUserData() {
return userData;
}
/**
* Determines if this is an open task
*
* @return if this is an open task
*/
public boolean isOpen() {
TaskStatus status = getTaskStatus();
switch (status) {
case COMPLETED: // fall through
case IGNORED:
return false;
case ACTIVE: // fall through
case NEW: // fall through
default:
return true;
}
}
/**
* @see Object#hashCode()
*/
@Override
public int hashCode() {
return task.hashCode();
}
/**
* @see Object#equals(Object)
*/
@Override
public final boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Task))
return false;
Task other = (Task) obj;
if (!task.equals(other))
return false;
return true;
}
}