blob: b4ae5dbec52eb1bc48b295ac02a3a414fe257493 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2008 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.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.eclipse.core.runtime.Assert;
/**
* Encapsulates attributes for task data.
*
* @author Rob Elves
* @author Steffen Pingel
* @since 3.0
* @noextend This class is not intended to be subclassed by clients.
*/
public final class TaskAttribute {
/**
* Boolean attribute. If true, repository user needs to be added to the cc list.
*/
public static final String ADD_SELF_CC = "task.common.addselfcc"; //$NON-NLS-1$
public static final String ATTACHMENT_AUTHOR = "task.common.attachment.author"; //$NON-NLS-1$
public static final String ATTACHMENT_CONTENT_TYPE = "task.common.attachment.ctype"; //$NON-NLS-1$
public static final String ATTACHMENT_DATE = "task.common.attachment.date"; //$NON-NLS-1$
public static final String ATTACHMENT_DESCRIPTION = "task.common.attachment.description"; //$NON-NLS-1$
public static final String ATTACHMENT_FILENAME = "filename"; //$NON-NLS-1$
public static final String ATTACHMENT_ID = "task.common.attachment.id"; //$NON-NLS-1$
public static final String ATTACHMENT_IS_DEPRECATED = "task.common.attachment.deprecated"; //$NON-NLS-1$
public static final String ATTACHMENT_IS_PATCH = "task.common.attachment.patch"; //$NON-NLS-1$
public static final String ATTACHMENT_SIZE = "task.common.attachment.size"; //$NON-NLS-1$
public static final String ATTACHMENT_URL = "task.common.attachment.url"; //$NON-NLS-1$
public static final String COMMENT_ATTACHMENT_ID = "task.common.comment.attachment.id"; //$NON-NLS-1$
public static final String COMMENT_AUTHOR = "task.common.comment.author"; //$NON-NLS-1$
@Deprecated
public static final String COMMENT_AUTHOR_NAME = "task.common.comment.author.name"; //$NON-NLS-1$
public static final String COMMENT_DATE = "task.common.comment.date"; //$NON-NLS-1$
public static final String COMMENT_HAS_ATTACHMENT = "task.common.comment.attachment"; //$NON-NLS-1$
public static final String COMMENT_NEW = "task.common.comment.new"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String COMMENT_NUMBER = "task.common.comment.number"; //$NON-NLS-1$
public static final String COMMENT_TEXT = "task.common.comment.text"; //$NON-NLS-1$
public static final String COMMENT_URL = "task.common.comment.url"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String COMPONENT = "task.common.component"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String DATE_COMPLETION = "task.common.date.completed"; //$NON-NLS-1$
public static final String DATE_CREATION = "task.common.date.created"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String DATE_DUE = "task.common.date.due"; //$NON-NLS-1$
public static final String DATE_MODIFICATION = "task.common.date.modified"; //$NON-NLS-1$
public static final String DESCRIPTION = "task.common.description"; //$NON-NLS-1$
public static final String KEYWORDS = "task.common.keywords"; //$NON-NLS-1$
public static final String KIND_DEFAULT = "task.common.kind.default"; //$NON-NLS-1$
public static final String KIND_OPERATION = "task.common.kind.operation"; //$NON-NLS-1$
public static final String KIND_PEOPLE = "task.common.kind.people"; //$NON-NLS-1$
//public static final String META_SHOW_IN_ATTRIBUTES_SECTION = "task.meta.showInTaskEditorAttributesSection";
public static final String META_ASSOCIATED_ATTRIBUTE_ID = "task.meta.associated.attribute"; //$NON-NLS-1$
public static final String META_ATTRIBUTE_KIND = "task.meta.attributeKind"; //$NON-NLS-1$
public static final String META_ATTRIBUTE_TYPE = "task.meta.type"; //$NON-NLS-1$
public static final String META_DEFAULT_OPTION = "task.meta.defaultOption"; //$NON-NLS-1$
// public static final String META_DETAIL_LEVEL = "task.meta.detailLevel";
public static final String META_LABEL = "task.meta.label"; //$NON-NLS-1$
public static final String META_READ_ONLY = "task.meta.readOnly"; //$NON-NLS-1$
public static final String NEW_ATTACHMENT = "task.common.new.attachment"; //$NON-NLS-1$
// XXX merge with USER_CC
//public static final String NEW_CC = "task.common.newcc";
public static final String OPERATION = "task.common.operation"; //$NON-NLS-1$
public static final String PERSON_NAME = "task.common.person.name"; //$NON-NLS-1$
public static final String PREFIX_ATTACHMENT = "task.common.attachment-"; //$NON-NLS-1$
public static final String PREFIX_COMMENT = "task.common.comment-"; //$NON-NLS-1$
// XXX merge with USER_CC
//public static final String REMOVE_CC = "task.common.removecc";
public static final String PREFIX_OPERATION = "task.common.operation-"; //$NON-NLS-1$
public static final String PRIORITY = "task.common.priority"; //$NON-NLS-1$
public static final String PRODUCT = "task.common.product"; //$NON-NLS-1$
public static final String RESOLUTION = "task.common.resolution"; //$NON-NLS-1$
public static final String STATUS = "task.common.status"; //$NON-NLS-1$
public static final String SUMMARY = "task.common.summary"; //$NON-NLS-1$
public static final String TASK_KEY = "task.common.key"; //$NON-NLS-1$
public static final String TASK_KIND = "task.common.kind"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TASK_URL = "task.common.url"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TYPE_ATTACHMENT = "attachment"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TYPE_BOOLEAN = "boolean"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TYPE_COMMENT = "comment"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TYPE_CONTAINER = "container"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TYPE_DATE = "date"; //$NON-NLS-1$
/**
* @since 3.1
*/
public static final String TYPE_DATETIME = "dateTime"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TYPE_INTEGER = "integer"; //$NON-NLS-1$
/**
* @since 3.1
*/
public static final String TYPE_LONG = "long"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TYPE_LONG_RICH_TEXT = "longRichText"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TYPE_LONG_TEXT = "longText"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TYPE_MULTI_SELECT = "multiSelect"; //$NON-NLS-1$
public static final String TYPE_OPERATION = "operation"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TYPE_PERSON = "person"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TYPE_SHORT_RICH_TEXT = "shortRichText"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TYPE_SHORT_TEXT = "shortText"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TYPE_SINGLE_SELECT = "singleSelect"; //$NON-NLS-1$
/**
* @since 3.0
*/
public static final String TYPE_TASK_DEPENDENCY = "taskDepenedency"; //$NON-NLS-1$
public static final String TYPE_URL = "url"; //$NON-NLS-1$
public static final String USER_ASSIGNED = "task.common.user.assigned"; //$NON-NLS-1$
@Deprecated
public static final String USER_ASSIGNED_NAME = "task.common.user.assigned.name"; //$NON-NLS-1$
public static final String USER_CC = "task.common.user.cc"; //$NON-NLS-1$
public static final String USER_REPORTER = "task.common.user.reporter"; //$NON-NLS-1$
@Deprecated
public static final String USER_REPORTER_NAME = "task.common.user.reporter.name"; //$NON-NLS-1$
private Map<String, TaskAttribute> attributeById;
private final String attributeId;
private Map<String, String> metaData;
private Map<String, String> optionByKey;
private final TaskAttribute parentAttribute;
private final TaskData taskData;
/**
* Attribute's values (selected or added)
*/
private final List<String> values;
public TaskAttribute(TaskAttribute parentAttribute, String attributeId) {
Assert.isNotNull(parentAttribute);
Assert.isNotNull(attributeId);
this.parentAttribute = parentAttribute;
this.attributeId = attributeId;
this.taskData = parentAttribute.getTaskData();
this.values = new ArrayList<String>(1);
parentAttribute.add(this);
}
/**
* Constructor for the root node.
*/
TaskAttribute(TaskData taskData) {
Assert.isNotNull(taskData);
this.parentAttribute = null;
this.taskData = taskData;
this.attributeId = "root"; //$NON-NLS-1$
this.values = new ArrayList<String>(1);
}
private void add(TaskAttribute attribute) {
if (attributeById == null) {
attributeById = new LinkedHashMap<String, TaskAttribute>();
}
attributeById.put(attribute.getId(), attribute);
}
public void addValue(String value) {
Assert.isNotNull(value);
values.add(value);
}
public void clearAttributes() {
attributeById = null;
}
void clearMetaDataMap() {
metaData = null;
}
public void clearOptions() {
optionByKey = null;
}
public void clearValues() {
values.clear();
}
public TaskAttribute createAttribute(String attributeId) {
return new TaskAttribute(this, attributeId);
}
public void deepAddCopy(TaskAttribute source) {
TaskAttribute target = createAttribute(source.getId());
target.values.addAll(source.values);
if (source.metaData != null) {
target.metaData = new LinkedHashMap<String, String>(source.metaData);
}
if (source.optionByKey != null) {
target.optionByKey = new LinkedHashMap<String, String>(source.optionByKey);
}
if (source.attributeById != null) {
for (TaskAttribute child : source.attributeById.values()) {
target.deepAddCopy(child);
}
}
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final TaskAttribute other = (TaskAttribute) obj;
if (attributeId == null) {
if (other.attributeId != null) {
return false;
}
} else if (!attributeId.equals(other.attributeId)) {
return false;
}
return true;
}
public TaskAttribute getAttribute(String attributeId) {
Assert.isNotNull(attributeId);
return (attributeById != null) ? attributeById.get(attributeId) : null;
}
public Map<String, TaskAttribute> getAttributes() {
if (attributeById != null) {
return Collections.unmodifiableMap(attributeById);
} else {
return Collections.emptyMap();
}
}
public String getId() {
return attributeId;
}
public TaskAttribute getMappedAttribute(String attributeId) {
Assert.isNotNull(attributeId);
return (attributeById != null) ? attributeById.get(getTaskData().getAttributeMapper().mapToRepositoryKey(this,
attributeId)) : null;
}
public TaskAttribute getMappedAttribute(String[] path) {
TaskAttribute attribute = this;
for (String id : path) {
attribute = attribute.getMappedAttribute(id);
if (attribute == null) {
break;
}
}
return attribute;
}
String getMetaDatum(String key) {
return (metaData != null) ? metaData.get(key) : null;
}
Map<String, String> getMetaDataMap() {
if (metaData != null) {
return Collections.unmodifiableMap(metaData);
} else {
return Collections.emptyMap();
}
}
public String getOption(String key) {
return (optionByKey != null) ? optionByKey.get(key) : null;
}
public Map<String, String> getOptions() {
if (optionByKey != null) {
return Collections.unmodifiableMap(optionByKey);
} else {
return Collections.emptyMap();
}
}
public TaskAttribute getParentAttribute() {
return parentAttribute;
}
public String[] getPath() {
List<String> path = new ArrayList<String>();
TaskAttribute attribute = this;
while (attribute.getParentAttribute() != null) {
path.add(attribute.getId());
attribute = attribute.getParentAttribute();
}
Collections.reverse(path);
return path.toArray(new String[0]);
}
public TaskAttributeMetaData getMetaData() {
return new TaskAttributeMetaData(this);
}
public TaskData getTaskData() {
return taskData;
}
public String getValue() {
if (values.size() > 0) {
return values.get(0);
} else {
return ""; //$NON-NLS-1$
}
}
public List<String> getValues() {
return Collections.unmodifiableList(values);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((attributeId == null) ? 0 : attributeId.hashCode());
return result;
}
void putMetaDatum(String key, String value) {
Assert.isNotNull(key);
Assert.isNotNull(value);
if (metaData == null) {
metaData = new LinkedHashMap<String, String>();
}
metaData.put(key, value);
}
/**
* Adds an attribute option value
*
* @param readableValue
* The value displayed on the screen
* @param parameterValue
* The option value used when sending the form to the server
*/
public void putOption(String key, String value) {
Assert.isNotNull(key);
Assert.isNotNull(value);
if (optionByKey == null) {
optionByKey = new LinkedHashMap<String, String>();
}
optionByKey.put(key, value);
}
public void removeAttribute(String attributeId) {
if (attributeById != null) {
attributeById.remove(attributeId);
}
}
void removeMetaDatum(String metaDataId) {
if (metaData != null) {
metaData.remove(metaDataId);
}
}
public void removeValue(String value) {
values.remove(value);
}
public void setValue(String value) {
Assert.isNotNull(value);
if (values.size() > 0) {
values.clear();
}
values.add(value);
}
public void setValues(List<String> values) {
this.values.clear();
this.values.addAll(values);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
toString(sb, ""); //$NON-NLS-1$
return sb.toString();
}
private void toString(StringBuilder sb, String prefix) {
sb.append(prefix);
sb.append("TaskAttribute[id=" + attributeId + ",values=" + values + ",options=" + optionByKey + ",metaData=" //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+ metaData + "]\n"); //$NON-NLS-1$
if (attributeById != null) {
for (TaskAttribute child : attributeById.values()) {
child.toString(sb, prefix + " "); //$NON-NLS-1$
}
}
}
public TaskAttribute createMappedAttribute(String attributeId) {
Assert.isNotNull(attributeId);
String mappedAttributeId = getTaskData().getAttributeMapper().mapToRepositoryKey(this, attributeId);
Assert.isNotNull(mappedAttributeId);
return new TaskAttribute(this, mappedAttributeId);
}
}