/*******************************************************************************
* Copyright (c) 2004, 2009 Tasktop Technologies and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.tasks.core.data;
import java.util.Date;
import java.util.List;
import org.eclipse.core.runtime.Assert;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
import org.eclipse.mylyn.tasks.core.ITaskMapping;
import org.eclipse.mylyn.tasks.core.data.AbstractTaskSchema.Field;
/**
* @author Steffen Pingel
* @since 3.0
*/
public class TaskMapper implements ITaskMapping {
private final boolean createNonExistingAttributes;
private final TaskData taskData;
public TaskMapper(TaskData taskData) {
this(taskData, false);
}
public TaskMapper(TaskData taskData, boolean createNonExistingAttributes) {
this.createNonExistingAttributes = createNonExistingAttributes;
Assert.isNotNull(taskData);
this.taskData = taskData;
}
public boolean applyTo(ITask task) {
boolean changed = false;
if (hasChanges(task.getCompletionDate(), getCompletionDate(), TaskAttribute.DATE_COMPLETION)) {
task.setCompletionDate(getCompletionDate());
changed = true;
}
if (hasChanges(task.getCreationDate(), getCreationDate(), TaskAttribute.DATE_CREATION)) {
task.setCreationDate(getCreationDate());
changed = true;
}
if (hasChanges(task.getModificationDate(), getModificationDate(), TaskAttribute.DATE_MODIFICATION)) {
task.setModificationDate(getModificationDate());
changed = true;
}
if (hasChanges(task.getDueDate(), getDueDate(), TaskAttribute.DATE_DUE)) {
task.setDueDate(getDueDate());
changed = true;
}
if (hasChanges(task.getOwner(), getOwner(), TaskAttribute.USER_ASSIGNED)) {
task.setOwner(getOwner());
changed = true;
}
if (hasChanges(task.getPriority(), getPriorityLevelString(), TaskAttribute.PRIORITY)) {
task.setPriority(getPriorityLevelString());
changed = true;
}
if (hasChanges(task.getSummary(), getSummary(), TaskAttribute.SUMMARY)) {
task.setSummary(getSummary());
changed = true;
}
if (hasChanges(task.getTaskKey(), getTaskKey(), TaskAttribute.TASK_KEY)) {
task.setTaskKey(getTaskKey());
changed = true;
}
if (hasChanges(task.getTaskKind(), getTaskKind(), TaskAttribute.TASK_KIND)) {
task.setTaskKind(getTaskKind());
changed = true;
}
if (hasChanges(task.getUrl(), getTaskUrl(), TaskAttribute.TASK_URL)) {
task.setUrl(getTaskUrl());
changed = true;
}
return changed;
}
private String getPriorityLevelString() {
PriorityLevel priorityLevel = getPriorityLevel();
return (priorityLevel != null) ? priorityLevel.toString() : PriorityLevel.getDefault().toString();
}
private boolean hasChanges(Object existingValue, Object newValue, String attributeId) {
TaskAttribute attribute = taskData.getRoot().getMappedAttribute(attributeId);
if (attribute != null) {
return areNotEquals(existingValue, newValue);
}
return false;
}
private boolean areNotEquals(Object existingProperty, Object newProperty) {
return (existingProperty != null) ? !existingProperty.equals(newProperty) : newProperty != null;
}
private void copyAttributeValue(TaskAttribute sourceAttribute, TaskAttribute targetAttribute) {
if (targetAttribute == null) {
return;
}
if (!targetAttribute.getMetaData().isReadOnly()) {
targetAttribute.clearValues();
if (targetAttribute.getOptions().size() > 0) {
List<String> values = sourceAttribute.getValues();
for (String value : values) {
if (targetAttribute.getOptions().containsKey(value)) {
targetAttribute.addValue(value);
}
}
} else {
List<String> values = sourceAttribute.getValues();
for (String value : values) {
targetAttribute.addValue(value);
}
}
}
}
/**
* TODO update comment Sets attribute values from <code>sourceTaskData</code> on <code>targetTaskData</code>. Sets
* the following attributes:
* <ul>
* <li>summary
* <li>description
* </ul>
* Other attribute values are only set if they exist on <code>sourceTaskData</code> and <code>targetTaskData</code>.
*
* @param sourceTaskData
* the source task data values are copied from, the connector kind of repository of
* <code>sourceTaskData</code> can be different from <code>targetTaskData</code>
* @param targetTaskData
* the target task data values are copied to, the connector kind matches the one of this task data
* handler
* @since 2.2
*/
public void merge(ITaskMapping source) {
if (source.getTaskData() != null && this.getTaskData() != null
&& source.getTaskData().getConnectorKind().equals(this.getTaskData().getConnectorKind())) {
// task data objects are from the same connector, copy all attributes
for (TaskAttribute sourceAttribute : source.getTaskData().getRoot().getAttributes().values()) {
copyAttributeValue(sourceAttribute, this.getTaskData().getRoot().getAttribute(sourceAttribute.getId()));
}
} else {
if (source.getCc() != null) {
setCc(source.getCc());
}
if (source.getDescription() != null) {
setDescription(source.getDescription());
}
if (source.getComponent() != null) {
setComponent(source.getComponent());
}
if (source.getKeywords() != null) {
setKeywords(source.getKeywords());
}
if (source.getOwner() != null) {
setOwner(source.getOwner());
}
if (source.getPriorityLevel() != null) {
setPriorityLevel(source.getPriorityLevel());
}
if (source.getProduct() != null) {
setProduct(source.getProduct());
}
if (source.getSeverity() != null) {
setSeverity(source.getSeverity());
}
if (source.getSummary() != null) {
setSummary(source.getSummary());
}
if (source.getVersion() != null) {
setVersion(source.getVersion());
}
}
}
private TaskAttribute createAttribute(String attributeKey, String type) {
TaskAttribute attribute;
Field field = DefaultTaskSchema.getField(attributeKey);
if (field != null) {
attribute = field.createAttribute(taskData.getRoot());
} else {
attribute = taskData.getRoot().createMappedAttribute(attributeKey);
attribute.getMetaData().defaults().setType(type);
}
return attribute;
}
public List<String> getCc() {
return getValues(TaskAttribute.USER_CC);
}
public Date getCompletionDate() {
return getDateValue(TaskAttribute.DATE_COMPLETION);
}
public String getComponent() {
return getValue(TaskAttribute.COMPONENT);
}
public Date getCreationDate() {
return getDateValue(TaskAttribute.DATE_CREATION);
}
private Date getDateValue(String attributeKey) {
TaskAttribute attribute = taskData.getRoot().getMappedAttribute(attributeKey);
if (attribute != null) {
return taskData.getAttributeMapper().getDateValue(attribute);
}
return null;
}
public String getDescription() {
return getValue(TaskAttribute.DESCRIPTION);
}
public Date getDueDate() {
return getDateValue(TaskAttribute.DATE_DUE);
}
public List<String> getKeywords() {
return getValues(TaskAttribute.KEYWORDS);
}
private TaskAttribute getWriteableAttribute(String attributeKey, String type) {
TaskAttribute attribute = taskData.getRoot().getMappedAttribute(attributeKey);
if (createNonExistingAttributes) {
if (attribute == null) {
attribute = createAttribute(attributeKey, type);
}
} else if (attribute != null && attribute.getMetaData().isReadOnly()) {
return null;
}
return attribute;
}
public Date getModificationDate() {
return getDateValue(TaskAttribute.DATE_MODIFICATION);
}
public String getOwner() {
return getValue(TaskAttribute.USER_ASSIGNED);
}
public String getPriority() {
return getValue(TaskAttribute.PRIORITY);
}
public PriorityLevel getPriorityLevel() {
String value = getPriority();
return (value != null) ? PriorityLevel.fromString(value) : null;
}
public String getProduct() {
return getValue(TaskAttribute.PRODUCT);
}
public String getReporter() {
return getValue(TaskAttribute.USER_REPORTER);
}
public String getResolution() {
return getValue(TaskAttribute.RESOLUTION);
}
/**
* @since 3.2
*/
public String getSeverity() {
return getValue(TaskAttribute.SEVERITY);
}
public String getSummary() {
return getValue(TaskAttribute.SUMMARY);
}
public String getStatus() {
return getValue(TaskAttribute.STATUS);
}
public TaskData getTaskData() {
return taskData;
}
public String getTaskKey() {
return getValue(TaskAttribute.TASK_KEY);
}
public String getTaskKind() {
return getValue(TaskAttribute.TASK_KIND);
}
public String getTaskStatus() {
return getValue(TaskAttribute.STATUS);
}
public String getTaskUrl() {
return getValue(TaskAttribute.TASK_URL);
}
public String getValue(String attributeKey) {
TaskAttribute attribute = taskData.getRoot().getMappedAttribute(attributeKey);
if (attribute != null) {
return taskData.getAttributeMapper().getValueLabel(attribute);
}
return null;
}
private List<String> getValues(String attributeKey) {
TaskAttribute attribute = taskData.getRoot().getMappedAttribute(attributeKey);
if (attribute != null) {
return taskData.getAttributeMapper().getValueLabels(attribute);
}
return null;
}
/**
* @since 3.2
*/
public String getVersion() {
return getValue(TaskAttribute.VERSION);
}
public boolean hasChanges(ITask task) {
boolean changed = false;
changed |= hasChanges(task.getCompletionDate(), getCompletionDate(), TaskAttribute.DATE_COMPLETION);
changed |= hasChanges(task.getCreationDate(), getCreationDate(), TaskAttribute.DATE_CREATION);
changed |= hasChanges(task.getModificationDate(), getModificationDate(), TaskAttribute.DATE_MODIFICATION);
changed |= hasChanges(task.getDueDate(), getDueDate(), TaskAttribute.DATE_DUE);
changed |= hasChanges(task.getOwner(), getOwner(), TaskAttribute.USER_ASSIGNED);
changed |= hasChanges(task.getPriority(), getPriorityLevelString(), TaskAttribute.PRIORITY);
changed |= hasChanges(task.getSummary(), getSummary(), TaskAttribute.SUMMARY);
changed |= hasChanges(task.getTaskKey(), getTaskKey(), TaskAttribute.TASK_KEY);
changed |= hasChanges(task.getTaskKind(), getTaskKind(), TaskAttribute.TASK_KIND);
changed |= hasChanges(task.getUrl(), getTaskUrl(), TaskAttribute.TASK_URL);
return changed;
}
// private boolean hasChanges(Object value, String attributeKey) {
// TaskAttribute attribute = taskData.getRoot().getMappedAttribute(attributeKey);
// if (attribute != null) {
// if (TaskAttribute.TYPE_BOOLEAN.equals(attribute.getMetaData().getType())) {
// return areNotEquals(value, taskData.getAttributeMapper().getBooleanValue(attribute));
// } else if (TaskAttribute.TYPE_DATE.equals(attribute.getMetaData().getType())) {
// return areNotEquals(value, taskData.getAttributeMapper().getDateValue(attribute));
// } else if (TaskAttribute.TYPE_INTEGER.equals(attribute.getMetaData().getType())) {
// return areNotEquals(value, taskData.getAttributeMapper().getIntegerValue(attribute));
// } else {
// return areNotEquals(value, taskData.getAttributeMapper().getValue(attribute));
// }
// }
// return false;
// }
public void setCc(List<String> cc) {
setValues(TaskAttribute.USER_CC, cc);
}
public void setCompletionDate(Date dateCompleted) {
setDateValue(TaskAttribute.DATE_COMPLETION, dateCompleted);
}
public void setComponent(String component) {
setValue(TaskAttribute.COMPONENT, component);
}
public void setCreationDate(Date dateCreated) {
setDateValue(TaskAttribute.DATE_CREATION, dateCreated);
}
private TaskAttribute setDateValue(String attributeKey, Date value) {
TaskAttribute attribute = getWriteableAttribute(attributeKey, TaskAttribute.TYPE_DATE);
if (attribute != null) {
taskData.getAttributeMapper().setDateValue(attribute, value);
}
return attribute;
}
public void setDescription(String description) {
setValue(TaskAttribute.DESCRIPTION, description);
}
public void setDueDate(Date value) {
setDateValue(TaskAttribute.DATE_DUE, value);
}
public void setKeywords(List<String> keywords) {
setValues(TaskAttribute.KEYWORDS, keywords);
}
public void setModificationDate(Date dateModified) {
setDateValue(TaskAttribute.DATE_MODIFICATION, dateModified);
}
// TODO use Person class?
public void setOwner(String owner) {
setValue(TaskAttribute.USER_ASSIGNED, owner);
}
public void setPriority(String priority) {
setValue(TaskAttribute.PRIORITY, priority);
}
public void setPriorityLevel(PriorityLevel priority) {
setPriority(priority.toString());
}
public void setProduct(String product) {
setValue(TaskAttribute.PRODUCT, product);
}
// TODO use Person class?
public void setReporter(String reporter) {
setValue(TaskAttribute.USER_REPORTER, reporter);
}
/**
* @since 3.2
*/
public void setSeverity(String severity) {
setValue(TaskAttribute.SEVERITY, severity);
}
public void setSummary(String summary) {
setValue(TaskAttribute.SUMMARY, summary);
}
public void setStatus(String status) {
setValue(TaskAttribute.STATUS, status);
}
public void setTaskKind(String taskKind) {
setValue(TaskAttribute.TASK_KIND, taskKind);
}
/**
* @since 3.3
*/
public void setTaskKey(String taskKey) {
setValue(TaskAttribute.TASK_KEY, taskKey);
}
public void setTaskUrl(String taskUrl) {
setValue(TaskAttribute.TASK_URL, taskUrl);
}
/**
* @since 3.2
*/
public void setVersion(String version) {
setValue(TaskAttribute.VERSION, version);
}
public TaskAttribute setValue(String attributeKey, String value) {
TaskAttribute attribute = getWriteableAttribute(attributeKey, TaskAttribute.TYPE_SHORT_TEXT);
if (attribute != null) {
taskData.getAttributeMapper().setValue(attribute, value);
}
return attribute;
}
private TaskAttribute setValues(String attributeKey, List<String> values) {
TaskAttribute attribute = getWriteableAttribute(attributeKey, TaskAttribute.TYPE_SHORT_TEXT);
if (attribute != null) {
taskData.getAttributeMapper().setValues(attribute, values);
}
return attribute;
}
}