blob: bfbba81e74843e65e1340b4ce74c887943b89c14 [file] [log] [blame]
/*******************************************************************************
* Copyright (C) 2007, Robin Rosenberg <robin.rosenberg@dewire.com>
* Copyright (C) 2006, Shawn O. Pearce <spearce@spearce.org>
* Copyright (C) 2012, Robin Stocker <robin@nibor.org>
* Copyright (C) 2013, Matthias Sohn <matthias.sohn@sap.com>
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*******************************************************************************/
package org.eclipse.egit.core.test;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URL;
import org.eclipse.core.filesystem.URIUtil;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jgit.util.FileUtils;
import org.osgi.framework.Bundle;
public class TestProject {
public IProject project;
public IJavaProject javaProject;
private IPackageFragmentRoot sourceFolder;
private String location;
private TestUtils testUtils = new TestUtils();
private final File workspaceSupplement;
private IFolder binFolder;
/**
* @throws CoreException
* If project already exists
*/
public TestProject() throws CoreException {
this(false);
}
public TestProject(boolean remove) throws CoreException {
this(remove, "Project-1");
}
/**
* @param remove
* should project be removed if already exists
* @param path
* @throws CoreException
*/
public TestProject(final boolean remove, String path) throws CoreException {
this(remove, path, true, null);
}
/**
* @param remove
* should project be removed if already exists
* @param path
* @param insidews set false to create in temp
* @param workspaceSupplement
* @throws CoreException
*/
public TestProject(final boolean remove, String path, boolean insidews, File workspaceSupplement) throws CoreException {
this.workspaceSupplement = workspaceSupplement;
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProjectDescription description = createDescription(path, insidews,
root);
project = root.getProject(description.getName());
if (remove) {
TestUtils.deleteProject(project);
}
IPath locationBefore = null;
URI locationURI = description.getLocationURI();
if (locationURI != null) {
locationBefore = URIUtil.toPath(locationURI);
}
if (locationBefore == null) {
locationBefore = root.getRawLocation().append(path);
}
location = locationBefore.toOSString();
project.create(description, null);
project.open(null);
javaProject = JavaCore.create(project);
binFolder = createBinFolder();
setJavaNature();
javaProject.setRawClasspath(new IClasspathEntry[0], null);
createOutputFolder(binFolder);
addSystemLibraries();
}
public void setBinFolderDerived() throws CoreException {
binFolder.setDerived(true, null);
}
public File getWorkspaceSupplement() {
return workspaceSupplement;
}
private IProjectDescription createDescription(String path,
boolean insidews, IWorkspaceRoot root) {
Path ppath = new Path(path);
String projectName = ppath.lastSegment();
URI locationURI;
URI top;
if (insidews) {
top = root.getRawLocationURI();
} else {
top = URIUtil.toURI(workspaceSupplement.getAbsolutePath());
}
if (!insidews || !ppath.lastSegment().equals(path)) {
locationURI = URIUtil.toURI(URIUtil.toPath(top).append(path));
} else
locationURI = null;
IProjectDescription description = ResourcesPlugin.getWorkspace()
.newProjectDescription(projectName);
description.setName(projectName);
description.setLocationURI(locationURI);
return description;
}
public IProject getProject() {
return project;
}
public IJavaProject getJavaProject() {
return javaProject;
}
public void addJar(String plugin, String jar) throws JavaModelException {
Path result = findFileInPlugin(plugin, jar);
IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length + 1];
System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);
newEntries[oldEntries.length] = JavaCore.newLibraryEntry(result, null,
null);
javaProject.setRawClasspath(newEntries, null);
}
public IPackageFragment createPackage(String name) throws CoreException {
if (sourceFolder == null)
sourceFolder = createSourceFolder();
return sourceFolder.createPackageFragment(name, false, null);
}
public IType createType(IPackageFragment pack, String cuName, String source)
throws JavaModelException {
StringBuilder buf = new StringBuilder();
buf.append("package " + pack.getElementName() + ";\n");
buf.append("\n");
buf.append(source);
ICompilationUnit cu = pack.createCompilationUnit(cuName,
buf.toString(), false, null);
return cu.getTypes()[0];
}
public IFile createFile(String name, byte[] content) throws Exception {
IFile file = project.getFile(name);
InputStream inputStream = new ByteArrayInputStream(content);
file.create(inputStream, true, null);
return file;
}
public IFolder createFolder(String name) throws Exception {
IFolder folder = project.getFolder(name);
folder.create(true, true, null);
return folder;
}
public IFolder createFolderWithKeep(String name) throws Exception {
IFolder folder = createFolder(name);
IFile keep = project.getFile(name + "/keep");
keep.create(new ByteArrayInputStream(new byte[] {0}), true, null);
return folder;
}
public void dispose() throws CoreException, IOException {
waitForIndexer();
try {
if (project.exists()) {
TestUtils.deleteProject(project);
} else {
File f = new File(location);
if (f.exists()) {
FileUtils.delete(f, FileUtils.RECURSIVE | FileUtils.RETRY);
}
}
} catch (CoreException | IOException e) {
System.err.println(e.toString());
TestUtils.listDirectory(new File(location), true);
throw e;
}
}
private IFolder createBinFolder() throws CoreException {
IFolder folder = project.getFolder("bin");
folder.create(false, true, null);
return folder;
}
private void setJavaNature() throws CoreException {
IProjectDescription description = project.getDescription();
description.setNatureIds(new String[] { JavaCore.NATURE_ID });
project.setDescription(description, null);
}
private void createOutputFolder(IFolder folder)
throws JavaModelException {
IPath outputLocation = folder.getFullPath();
javaProject.setOutputLocation(outputLocation, null);
}
public IPackageFragmentRoot createSourceFolder() throws CoreException {
IFolder folder = project.getFolder("src");
folder.create(false, true, null);
IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(folder);
IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length + 1];
System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);
newEntries[oldEntries.length] = JavaCore.newSourceEntry(root.getPath());
javaProject.setRawClasspath(newEntries, null);
return root;
}
private void addSystemLibraries() throws JavaModelException {
IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length + 1];
System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);
newEntries[oldEntries.length] = JavaRuntime
.getDefaultJREContainerEntry();
javaProject.setRawClasspath(newEntries, null);
}
private Path findFileInPlugin(String plugin, String file) {
Bundle bundle = Platform.getBundle(plugin);
URL resource = bundle.getResource(file);
return new Path(resource.getPath());
}
public void waitForIndexer() {
// new SearchEngine().searchAllTypeNames(ResourcesPlugin.getWorkspace(),
// null, null, IJavaSearchConstants.EXACT_MATCH,
// IJavaSearchConstants.CASE_SENSITIVE,
// IJavaSearchConstants.CLASS, SearchEngine
// .createJavaSearchScope(new IJavaElement[0]),
// new ITypeNameRequestor() {
// public void acceptClass(char[] packageName,
// char[] simpleTypeName, char[][] enclosingTypeNames,
// String path) {
// }
// public void acceptInterface(char[] packageName,
// char[] simpleTypeName, char[][] enclosingTypeNames,
// String path) {
// }
// }, IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, null);
}
public String getFileContent(String filepath) throws Exception {
IFile file = project.getFile(filepath);
InputStream stream = file.getContents();
return testUtils.slurpAndClose(stream);
}
/**
* @return Returns the sourceFolder.
*/
public IPackageFragmentRoot getSourceFolder() {
return sourceFolder;
}
/**
* @param sourceFolder The sourceFolder to set.
*/
public void setSourceFolder(IPackageFragmentRoot sourceFolder) {
this.sourceFolder = sourceFolder;
}
public String getLocation() {
return location;
}
}