diff --git a/org.eclipse.mylyn.github.core/src/org/eclipse/mylyn/github/internal/GitHubRepositoryConnector.java b/org.eclipse.mylyn.github.core/src/org/eclipse/mylyn/github/internal/GitHubRepositoryConnector.java index 8b4b74471..b8d3534ad 100644 --- a/org.eclipse.mylyn.github.core/src/org/eclipse/mylyn/github/internal/GitHubRepositoryConnector.java +++ b/org.eclipse.mylyn.github.core/src/org/eclipse/mylyn/github/internal/GitHubRepositoryConnector.java @@ -12,7 +12,10 @@ *******************************************************************************/ package org.eclipse.mylyn.github.internal; +import java.io.IOException; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -35,7 +38,6 @@ */ public class GitHubRepositoryConnector extends AbstractRepositoryConnector { - /** * GitHub kind. */ @@ -54,7 +56,7 @@ public class GitHubRepositoryConnector extends AbstractRepositoryConnector { public GitHubRepositoryConnector() { taskDataHandler = new GitHubTaskDataHandler(this); } - + /** * {@inheritDoc} * @@ -108,37 +110,47 @@ public IStatus performQuery(TaskRepository repository, IStatus result = Status.OK_STATUS; String queryStatus = query.getAttribute("status"); - + String[] statuses; if (queryStatus.equals("all")) { - statuses = new String[] {"open","closed"}; + statuses = new String[] { "open", "closed" }; } else { statuses = new String[] { queryStatus }; } - + monitor.beginTask("Querying repository ...", statuses.length); try { String user = GitHub.computeTaskRepositoryUser(repository.getUrl()); - String project = GitHub.computeTaskRepositoryProject(repository.getUrl()); - GitHubCredentials credentials = GitHubCredentials.create(repository); - + String project = GitHub.computeTaskRepositoryProject(repository + .getUrl()); + GitHubCredentials credentials = GitHubCredentials + .create(repository); + + GitHubClient client = new GitHubClient(); + client.setCredentials(credentials.getUsername(), + credentials.getPassword()); + IssueService service = new IssueService(client); + // perform query - - for (String status: statuses) { - GitHubIssues issues = service.searchIssues(user, project, - status, query.getAttribute("queryText"), credentials); - + + for (String status : statuses) { + Map filterData = new HashMap(); + filterData.put(IssueService.FILTER_STATE, status); + + List issues = service.getIssues(user, project, + filterData); + // collect task data - for (GitHubIssue issue : issues.getIssues()) { + for (Issue issue : issues) { TaskData taskData = taskDataHandler.createPartialTaskData( - repository, monitor,user, project, issue); + repository, monitor, user, project, issue); collector.accept(taskData); } monitor.worked(1); } result = Status.OK_STATUS; - } catch (GitHubServiceException e) { + } catch (IOException e) { result = GitHub.createErrorStatus(e); } @@ -146,32 +158,35 @@ public IStatus performQuery(TaskRepository repository, return result; } - @Override public TaskData getTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor) throws CoreException { String user = GitHub.computeTaskRepositoryUser(repository.getUrl()); - String project = GitHub.computeTaskRepositoryProject(repository.getUrl()); - + String project = GitHub.computeTaskRepositoryProject(repository + .getUrl()); + try { - GitHubCredentials credentials = GitHubCredentials.create(repository); - GitHubIssue issue = service.showIssue(user, project, taskId, credentials); - List comments = null; + GitHubCredentials credentials = GitHubCredentials + .create(repository); + GitHubClient client = new GitHubClient(); + client.setCredentials(credentials.getUsername(), + credentials.getPassword()); + IssueService service = new IssueService(client); + Issue issue = service.getIssue(user, project, taskId); + List comments = null; if (issue.getComments() > 0) { - comments = service.getComments(user, project, issue, - credentials); + comments = service.getComments(user, project, taskId); } TaskData taskData = taskDataHandler.createTaskData(repository, monitor, user, project, issue, comments); - + return taskData; - } catch (GitHubServiceException e) { + } catch (IOException e) { throw new CoreException(GitHub.createErrorStatus(e)); } } - @Override public String getRepositoryUrlFromTaskUrl(String taskFullUrl) { if (taskFullUrl != null) { diff --git a/org.eclipse.mylyn.github.core/src/org/eclipse/mylyn/github/internal/GitHubTaskAttributeMapper.java b/org.eclipse.mylyn.github.core/src/org/eclipse/mylyn/github/internal/GitHubTaskAttributeMapper.java index 2d42de8d9..7cdfd9dd4 100644 --- a/org.eclipse.mylyn.github.core/src/org/eclipse/mylyn/github/internal/GitHubTaskAttributeMapper.java +++ b/org.eclipse.mylyn.github.core/src/org/eclipse/mylyn/github/internal/GitHubTaskAttributeMapper.java @@ -13,37 +13,43 @@ package org.eclipse.mylyn.github.internal; import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; +import java.util.Collections; import java.util.Date; +import java.util.List; import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.core.data.TaskAttribute; import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper; +/** + * GitHub task attribute mapper class. + */ public class GitHubTaskAttributeMapper extends TaskAttributeMapper { - private DateFormat dateFormat = SimpleDateFormat.getDateTimeInstance(); - + private DateFormat format = DateFormat.getDateTimeInstance( + DateFormat.MEDIUM, DateFormat.SHORT); + + /** + * @param taskRepository + */ public GitHubTaskAttributeMapper(TaskRepository taskRepository) { super(taskRepository); } - @Override - public String mapToRepositoryKey(TaskAttribute parent, String key) { - return key; - } - - @Override - public Date getDateValue(TaskAttribute attribute) { - String value = attribute.getValue(); - if (value != null) { - try { - return dateFormat.parse(value); - } catch (ParseException e) { - return super.getDateValue(attribute); + /** + * @see org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper#getValueLabels(org.eclipse.mylyn.tasks.core.data.TaskAttribute) + */ + public List getValueLabels(TaskAttribute taskAttribute) { + if (TaskAttribute.TYPE_DATE.equals(taskAttribute.getMetaData() + .getType())) { + String date = taskAttribute.getValue(); + if (date.length() > 0) { + synchronized (this.format) { + return Collections.singletonList(this.format + .format(new Date(Long.parseLong(date)))); + } } } - return null; + return super.getValueLabels(taskAttribute); } } diff --git a/org.eclipse.mylyn.github.core/src/org/eclipse/mylyn/github/internal/GitHubTaskDataHandler.java b/org.eclipse.mylyn.github.core/src/org/eclipse/mylyn/github/internal/GitHubTaskDataHandler.java index c762d59d2..ce4fefce8 100644 --- a/org.eclipse.mylyn.github.core/src/org/eclipse/mylyn/github/internal/GitHubTaskDataHandler.java +++ b/org.eclipse.mylyn.github.core/src/org/eclipse/mylyn/github/internal/GitHubTaskDataHandler.java @@ -12,20 +12,18 @@ *******************************************************************************/ package org.eclipse.mylyn.github.internal; -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Collection; import java.util.Date; +import java.util.LinkedList; import java.util.List; import java.util.Set; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.mylyn.tasks.core.IRepositoryPerson; import org.eclipse.mylyn.tasks.core.ITaskMapping; import org.eclipse.mylyn.tasks.core.RepositoryResponse; -import org.eclipse.mylyn.tasks.core.TaskRepository; import org.eclipse.mylyn.tasks.core.RepositoryResponse.ResponseKind; +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; @@ -42,14 +40,11 @@ public class GitHubTaskDataHandler extends AbstractTaskDataHandler { */ private GitHubTaskAttributeMapper taskAttributeMapper = null; private final GitHubRepositoryConnector connector; - private DateFormat dateFormat = SimpleDateFormat.getDateTimeInstance(); - - private DateFormat githubDateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss Z"); public GitHubTaskDataHandler(GitHubRepositoryConnector connector) { this.connector = connector; } - + @Override public TaskAttributeMapper getAttributeMapper(TaskRepository taskRepository) { if (this.taskAttributeMapper == null) @@ -59,39 +54,45 @@ public TaskAttributeMapper getAttributeMapper(TaskRepository taskRepository) { } public TaskData createPartialTaskData(TaskRepository repository, - IProgressMonitor monitor,String user, String project, GitHubIssue issue) { + IProgressMonitor monitor, String user, String project, Issue issue) { + String key = Integer.toString(issue.getNumber()); TaskData data = new TaskData(getAttributeMapper(repository), GitHubRepositoryConnector.KIND, repository.getRepositoryUrl(), - issue.getNumber()); + key); data.setVersion(DATA_VERSION); - - createOperations(data,issue); - - - createAttribute(data, GitHubTaskAttributes.KEY,issue.getNumber()); + + createOperations(data, issue); + + createAttribute(data, GitHubTaskAttributes.KEY, key); createAttribute(data, GitHubTaskAttributes.TITLE, issue.getTitle()); createAttribute(data, GitHubTaskAttributes.BODY, issue.getBody()); createAttribute(data, GitHubTaskAttributes.STATUS, issue.getState()); - createAttribute(data, GitHubTaskAttributes.CREATION_DATE, toLocalDate(issue.getCreated_at())); - createAttribute(data, GitHubTaskAttributes.MODIFICATION_DATE, toLocalDate(issue.getCreated_at())); - createAttribute(data, GitHubTaskAttributes.CLOSED_DATE, toLocalDate(issue.getClosed_at())); - createAttribute(data, GitHubTaskAttributes.REPORTER, issue.getUser()); + createAttribute(data, GitHubTaskAttributes.CREATION_DATE, + issue.getCreatedAt()); + createAttribute(data, GitHubTaskAttributes.MODIFICATION_DATE, + issue.getUpdatedAt()); + createAttribute(data, GitHubTaskAttributes.CLOSED_DATE, + issue.getClosedAt()); + createAttribute(data, GitHubTaskAttributes.REPORTER, issue.getUser(), + repository); + createAttribute(data, GitHubTaskAttributes.ASSIGNEE, + issue.getAssignee(), repository); createAttribute(data, GitHubTaskAttributes.COMMENT_NEW, ""); createAttribute(data, GitHubTaskAttributes.LABELS, issue.getLabels()); - + if (isPartial(data)) { data.setPartial(true); } return data; } - - + private boolean isPartial(TaskData data) { - for (GitHubTaskAttributes attribute: GitHubTaskAttributes.values()) { + for (GitHubTaskAttributes attribute : GitHubTaskAttributes.values()) { if (attribute.isRequiredForFullTaskData()) { - TaskAttribute taskAttribute = data.getRoot().getAttribute(attribute.getId()); + TaskAttribute taskAttribute = data.getRoot().getAttribute( + attribute.getId()); if (taskAttribute == null) { return true; } @@ -100,83 +101,63 @@ private boolean isPartial(TaskData data) { return false; } - private void createOperations(TaskData data, GitHubIssue issue) { - TaskAttribute operationAttribute = data.getRoot().createAttribute(TaskAttribute.OPERATION); + private void createOperations(TaskData data, Issue issue) { + TaskAttribute operationAttribute = data.getRoot().createAttribute( + TaskAttribute.OPERATION); operationAttribute.getMetaData().setType(TaskAttribute.TYPE_OPERATION); - + if (!data.isNew()) { if (issue.getState() != null) { - addOperation(data,issue,GitHubTaskOperation.LEAVE,true); + addOperation(data, issue, GitHubTaskOperation.LEAVE, true); if (issue.getState().equals("open")) { - addOperation(data,issue,GitHubTaskOperation.CLOSE,false); + addOperation(data, issue, GitHubTaskOperation.CLOSE, false); } else if (issue.getState().equals("closed")) { - addOperation(data,issue,GitHubTaskOperation.REOPEN,false); + addOperation(data, issue, GitHubTaskOperation.REOPEN, false); } } } } - private void addOperation(TaskData data, GitHubIssue issue, GitHubTaskOperation operation,boolean asDefault) { - TaskAttribute attribute = data.getRoot().createAttribute(TaskAttribute.PREFIX_OPERATION + operation.getId()); + private void addOperation(TaskData data, Issue issue, + GitHubTaskOperation operation, boolean asDefault) { + TaskAttribute attribute = data.getRoot().createAttribute( + TaskAttribute.PREFIX_OPERATION + operation.getId()); String label = createOperationLabel(issue, operation); TaskOperation.applyTo(attribute, operation.getId(), label); - + if (asDefault) { - TaskAttribute operationAttribute = data.getRoot().getAttribute(TaskAttribute.OPERATION); + TaskAttribute operationAttribute = data.getRoot().getAttribute( + TaskAttribute.OPERATION); TaskOperation.applyTo(operationAttribute, operation.getId(), label); } } - private String createOperationLabel(GitHubIssue issue, + private String createOperationLabel(Issue issue, GitHubTaskOperation operation) { - return operation==GitHubTaskOperation.LEAVE?operation.getLabel()+issue.getState():operation.getLabel(); - } - - private String toLocalDate(String date) { - if (date != null && date.trim().length() > 0) { - // expect "2010/02/02 22:58:39 -0800" - try { - Date d = githubDateFormat.parse(date); - date = dateFormat.format(d); - } catch (ParseException e) { - // ignore - } - } - return date; - } - - private String toGitHubDate(TaskData taskData, - GitHubTaskAttributes attr) { - TaskAttribute attribute = taskData.getRoot().getAttribute(attr.name()); - String value = attribute==null?null:attribute.getValue(); - if (value != null) { - try { - Date d = dateFormat.parse(value); - value = githubDateFormat.format(d); - } catch (ParseException e) { - // ignore - } - } - return value; + return operation == GitHubTaskOperation.LEAVE ? operation.getLabel() + + issue.getState() : operation.getLabel(); } public TaskData createTaskData(TaskRepository repository, - IProgressMonitor monitor, String user, String project, - GitHubIssue issue, List comments) { + IProgressMonitor monitor, String user, String project, Issue issue, + List comments) { TaskData taskData = createPartialTaskData(repository, monitor, user, project, issue); taskData.setPartial(false); - + if (comments != null && !comments.isEmpty()) { int count = 1; TaskAttribute root = taskData.getRoot(); - for (GitHubIssueComment comment : comments) { + for (Comment comment : comments) { TaskCommentMapper commentMapper = new TaskCommentMapper(); - commentMapper.setAuthor(repository.createPerson(comment - .getUser())); + User author = comment.getUser(); + IRepositoryPerson authorPerson = repository.createPerson(author + .getLogin()); + authorPerson.setName(author.getName()); + commentMapper.setAuthor(authorPerson); commentMapper.setCreationDate(comment.getCreatedAt()); commentMapper.setText(comment.getBody()); - commentMapper.setCommentId(comment.getId()); + commentMapper.setCommentId(comment.getUrl()); commentMapper.setNumber(count); TaskAttribute attribute = root @@ -194,20 +175,18 @@ private GitHubIssue createIssue(TaskData taskData) { if (!taskData.isNew()) { issue.setNumber(taskData.getTaskId()); } - issue.setBody(getAttributeValue(taskData,GitHubTaskAttributes.BODY)); - issue.setTitle(getAttributeValue(taskData,GitHubTaskAttributes.TITLE)); - issue.setState(getAttributeValue(taskData,GitHubTaskAttributes.STATUS)); - issue.setCreated_at(toGitHubDate(taskData,GitHubTaskAttributes.CREATION_DATE)); - issue.setCreated_at(toGitHubDate(taskData,GitHubTaskAttributes.MODIFICATION_DATE)); - issue.setCreated_at(toGitHubDate(taskData,GitHubTaskAttributes.CLOSED_DATE)); - issue.setComment_new(getAttributeValue(taskData, GitHubTaskAttributes.COMMENT_NEW)); + issue.setBody(getAttributeValue(taskData, GitHubTaskAttributes.BODY)); + issue.setTitle(getAttributeValue(taskData, GitHubTaskAttributes.TITLE)); + issue.setState(getAttributeValue(taskData, GitHubTaskAttributes.STATUS)); + issue.setComment_new(getAttributeValue(taskData, + GitHubTaskAttributes.COMMENT_NEW)); return issue; } - + private String getAttributeValue(TaskData taskData, GitHubTaskAttributes attr) { TaskAttribute attribute = taskData.getRoot().getAttribute(attr.getId()); - return attribute==null?null:attribute.getValue(); + return attribute == null ? null : attribute.getValue(); } private TaskAttribute createAttribute(TaskData data, @@ -224,17 +203,38 @@ private void createAttribute(TaskData data, GitHubTaskAttributes attribute, String value) { TaskAttribute attr = createAttribute(data, attribute); if (value != null) { - attr.addValue(value); + data.getAttributeMapper().setValue(attr, value); + } + } + + private void createAttribute(TaskData data, GitHubTaskAttributes attribute, + Date value) { + TaskAttribute attr = createAttribute(data, attribute); + if (value != null) { + data.getAttributeMapper().setDateValue(attr, value); } } private void createAttribute(TaskData data, GitHubTaskAttributes attribute, - Collection values) { + User value, TaskRepository repository) { + TaskAttribute attr = createAttribute(data, attribute); + if (value != null) { + IRepositoryPerson person = repository + .createPerson(value.getLogin()); + person.setName(value.getName()); + data.getAttributeMapper().setRepositoryPerson(attr, person); + } + } + + private void createAttribute(TaskData data, GitHubTaskAttributes attribute, + List