/******************************************************************************
* Copyright (c) 2011 GitHub Inc.
* 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:
* Kevin Sawicki (GitHub Inc.) - initial API and implementation
*****************************************************************************/
package org.eclipse.mylyn.internal.github.core;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import org.eclipse.egit.github.core.Comment;
import org.eclipse.egit.github.core.RepositoryId;
import org.eclipse.egit.github.core.User;
import org.eclipse.egit.github.core.client.GitHubClient;
import org.eclipse.egit.github.core.service.CollaboratorService;
import org.eclipse.mylyn.tasks.core.IRepositoryPerson;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
import org.eclipse.mylyn.tasks.core.data.TaskAttributeMetaData;
import org.eclipse.mylyn.tasks.core.data.TaskCommentMapper;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.core.data.TaskOperation;
/**
* Core task data handler
*/
public abstract class GitHubTaskDataHandler extends AbstractTaskDataHandler {
@Override
public TaskAttributeMapper getAttributeMapper(TaskRepository taskRepository) {
return new GitHubTaskAttributeMapper(taskRepository);
}
/**
* Set repository person as value of given attribute
*
* @param data
* @param attribute
* @param user
* @param repository
* @return task attribute
*/
protected TaskAttribute setPersonValue(TaskData data,
TaskAttribute attribute, User user, TaskRepository repository) {
if (user != null)
data.getAttributeMapper().setRepositoryPerson(attribute,
createPerson(user, repository));
return attribute;
}
/**
* Create repository person from user
*
* @param user
* @param repository
* @return repository person
*/
protected IRepositoryPerson createPerson(User user,
TaskRepository repository) {
IRepositoryPerson person = repository.createPerson(user.getLogin());
person.setName(user.getName());
return person;
}
/**
* Set date value of given task attribute
*
* @param data
* @param attribute
* @param date
* @return task attribute
*/
protected TaskAttribute setDateValue(TaskData data,
TaskAttribute attribute, Date date) {
if (date != null)
data.getAttributeMapper().setDateValue(attribute, date);
return attribute;
}
/**
* Add task attributes for given comments under given parent
*
* @param parent
* @param comments
* @param repository
*/
protected void addComments(final TaskAttribute parent,
final List<Comment> comments, final TaskRepository repository) {
if (comments == null || comments.isEmpty())
return;
int count = 1;
for (Comment comment : comments) {
TaskCommentMapper commentMapper = new TaskCommentMapper();
commentMapper
.setAuthor(createPerson(comment.getUser(), repository));
commentMapper.setCreationDate(comment.getCreatedAt());
commentMapper.setText(comment.getBody());
commentMapper.setCommentId(comment.getUrl());
commentMapper.setNumber(count);
TaskAttribute attribute = parent
.createAttribute(TaskAttribute.PREFIX_COMMENT + count);
commentMapper.applyTo(attribute);
count++;
}
}
/**
* Get attribute value
*
* @param taskData
* @param attr
* @return value
*/
protected String getAttributeValue(TaskData taskData,
GitHubAttributeMetadata attr) {
TaskAttribute attribute = taskData.getRoot().getAttribute(attr.getId());
return attribute == null ? null : attribute.getValue();
}
/**
* Create task attribute from metadata
*
* @param data
* @param attribute
* @return created task attribute
*/
protected TaskAttribute createAttribute(TaskData data,
GitHubAttributeMetadata attribute) {
TaskAttribute attr = data.getRoot().createAttribute(attribute.getId());
TaskAttributeMetaData metaData = attr.getMetaData();
metaData.defaults().setType(attribute.getType())
.setKind(attribute.getKind()).setLabel(attribute.getLabel())
.setReadOnly(attribute.isReadOnly());
return attr;
}
/**
* Create task attribute and set value
*
* @param data
* @param metadata
* @param value
* @return created attribute
*/
protected TaskAttribute createAttribute(TaskData data,
GitHubAttributeMetadata metadata, String value) {
TaskAttribute attr = createAttribute(data, metadata);
if (value != null)
data.getAttributeMapper().setValue(attr, value);
return attr;
}
/**
* Create attribute and set value
*
* @param data
* @param metadata
* @param date
* @return created attribute
*/
protected TaskAttribute createAttribute(TaskData data,
GitHubAttributeMetadata metadata, Date date) {
return setDateValue(data, createAttribute(data, metadata), date);
}
/**
* Create attribute and set value
*
* @param data
* @param metadata
* @param user
* @param repository
* @return created attribute
*/
protected TaskAttribute createAttribute(TaskData data,
GitHubAttributeMetadata metadata, User user,
TaskRepository repository) {
return setPersonValue(data, createAttribute(data, metadata), user,
repository);
}
/**
* Create standard operation task attribute
*
* @param data
* @return created attribute
*/
protected TaskAttribute createOperationAttribute(TaskData data) {
TaskAttribute attribute = data.getRoot().createAttribute(
TaskAttribute.OPERATION);
attribute.getMetaData().setType(TaskAttribute.TYPE_OPERATION);
return attribute;
}
/**
* Add operation with label and id
*
* @param data
* @param id
* @param label
* @param isDefault
* @return created task attribute
*/
protected TaskAttribute addOperation(TaskData data, String id,
String label, boolean isDefault) {
final TaskAttribute root = data.getRoot();
TaskAttribute attribute = root
.createAttribute(TaskAttribute.PREFIX_OPERATION + id);
TaskOperation.applyTo(attribute, id, label);
if (isDefault)
TaskOperation.applyTo(root.getAttribute(TaskAttribute.OPERATION),
id, label);
return attribute;
}
/**
* Does the attribute's value in the given task data match the authenticated
* client user?
*
* @param client
* @param metadata
* @param data
* @return true if match, false otherwise
*/
protected boolean attributeMatchesUser(GitHubClient client,
GitHubAttributeMetadata metadata, TaskData data) {
if (client == null || metadata == null || data == null)
return false;
String user = client.getUser();
if (user == null || user.length() == 0)
return false;
return metadata.getValue(data).equals(user);
}
/**
* Is configured client user a collaborator on the given repository?
*
* @param client
* @param repo
* @return true if collaborator, false otherwise
* @throws IOException
*/
protected boolean isCollaborator(GitHubClient client, RepositoryId repo)
throws IOException {
String user = client.getUser();
if (user == null || user.length() == 0)
return false;
return new CollaboratorService(client).isCollaborator(repo, user);
}
}