/*******************************************************************************
* Copyright (c) 2011 Red Hat, Inc.
* Distributed under license by Red Hat, Inc. All rights reserved.
* This program is 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:
* Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.openshift.express.internal.ui.wizard.application.importoperation;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URISyntaxException;
import java.util.List;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.osgi.util.NLS;
import org.jboss.ide.eclipse.as.core.util.FileUtil;
import org.jboss.tools.openshift.common.core.utils.FileUtils;
import org.jboss.tools.openshift.egit.core.EGitUtils;
import org.jboss.tools.openshift.express.internal.core.connection.ExpressConnection;
import org.jboss.tools.openshift.express.internal.core.marker.IOpenShiftMarker;
import org.jboss.tools.openshift.express.internal.core.util.ResourceUtils;
import com.openshift.client.IApplication;
import com.openshift.client.OpenShiftException;
/**
* Strategy that enables the given git shared project to be used on the chosen
* OpenShift application.
*
* @author André Dietisheim <adietish@redhat.com>
*/
public class MergeIntoUnsharedProject extends AbstractImportApplicationOperation {
public MergeIntoUnsharedProject(String projectName, IApplication application, String remoteName,
List<IOpenShiftMarker> markers, ExpressConnection connection) {
super(projectName, application, remoteName, markers, connection);
}
/**
* Enables the user chosen project to be used on the chosen OpenShift
* application. *
* <ul>
* <li>clones the application git repository</li>
* <li>copies the configuration files to the user project (in the workspace)
* </li>
* <li>shares the given project with git</li>
* </ul>
*
* @param monitor
* the monitor to report progress to
* @return
* @throws URISyntaxException
* The OpenShift application repository could not be cloned,
* because the uri it is located at is not a valid git uri
* @throws OpenShiftException
*
* @throws InvocationTargetException
* The OpenShift application repository could not be cloned, the
* clone operation failed.
* @throws InterruptedException
* The OpenShift application repository could not be cloned, the
* clone operation was interrupted.
* @throws IOException
* The configuration files could not be copied from the git
* clone to the user project
* @throws CoreException
* The user project could not be shared with the git
*
* @see #cloneRepository
* @see #copyOpenshiftConfiguration
* @see #shareProject
* @see #createServerAdapterIfRequired
*/
@Override
public IProject execute(IProgressMonitor monitor)
throws OpenShiftException, InvocationTargetException, InterruptedException, IOException, CoreException,
URISyntaxException {
// File repositoryFile =
// model.cloneRepository(monitor);
// model.importProject(repositoryFile, monitor);
// Repository repository =
// model.shareProject(monitor);
// model.mergeWithApplicationRepository(repository,
// monitor);
IProject project = getProject();
copyOpenshiftConfigurations(getApplication(), getRemoteName(), project, monitor);
setupGitIgnore(project, monitor);
setupOpenShiftMavenProfile(getApplication(), project, monitor);
addSettingsFile(project, monitor);
setupMarkers(project, monitor);
shareProject(project, monitor);
addRemote(getRemoteName(), getApplication().getGitUrl(), project);
return project;
}
private void shareProject(IProject project, IProgressMonitor monitor) throws CoreException {
monitor.subTask(NLS.bind("Sharing project {0}...", project.getName()));
EGitUtils.share(project, monitor);
}
/**
* Copies the openshift configuration from the given source folder to the
* given project. Copies
* <ul>
* <li>.git</li>
* <li>.openshift</li>
* <li>deployments</li>
* <li>pom.xml</li>
* </ul>
* to the project in the workspace
*
* @param sourceFolder
* the source to copy the openshift config from
* @param project
* the project to copy the configuration to.
* @param monitor
* the monitor to report progress to
* @throws IOException
* @throws URISyntaxException
* @throws InterruptedException
* @throws InvocationTargetException
* @throws OpenShiftException
* @throws CoreException
*/
private void copyOpenshiftConfigurations(IApplication application, String remoteName, IProject project,
IProgressMonitor monitor)
throws IOException, OpenShiftException, InvocationTargetException, InterruptedException,
URISyntaxException, CoreException {
Assert.isLegal(project != null);
monitor.subTask(NLS.bind("Copying openshift configuration to project {0}...", project.getName()));
File tmpFolder = FileUtils.getRandomTmpFolder();
cloneRepository(getApplication(), getRemoteName(), tmpFolder, false, monitor);
ResourceUtils.copy(tmpFolder, new String[] {
".git",
".openshift",
"deployments",
"pom.xml" }, project, monitor);
FileUtil.safeDelete(tmpFolder);
}
// private void mergeWithApplicationRepository(Repository repository,
// IApplication application,
// IProgressMonitor monitor)
// throws MalformedURLException, URISyntaxException, IOException,
// OpenShiftException, CoreException,
// InvocationTargetException {
// URIish uri = new URIish(application.getGitUri());
// EGitUtils.addRemoteTo("openshift", uri, repository);
// EGitUtils.mergeWithRemote(uri, "refs/remotes/openshift/HEAD", repository,
// monitor);
// }
}