/*******************************************************************************
* 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.gist;
import java.io.IOException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.egit.github.core.Gist;
import org.eclipse.egit.github.core.client.GitHubClient;
import org.eclipse.egit.github.core.service.GistService;
import org.eclipse.mylyn.internal.github.core.GitHub;
import org.eclipse.mylyn.internal.github.core.RepositoryConnector;
import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.core.data.AbstractTaskAttachmentHandler;
import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
import org.eclipse.mylyn.tasks.core.data.TaskAttributeMapper;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
import org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession;
/**
* Gist repository connector class.
*/
public class GistConnector extends RepositoryConnector {
/**
* KIND
*/
public static final String KIND = "githubGists"; //$NON-NLS-1$
/**
* Create client for repository
*
* @param repository
* @return client
*/
public static GitHubClient createClient(TaskRepository repository) {
GitHubClient client = GitHubClient.createClient(repository
.getRepositoryUrl());
return configureClient(client, repository);
}
/**
* Configure client for repository
*
* @param client
* @param repository
* @return client
*/
public static GitHubClient configureClient(GitHubClient client,
TaskRepository repository) {
GitHub.addCredentials(client, repository);
return GitHub.configureClient(client);
}
private GistTaskDataHandler dataHandler = new GistTaskDataHandler();
private GistAttachmentHandler attachmentHandler = new GistAttachmentHandler();
/**
* @see org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector#getTaskDataHandler()
*/
public AbstractTaskDataHandler getTaskDataHandler() {
return dataHandler;
}
/**
* @see org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector#getTaskAttachmentHandler()
*/
public AbstractTaskAttachmentHandler getTaskAttachmentHandler() {
return attachmentHandler;
}
/**
* @see org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector#canCreateNewTask(org.eclipse.mylyn.tasks.core.TaskRepository)
*/
public boolean canCreateNewTask(TaskRepository repository) {
// Gists are created from menu actions on files and text selections
return false;
}
/**
* @see org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector#getConnectorKind()
*/
public String getConnectorKind() {
return KIND;
}
/**
* @see org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector#getLabel()
*/
public String getLabel() {
return Messages.GistConnector_LabelConnector;
}
/**
* @see org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector#getRepositoryUrlFromTaskUrl(java.lang.String)
*/
public String getRepositoryUrlFromTaskUrl(String taskFullUrl) {
int lastSlash = taskFullUrl.lastIndexOf('/');
return lastSlash >= 0 ? taskFullUrl.substring(0, lastSlash) : null;
}
/**
* @see org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector#getTaskData(org.eclipse.mylyn.tasks.core.TaskRepository,
* java.lang.String, org.eclipse.core.runtime.IProgressMonitor)
*/
public TaskData getTaskData(TaskRepository repository, String taskId,
IProgressMonitor monitor) throws CoreException {
GistService service = new GistService(createClient(repository));
try {
TaskAttributeMapper mapper = dataHandler
.getAttributeMapper(repository);
Gist gist = service.getGist(taskId);
TaskData data = new TaskData(mapper, getConnectorKind(),
repository.getUrl(), gist.getId());
data.setPartial(false);
dataHandler.fillTaskData(repository, data, gist);
if (gist.getComments() > 0)
dataHandler.fillComments(repository, data,
service.getComments(gist.getId()));
return data;
} catch (IOException e) {
throw new CoreException(GitHub.createWrappedStatus(e));
}
}
/**
* @see org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector#performQuery(org.eclipse.mylyn.tasks.core.TaskRepository,
* org.eclipse.mylyn.tasks.core.IRepositoryQuery,
* org.eclipse.mylyn.tasks.core.data.TaskDataCollector,
* org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession,
* org.eclipse.core.runtime.IProgressMonitor)
*/
public IStatus performQuery(TaskRepository repository,
IRepositoryQuery query, TaskDataCollector collector,
ISynchronizationSession session, IProgressMonitor monitor) {
IStatus status = Status.OK_STATUS;
GistService service = new GistService(createClient(repository));
String user = query.getAttribute(IGistQueryConstants.USER);
try {
TaskAttributeMapper mapper = dataHandler
.getAttributeMapper(repository);
for (Gist gist : service.getGists(user)) {
TaskData data = new TaskData(mapper, getConnectorKind(),
repository.getUrl(), gist.getId());
data.setPartial(true);
dataHandler.fillTaskData(repository, data, gist);
collector.accept(data);
}
} catch (IOException e) {
status = GitHub.createWrappedStatus(e);
}
return status;
}
}