/*******************************************************************************
* Copyright (C) 2011, Robin Rosenberg
* Copyright (C) 2011, Chris Aniszczyk <caniszczyk@gmail.com>
* Copyright (C) 2015, IBM Corporation (Dani Megert <daniel_megert@ch.ibm.com>)
*
* 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
*******************************************************************************/
package org.eclipse.egit.ui.internal.variables;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.variables.IDynamicVariable;
import org.eclipse.core.variables.IDynamicVariableResolver;
import org.eclipse.egit.core.AdapterUtils;
import org.eclipse.egit.core.project.RepositoryMapping;
import org.eclipse.egit.ui.Activator;
import org.eclipse.egit.ui.internal.UIText;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jgit.annotations.NonNull;
import org.eclipse.osgi.util.NLS;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IWorkbench;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchPartSite;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PlatformUI;
/**
* Resolves Git related information so launchers can use them
*/
public class GitVariableResolver implements IDynamicVariableResolver {
private static final String GIT_REPO_RELATIVE_PATH = "git_repo_relative_path"; //$NON-NLS-1$
private static final String GIT_DIR = "git_dir"; //$NON-NLS-1$
private static final String GIT_WORK_TREE = "git_work_tree"; //$NON-NLS-1$
private static final String GIT_BRANCH = "git_branch"; //$NON-NLS-1$
@Override
public String resolveValue(IDynamicVariable variable, String argument)
throws CoreException {
if (variable.getName().equals(GIT_DIR))
return getGitDir(argument);
if (variable.getName().equals(GIT_REPO_RELATIVE_PATH))
return getGitRepoRelativePath(argument);
if (variable.getName().equals(GIT_WORK_TREE))
return getGitWorkTree(argument);
if (variable.getName().equals(GIT_BRANCH))
return getGitBranch(argument);
throw new CoreException(new Status(IStatus.ERROR, Activator
.getPluginId(), UIText.GitVariableResolver_InternalError));
}
private String getGitRepoRelativePath(String argument) throws CoreException {
IResource res = getResource(argument);
RepositoryMapping mapping = RepositoryMapping.getMapping(res);
if (mapping != null) {
String repoRelativePath = mapping.getRepoRelativePath(res);
if (repoRelativePath == null) {
return ""; //$NON-NLS-1$
}
if (repoRelativePath.equals("")) //$NON-NLS-1$
return "."; //$NON-NLS-1$
else
return repoRelativePath;
}
return ""; //$NON-NLS-1$
}
private String getGitDir(String argument) throws CoreException {
IResource res = getResource(argument);
RepositoryMapping mapping = RepositoryMapping.getMapping(res);
if (mapping != null)
return mapping.getRepository().getDirectory().getAbsolutePath();
else
return ""; //$NON-NLS-1$
}
@NonNull
private String getGitWorkTree(String argument) throws CoreException {
IResource res = getResource(argument);
RepositoryMapping mapping = RepositoryMapping.getMapping(res);
if (mapping != null) {
File workTree = mapping.getWorkTree();
if (workTree != null) {
return workTree.getAbsolutePath();
}
}
return ""; //$NON-NLS-1$
}
private String getGitBranch(String argument) throws CoreException {
IResource res = getResource(argument);
RepositoryMapping mapping = RepositoryMapping.getMapping(res);
if (mapping != null)
try {
return mapping.getRepository().getBranch();
} catch (IOException e) {
throw new CoreException(new Status(IStatus.ERROR, Activator.getPluginId(), e.getMessage()));
}
else
return ""; //$NON-NLS-1$
}
/**
* Returns the currently selected or specified resource
*
* @param argument
* named resource or null for selected
*
* @return the currently selected <code>IResource</code>.
* @throws CoreException
* thrown if no resource is selected
*/
@NonNull
private IResource getResource(String argument) throws CoreException {
IResource res;
if (argument == null) {
res = getResource();
if (res == null)
throw new CoreException(new Status(IStatus.ERROR, Activator
.getPluginId(), UIText.GitVariableResolver_NoSelectedResource));
} else {
res = ResourcesPlugin.getWorkspace().getRoot().findMember(argument);
if (res == null || !res.exists()) {
throw new CoreException(
new Status(
IStatus.ERROR,
Activator.getPluginId(),
NLS.bind(
UIText.GitVariableResolver_VariableReferencesNonExistentResource,
argument)));
}
}
return res;
}
private IResource getResource() {
Display display = PlatformUI.getWorkbench().getDisplay();
if(display.getThread().equals(Thread.currentThread()))
return getSelectedResource();
else {
final IResource[] resource = new IResource[1];
display.syncExec(new Runnable() {
@Override
public void run() {
resource[0] = getSelectedResource();
}
});
return resource[0];
}
}
private IResource getSelectedResource() {
IResource resource = null;
IWorkbench workbench = PlatformUI.getWorkbench();
IWorkbenchWindow window = null;
if (workbench != null)
window = workbench.getActiveWorkbenchWindow();
if(window != null) {
IWorkbenchPage page = window.getActivePage();
if(page != null) {
IWorkbenchPart part = page.getActivePart();
if(part instanceof IEditorPart) {
IEditorPart epart = (IEditorPart) part;
resource = AdapterUtils
.adaptToAnyResource(epart.getEditorInput());
}
else if(part != null) {
IWorkbenchPartSite site = part.getSite();
if(site != null) {
ISelectionProvider provider = site.getSelectionProvider();
if(provider != null) {
ISelection selection = provider.getSelection();
if(selection instanceof IStructuredSelection) {
IStructuredSelection ss = (IStructuredSelection) selection;
if(!ss.isEmpty()) {
Iterator iterator = ss.iterator();
while (iterator.hasNext() && resource == null) {
Object next = iterator.next();
resource = AdapterUtils
.adaptToAnyResource(next);
}
}
}
}
}
}
}
}
return resource;
}
}