org.eclipse.mylyn.internal.gerrit.ui.GerritUrlHandler.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.mylyn.internal.gerrit.ui.GerritUrlHandler.java

Source

/*******************************************************************************
 * 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;
    }
}