blob: 0617e20561a81ba827ad2ecf7b17cbe9e964f39f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2016 Tasktop Technologies and others.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* https://www.eclipse.org/legal/epl-2.0
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.tasks.core.data;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;
import org.eclipse.core.runtime.Assert;
import org.eclipse.mylyn.internal.tasks.core.RepositoryModel;
import org.eclipse.mylyn.tasks.core.ITaskComment;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.core.data.ITaskAttributeDiff;
import org.eclipse.mylyn.tasks.core.data.ITaskDataDiff;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskData;
/**
* @author Steffen Pingel
*/
public class TaskDataDiff implements ITaskDataDiff {
private final String[] ATTRIBUTES_IDS = new String[] { TaskAttribute.SUMMARY, TaskAttribute.DESCRIPTION,
TaskAttribute.PRODUCT, TaskAttribute.PRIORITY, TaskAttribute.USER_ASSIGNED, TaskAttribute.STATUS, };
private final TaskData newTaskData;
private final TaskData oldTaskData;
private final Set<ITaskComment> newComments = new LinkedHashSet<ITaskComment>();
private final Set<TaskAttribute> newAttachments = new LinkedHashSet<TaskAttribute>();
private final Set<ITaskAttributeDiff> changedAttributes = new LinkedHashSet<ITaskAttributeDiff>();
private final RepositoryModel repositoryModel;
private final TaskRepository repository;
public TaskDataDiff(RepositoryModel repositoryModel, TaskData newTaskData, TaskData oldTaskData) {
Assert.isNotNull(repositoryModel);
Assert.isNotNull(newTaskData);
this.repositoryModel = repositoryModel;
this.repository = newTaskData.getAttributeMapper().getTaskRepository();
this.newTaskData = newTaskData;
this.oldTaskData = oldTaskData;
parse();
}
public boolean hasChanged() {
return !changedAttributes.isEmpty() || !newComments.isEmpty() || !newAttachments.isEmpty();
}
@Deprecated
public void setHasChanged(boolean hasChanged) {
}
public TaskRepository getRepository() {
return repository;
}
public TaskData getOldTaskData() {
return oldTaskData;
}
public TaskData getNewTaskData() {
return newTaskData;
}
public Collection<ITaskComment> getNewComments() {
return newComments;
}
public Collection<TaskAttribute> getNewAttachments() {
return newAttachments;
}
public Collection<ITaskAttributeDiff> getChangedAttributes() {
return changedAttributes;
}
private void parse() {
for (String attributeId : ATTRIBUTES_IDS) {
TaskAttribute newAttribute = newTaskData.getRoot().getMappedAttribute(attributeId);
TaskAttribute oldAttribute = null;
if (oldTaskData != null) {
oldAttribute = oldTaskData.getRoot().getMappedAttribute(attributeId);
}
if (oldAttribute == null && newAttribute == null) {
continue;
}
addChangedAttribute(oldAttribute, newAttribute, true);
}
// other attributes that have changed on newTaskData
for (TaskAttribute newAttribute : newTaskData.getRoot().getAttributes().values()) {
TaskAttribute oldAttribute = null;
if (oldTaskData != null) {
oldAttribute = oldTaskData.getRoot().getMappedAttribute(newAttribute.getPath());
}
addChangedAttribute(oldAttribute, newAttribute, false);
}
// other attributes that have been removed from newTaskData
if (oldTaskData != null) {
for (TaskAttribute oldAttribute : oldTaskData.getRoot().getAttributes().values()) {
TaskAttribute newAttribute = newTaskData.getRoot().getMappedAttribute(oldAttribute.getPath());
if (newAttribute == null) {
addChangedAttribute(oldAttribute, newAttribute, false);
}
}
}
}
private void addChangedAttribute(TaskAttribute oldAttribute, TaskAttribute newAttribute, boolean ignoreKind) {
TaskAttribute attribute;
if (newAttribute != null) {
attribute = newAttribute;
} else {
attribute = oldAttribute;
}
String type = attribute.getMetaData().getType();
if (TaskAttribute.TYPE_COMMENT.equals(type)) {
addChangedComment(oldAttribute, newAttribute);
} else if (TaskAttribute.TYPE_ATTACHMENT.equals(type)) {
newAttachments.add(attribute);
} else if (TaskAttribute.TYPE_OPERATION.equals(type)) {
// ignore
} else if (ignoreKind || attribute.getMetaData().getKind() != null) {
TaskAttributeDiff diff = new TaskAttributeDiff(oldAttribute, newAttribute);
if (diff.hasChanges()) {
changedAttributes.add(diff);
}
}
}
private void addChangedComment(TaskAttribute oldAttribute, TaskAttribute newAttribute) {
if (oldAttribute == null) {
ITaskComment comment = repositoryModel.createTaskComment(newAttribute);
if (comment != null) {
newComments.add(comment);
}
}
}
}