/*
* Copyright 2011-2017 Amazon Technologies, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://aws.amazon.com/apache2.0
*
* This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
* OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and
* limitations under the License.
*/
package com.amazonaws.eclipse.core.egit.jobs;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.egit.core.op.ConnectProviderOperation;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.m2e.core.MavenPlugin;
import org.eclipse.m2e.core.internal.IMavenConstants;
import org.eclipse.m2e.core.project.IProjectConfigurationManager;
import org.eclipse.m2e.core.project.ResolverConfiguration;
import org.eclipse.ui.PlatformUI;
import com.amazonaws.eclipse.core.AwsToolkitCore;
/**
* A Job that imports a Git repository to the workbench. If it is Maven structured, import as a Maven project.
*/
@SuppressWarnings("restriction")
public class ImportProjectJob {
private final String projectName;
private final File destinationFile;
private final Repository repository;
public ImportProjectJob(String projectName, File destinationFile) {
this.projectName = projectName;
this.destinationFile = destinationFile;
this.repository = getTargetRepository();
}
public IFile execute(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
importAsGeneralProject(monitor);
IProject project = ResourcesPlugin.getWorkspace()
.getRoot().getProject(projectName);
if (pomFileExists(project)) {
convertToMavenProject(project);
return project.getFile(IMavenConstants.POM_FILE_NAME);
} else {
return null;
}
}
private void importAsGeneralProject(IProgressMonitor monitor)
throws InvocationTargetException {
final String[] projectName = new String[1];
final boolean[] defaultLocation = new boolean[1];
final String[] path = new String[1];
final File[] repoDir = new File[1];
// get the data from the page in the UI thread
PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
public void run() {
projectName[0] = ImportProjectJob.this.projectName;
defaultLocation[0] = true;
path[0] = repository.getWorkTree().getPath();
repoDir[0] = repository.getDirectory();
}
});
try {
IWorkspaceRunnable wsr = new IWorkspaceRunnable() {
public void run(IProgressMonitor actMonitor)
throws CoreException {
final IProjectDescription desc = ResourcesPlugin
.getWorkspace().newProjectDescription(
projectName[0]);
desc.setLocation(new Path(path[0]));
IProject prj = ResourcesPlugin.getWorkspace().getRoot()
.getProject(desc.getName());
prj.create(desc, actMonitor);
prj.open(actMonitor);
ConnectProviderOperation cpo = new ConnectProviderOperation(prj, repoDir[0]);
cpo.execute(new NullProgressMonitor());
ResourcesPlugin.getWorkspace().getRoot()
.refreshLocal(IResource.DEPTH_ONE, actMonitor);
}
};
ResourcesPlugin.getWorkspace().run(wsr, monitor);
} catch (CoreException e) {
throw new InvocationTargetException(e);
}
}
private Repository getTargetRepository() {
try {
return org.eclipse.egit.core.Activator
.getDefault()
.getRepositoryCache()
.lookupRepository(
new File(destinationFile, Constants.DOT_GIT));
} catch (IOException e) {
AwsToolkitCore.getDefault().reportException(
"Error looking up repository at "
+ destinationFile, e);
return null;
}
}
private boolean pomFileExists(IProject project) {
return project.getFile(IMavenConstants.POM_FILE_NAME).exists();
}
private void convertToMavenProject(final IProject project) throws InterruptedException {
Job job = new Job("Enable Maven nature.") {
protected IStatus run(IProgressMonitor monitor) {
try {
ResolverConfiguration configuration = new ResolverConfiguration();
configuration.setResolveWorkspaceProjects(true);
configuration.setSelectedProfiles(""); //$NON-NLS-1$
final boolean hasMavenNature = project
.hasNature(IMavenConstants.NATURE_ID);
IProjectConfigurationManager configurationManager = MavenPlugin
.getProjectConfigurationManager();
configurationManager.enableMavenNature(project,
configuration, monitor);
if (!hasMavenNature) {
configurationManager.updateProjectConfiguration(
project, monitor);
}
} catch (CoreException ex) {
AwsToolkitCore.getDefault().reportException(ex.getMessage(), ex);
}
return Status.OK_STATUS;
}
};
job.schedule();
job.join();
}
}