blob: 079e04fb2825fbbf3e02dc9b163dd78cc590ab16 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 Obeo.
* 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:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.docs.intent.client.ui.test.util;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Collection;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import junit.framework.AssertionFailedError;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.ui.IViewPart;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.PlatformUI;
/**
* Provide utilities to ease workspace manipulation.
*
* @author <a href="mailto:william.piers@obeo.fr">William Piers</a>
*/
public final class WorkspaceUtils {
/**
* Constant for slashes.
*/
private static final String SLASH = "/";
/**
* Prevents instantiation.
*/
private WorkspaceUtils() {
}
/**
* Creates and opens a project using the given name.
*
* @param projectName
* the project name
* @param monitor
* the progress monitor
* @return the newly created project or the existing one if present
* @throws CoreException
* if there is an issue creating the project
*/
public static IProject createProject(final String projectName, IProgressMonitor monitor)
throws CoreException {
return createProject(projectName, monitor, true);
}
/**
* Creates a project using the given name.
*
* @param projectName
* the project name
* @param monitor
* the progress monitor
* @param createaAndOpenProject
* indicates whether project should be create and opened
* @return the newly created project or the existing one if present
* @throws CoreException
* if there is an issue creating the project
*/
public static IProject createProject(String projectName, IProgressMonitor monitor,
boolean createaAndOpenProject) throws CoreException {
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
if (!project.exists() && createaAndOpenProject) {
project.create(monitor);
}
if (!project.isOpen() && createaAndOpenProject) {
project.open(monitor);
}
return project;
}
/**
* Unzip all the projects contained by the zip.
*
* @param bundleName
* the bundle name
* @param zipLocation
* the zip location inside of the bundle
* @param monitor
* the progress monitor
* @return
* @throws IOException
* if there is an issue copying a file from the zip
* @throws CoreException
* if there is an issue creating one of the projects
* @return all the unziped projects
*/
public static Collection<IProject> unzipAllProjects(String bundleName, String zipLocation,
IProgressMonitor monitor) throws IOException, CoreException {
final URL interpreterZipUrl = FileLocator.find(Platform.getBundle(bundleName), new Path(zipLocation),
null);
InputStream zipURLStream = interpreterZipUrl.openStream();
try {
final ZipInputStream zipFileStream = new ZipInputStream(zipURLStream);
try {
ZipEntry zipEntry = zipFileStream.getNextEntry();
Set<IProjectDescription> projectsToCreate = Sets.newLinkedHashSet();
while (zipEntry != null) {
String projectName = zipEntry.getName().split(SLASH)[0];
IProjectDescription projectDescription = ResourcesPlugin.getWorkspace()
.newProjectDescription(projectName);
projectDescription.setLocation(new Path(ResourcesPlugin.getWorkspace().getRoot()
.getLocation()
+ SLASH + projectName + "/.project"));
projectsToCreate.add(projectDescription);
createProject(projectName, monitor, false);
final File file = new File(projectDescription.getLocation().toString(), zipEntry
.getName().replaceFirst(projectName + SLASH, "")); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
if (!zipEntry.isDirectory()) {
/*
* Copy files (and make sure parent directory exist)
*/
final File parentFile = file.getParentFile();
if (null != parentFile && !parentFile.exists()) {
parentFile.mkdirs();
}
OutputStream os = null;
try {
os = new FileOutputStream(file);
final int bufferSize = 102400;
final byte[] buffer = new byte[bufferSize];
while (true) {
final int len = zipFileStream.read(buffer);
if (zipFileStream.available() == 0) {
break;
}
os.write(buffer, 0, len);
}
} finally {
if (null != os) {
os.close();
}
}
}
zipFileStream.closeEntry();
zipEntry = zipFileStream.getNextEntry();
}
ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, monitor);
Collection<IProject> projects = Sets.newLinkedHashSet();
for (IProjectDescription projectToCreate : projectsToCreate) {
createProject(projectToCreate, new NullProgressMonitor());
}
return projects;
} finally {
zipFileStream.close();
}
} finally {
zipURLStream.close();
}
}
/**
* Creates and opens a project using the given project description.
*
* @param newProjectDescription
* the project to create description
* @param monitor
* the progress monitor
* @return the newly created project or the existing one if present
* @throws CoreException
* if there is an issue creating the project
*/
private static IProject createProject(IProjectDescription newProjectDescription, IProgressMonitor monitor)
throws CoreException {
IProject project = ResourcesPlugin.getWorkspace().getRoot()
.getProject(newProjectDescription.getName());
if (!project.exists()) {
project.create(newProjectDescription, monitor);
}
if (!project.isOpen()) {
project.open(monitor);
}
return project;
}
/**
* Imports a java project in the test workspace.
*
* @param zipLocation
* the location of the archive containing the project to import (e.g.
* 'data/unit/java/java.example01.zip')
*/
public static void importJavaProject(String zipLocation) {
try {
// Deactivate the auto build to avoid problem of test before build is
// finish.
ResourcesPlugin.getWorkspace().getDescription().setAutoBuilding(false);
unzipAllProjects("org.eclipse.mylyn.docs.intent.client.ui.test", zipLocation,
new NullProgressMonitor());
// Launch a manual build and wait the end of the workspace build
ResourcesPlugin.getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD,
new NullProgressMonitor());
ResourcesPlugin.getWorkspace().getDescription().setAutoBuilding(true);
} catch (IOException e) {
AssertionFailedError assertionFailedError = new AssertionFailedError(
"Could not import java project in test workspace");
assertionFailedError.setStackTrace(e.getStackTrace());
throw assertionFailedError;
} catch (CoreException e) {
AssertionFailedError assertionFailedError = new AssertionFailedError(
"Could not import java project in test workspace");
assertionFailedError.setStackTrace(e.getStackTrace());
throw assertionFailedError;
}
}
/**
* Deletes every project in the workspace.
*/
public static void cleanWorkspace() {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().closeAllEditors(false);
for (final IProject proj : Lists.newArrayList(ResourcesPlugin.getWorkspace().getRoot().getProjects())) {
try {
proj.delete(true, new NullProgressMonitor());
System.out.println("deleting " + proj);
} catch (CoreException e) {
// Nothing we can do
e.printStackTrace();
}
}
}
/**
* Close the welcomePage.
*/
public static void closeWelcomePage() {
IWorkbenchPart activePart = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.getActivePart();
if (activePart != null && "Welcome".equals(activePart.getTitle()) && activePart instanceof IViewPart) {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.hideView((IViewPart)activePart);
}
}
}