blob: 6d660efc0b0fca37e850b34ddadc717f2e9d9265 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 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.internal.gerrit.ui;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.eclipse.mylyn.commons.workbench.EditorHandle;
import org.eclipse.mylyn.commons.workbench.browser.AbstractUrlHandler;
import org.eclipse.mylyn.internal.gerrit.core.GerritConnector;
import org.eclipse.mylyn.internal.gerrit.ui.editor.GerritTaskEditorPage;
import org.eclipse.mylyn.reviews.ui.spi.editor.ReviewSetSection;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.ui.TasksUi;
import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.forms.editor.IFormPage;
/**
* @author Steffen Pingel
* @author Miles Parker
*/
public class GerritUrlHandler extends AbstractUrlHandler {
// http://git.eclipse.org/r/123 or https://git.eclipse.org/r/#/c/123/
private static final Pattern URL_PATTERN = Pattern.compile("/?(#/c)?/(\\d+)"); //$NON-NLS-1$
public GerritUrlHandler() {
// ignore
}
@Override
public EditorHandle openUrl(IWorkbenchPage page, String url, int customFlags) {
for (TaskRepository repository : TasksUi.getRepositoryManager().getRepositories(GerritConnector.CONNECTOR_KIND)) {
String taskId = getTaskId(repository, url);
if (taskId != null) {
EditorHandle editorHandle = TasksUiUtil.openTaskWithResult(repository, taskId);
int patchSetNumber = getPatchSetNumber(repository, url, taskId);
if (patchSetNumber > 0) {
revealPatchSet(editorHandle, patchSetNumber);
}
return editorHandle;
}
}
return null;
}
private void revealPatchSet(EditorHandle editorHandle, Integer patchSetNumber) {
IWorkbenchPart part = editorHandle.getPart();
if (part instanceof TaskEditor) {
TaskEditor taskEditor = (TaskEditor) part;
IFormPage activePage = taskEditor.setActivePage(GerritTaskEditorPage.class.getName());
if (activePage instanceof GerritTaskEditorPage) {
GerritTaskEditorPage gerritPage = (GerritTaskEditorPage) activePage;
ReviewSetSection section = (ReviewSetSection) gerritPage.getPart(ReviewSetSection.class.getName());
if (section != null && !section.getControl().isDisposed()) {
section.revealPatchSet(patchSetNumber);
}
}
}
}
public String getTaskId(TaskRepository repository, String url) {
if (url.startsWith(repository.getRepositoryUrl())) {
String path = "/" + url.substring(repository.getRepositoryUrl().length()); //$NON-NLS-1$
Matcher matcher = URL_PATTERN.matcher(path);
if (matcher.find()) {
return matcher.group(2);
}
}
return null;
}
/**
* Returns the patch set number as encoded in a Gerrit URL. For example,
* "http://review.mylyn.org/#/c/4698/5/foo/bar", "4698" -> 5. Returns -1 if the patch set number isn't specified or
* is not an integer.
*/
int getPatchSetNumber(TaskRepository repository, String url, String taskId) {
String taskUrl = TasksUi.getRepositoryConnector(GerritConnector.CONNECTOR_KIND).getTaskUrl(repository.getUrl(),
taskId);
String urlQualifiers = StringUtils.remove(url, taskUrl);
String[] fragments = StringUtils.split(urlQualifiers, "/"); //$NON-NLS-1$
if (fragments.length > 0) {
String patchSetFragment = fragments[0];
try {
return Integer.valueOf(patchSetFragment);
} catch (NumberFormatException e) {
//ignore, the patch fragment simply can't be parsed
}
}
return -1;
}
@Override
public int getPriority() {
return 200;
}
}