blob: 4a3dc6136dd20b347e6871b4b11c95bb8f643d94 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2015 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.tasks.core.data;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.eclipse.core.runtime.Assert;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
import org.eclipse.mylyn.tasks.core.ITaskAttachment;
import org.eclipse.mylyn.tasks.core.ITaskComment;
import org.eclipse.mylyn.tasks.core.TaskRepository;
/**
* @author Steffen Pingel
* @since 3.0
*/
public class TaskAttributeMapper {
private final TaskRepository taskRepository;
public TaskAttributeMapper(@NonNull TaskRepository taskRepository) {
Assert.isNotNull(taskRepository);
this.taskRepository = taskRepository;
}
@NonNull
public TaskAttribute createTaskAttachment(@NonNull TaskData taskData) {
TaskAttribute taskAttribute = taskData.getRoot()
.createAttribute(mapToRepositoryKey(taskData.getRoot(), TaskAttribute.NEW_ATTACHMENT));
// TaskAttachmentMapper mapper = TaskAttachmentMapper.createFrom(taskAttribute);
// mapper.setContentType("");
// mapper.setFileName("");
// mapper.setContentType("");
// mapper.applyTo(taskAttribute);
return taskAttribute;
}
public boolean equals(@NonNull TaskAttribute newAttribute, @NonNull TaskAttribute oldAttribute) {
if (TaskAttribute.TYPE_COMMENT.equals(newAttribute.getMetaData().getType())) {
if (newAttribute.getValues().equals(oldAttribute.getValues())) {
return true;
}
// the comment mapping accidentally changed throughout the Mylyn 3.7 cycle therefore some
// cases need to be considered equal even though attribute values differ
if (oldAttribute != null) {
TaskAttribute commentIdAttribute = oldAttribute.getAttribute("task.common.comment.id"); //$NON-NLS-1$
// ID not present
if ((commentIdAttribute == null || commentIdAttribute.getValue().equals("")) //$NON-NLS-1$
&& newAttribute.getValue().equals("")) { //$NON-NLS-1$
return true;
}
// ID previously stored in a sub attribute
if (commentIdAttribute != null && commentIdAttribute.getValue().equals(newAttribute.getValue())) {
return true;
}
}
}
return newAttribute.getValues().equals(oldAttribute.getValues());
}
@Nullable
public TaskAttribute getAssoctiatedAttribute(@NonNull TaskAttribute taskAttribute) {
String id = taskAttribute.getMetaDatum(TaskAttribute.META_ASSOCIATED_ATTRIBUTE_ID);
if (id != null) {
// look up as nested attribute first
TaskAttribute associatedAttribute = taskAttribute.getAttribute(id);
if (associatedAttribute != null) {
return associatedAttribute;
}
// fall back to root
return taskAttribute.getTaskData().getRoot().getAttribute(id);
}
return null;
}
@Nullable
public TaskAttribute getAssoctiatedAttribute(@NonNull TaskOperation taskOperation) {
TaskAttribute taskAttribute = taskOperation.getTaskAttribute();
if (taskAttribute != null) {
return getAssoctiatedAttribute(taskAttribute);
}
return null;
}
@NonNull
public List<TaskAttribute> getAttributesByType(@NonNull TaskData taskData, @NonNull String type) {
Assert.isNotNull(taskData);
Assert.isNotNull(type);
List<TaskAttribute> result = new ArrayList<TaskAttribute>();
for (TaskAttribute taskAttribute : taskData.getRoot().getAttributes().values()) {
if (type.equals(taskAttribute.getMetaData().getType())) {
result.add(taskAttribute);
}
}
return result;
}
public boolean getBooleanValue(@NonNull TaskAttribute attribute) {
String booleanString = attribute.getValue();
if (booleanString != null && booleanString.length() > 0) {
return Boolean.parseBoolean(booleanString);
}
return false;
}
/**
* Connectors should ensure that this method returns dates at midnight in the local time zone when the
* {@link TaskAttribute#META_ATTRIBUTE_PRECISION precision} is {@link TimeUnit#DAYS} or coarser. This is because
* {@link Date Dates} are automatically displayed in the local time zone. This is not a concern when the precision
* is finer than {@link TimeUnit#DAYS}, because in that case the value has a time component which can meaningfully
* be converted to local time.
*/
@Nullable
public Date getDateValue(@NonNull TaskAttribute attribute) {
String dateString = attribute.getValue();
try {
if (dateString != null && dateString.length() > 0) {
return new Date(Long.parseLong(dateString));
}
} catch (NumberFormatException e) {
// ignore
}
return null;
}
/**
* @deprecated Not used, see {@link TaskAttributeMetaData#setDefaultOption(String)}
*/
@Nullable
@Deprecated
public String getDefaultOption(@NonNull TaskAttribute taskAttribute) {
return taskAttribute.getMetaData().getDefaultOption();
}
/**
* @since 3.5
*/
@Nullable
public Double getDoubleValue(@NonNull TaskAttribute attribute) {
String doubleString = attribute.getValue();
try {
if (doubleString != null) {
return Double.parseDouble(doubleString);
}
} catch (NumberFormatException e) {
// ignore
}
return null;
}
@Nullable
public Integer getIntegerValue(@NonNull TaskAttribute attribute) {
String integerString = attribute.getValue();
try {
if (integerString != null) {
return Integer.parseInt(integerString);
}
} catch (NumberFormatException e) {
// ignore
}
return null;
}
@Nullable
public String getLabel(@NonNull TaskAttribute taskAttribute) {
return taskAttribute.getMetaData().getLabel();
}
@Nullable
public Long getLongValue(@NonNull TaskAttribute attribute) {
String longString = attribute.getValue();
try {
if (longString != null) {
return Long.parseLong(longString);
}
} catch (NumberFormatException e) {
// ignore
}
return null;
}
/**
* Returns labelByValue.
*/
@NonNull
public Map<String, String> getOptions(@NonNull TaskAttribute attribute) {
return attribute.getOptions();
}
@NonNull
public IRepositoryPerson getRepositoryPerson(@NonNull TaskAttribute taskAttribute) {
IRepositoryPerson person = taskRepository.createPerson(taskAttribute.getValue());
TaskAttribute child = taskAttribute.getMappedAttribute(TaskAttribute.PERSON_NAME);
if (child != null) {
person.setName(getValue(child));
}
return person;
}
@NonNull
public List<TaskOperation> getTaskOperations(@NonNull TaskAttribute operationsAttribute) {
Assert.isNotNull(operationsAttribute);
TaskData taskData = operationsAttribute.getTaskData();
List<TaskOperation> result = new ArrayList<TaskOperation>();
for (TaskAttribute taskAttribute : taskData.getRoot().getAttributes().values()) {
if (TaskAttribute.TYPE_OPERATION.equals(taskAttribute.getMetaData().getType())
&& !taskAttribute.getId().equals(mapToRepositoryKey(taskData.getRoot(), TaskAttribute.OPERATION))) {
result.add(TaskOperation.createFrom(taskAttribute));
}
}
return result;
}
@NonNull
public TaskOperation getTaskOperation(@NonNull TaskAttribute taskAttribute) {
Assert.isNotNull(taskAttribute);
return TaskOperation.createFrom(taskAttribute);
}
@NonNull
public TaskRepository getTaskRepository() {
return taskRepository;
}
/**
* @return empty String if not available
*/
@Nullable
public String getValue(@NonNull TaskAttribute taskAttribute) {
return taskAttribute.getValue();
}
@NonNull
public String getValueLabel(@NonNull TaskAttribute taskAttribute) {
List<String> labels = getValueLabels(taskAttribute);
StringBuilder sb = new StringBuilder();
String sep = ""; //$NON-NLS-1$
for (String value : labels) {
sb.append(sep).append(value);
sep = ", "; //$NON-NLS-1$
}
return sb.toString();
}
@NonNull
public List<String> getValueLabels(@NonNull TaskAttribute taskAttribute) {
List<String> values = taskAttribute.getValues();
Map<String, String> options = getOptions(taskAttribute);
List<String> result = new ArrayList<String>(values.size());
for (String value : values) {
String option = options.get(value);
if (option != null) {
value = option;
} else if (taskAttribute.getOption(value) != null) {
value = taskAttribute.getOption(value);
}
result.add(value);
}
return result;
}
@NonNull
public List<String> getValues(@NonNull TaskAttribute attribute) {
return new ArrayList<String>(attribute.getValues());
}
public boolean hasValue(@NonNull TaskAttribute attribute) {
return attribute.getValues().size() > 0;
}
public String mapToRepositoryKey(@NonNull TaskAttribute parent, @NonNull String key) {
return key;
}
public void setBooleanValue(@NonNull TaskAttribute attribute, @NonNull Boolean value) {
attribute.setValue(Boolean.toString(value));
}
/**
* Connectors should ensure that this method accepts dates at midnight in the local time zone when the
* {@link TaskAttribute#META_ATTRIBUTE_PRECISION precision} is {@link TimeUnit#DAYS} or coarser.
*/
public void setDateValue(@NonNull TaskAttribute attribute, @Nullable Date date) {
if (date != null) {
attribute.setValue(Long.toString(date.getTime()));
} else {
attribute.clearValues();
}
}
/**
* @since 3.5
*/
public void setDoubleValue(@NonNull TaskAttribute attribute, @Nullable Double value) {
if (value != null) {
attribute.setValue(value.toString());
} else {
attribute.clearValues();
}
}
public void setIntegerValue(@NonNull TaskAttribute attribute, @Nullable Integer value) {
if (value != null) {
attribute.setValue(value.toString());
} else {
attribute.clearValues();
}
}
public void setLongValue(@NonNull TaskAttribute attribute, @Nullable Long value) {
if (value != null) {
attribute.setValue(value.toString());
} else {
attribute.clearValues();
}
}
public void setRepositoryPerson(@NonNull TaskAttribute taskAttribute, @NonNull IRepositoryPerson person) {
setValue(taskAttribute, person.getPersonId());
if (person.getName() != null) {
TaskAttribute child = taskAttribute.createAttribute(TaskAttribute.PERSON_NAME);
setValue(child, person.getName());
}
}
public void setTaskOperation(@NonNull TaskAttribute taskAttribute, @NonNull TaskOperation taskOperation) {
Assert.isNotNull(taskAttribute);
Assert.isNotNull(taskOperation);
TaskOperation.applyTo(taskAttribute, taskOperation.getOperationId(), taskOperation.getLabel());
}
public void setValue(@NonNull TaskAttribute attribute, @NonNull String value) {
attribute.setValue(value);
}
public void setValues(@NonNull TaskAttribute attribute, @NonNull List<String> values) {
attribute.setValues(values);
}
public void updateTaskAttachment(@NonNull ITaskAttachment taskAttachment, @NonNull TaskAttribute taskAttribute) {
TaskAttachmentMapper.createFrom(taskAttribute).applyTo(taskAttachment);
}
public void updateTaskComment(@NonNull ITaskComment taskComment, @NonNull TaskAttribute taskAttribute) {
TaskCommentMapper.createFrom(taskAttribute).applyTo(taskComment);
}
/**
* Connectors may override this method to specify the mapping from the repository's priority options to
* {@link PriorityLevel}
*
* @return the {@link PriorityLevel} corresponding to the given option for the given priority attribute
* @since 3.20
*/
public PriorityLevel getPriorityLevel(TaskAttribute priorityAttribute, String priorityOption) {
return PriorityLevel.fromString(priorityOption);
}
}