blob: fbd778e0e0457b919c5c1f3aee8975ed3f316e37 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2017 IBM Corporation and others.
* 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.dltk.ui.tests;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.zip.ZipFile;
import org.eclipse.core.resources.IContainer;
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.IResource;
import org.eclipse.core.resources.IWorkspace;
import org.eclipse.core.resources.IWorkspaceDescription;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.dltk.core.DLTKCore;
import org.eclipse.dltk.core.IBuildpathEntry;
import org.eclipse.dltk.core.IModelElement;
import org.eclipse.dltk.core.IProjectFragment;
import org.eclipse.dltk.core.IScriptProject;
import org.eclipse.dltk.core.ModelException;
import org.eclipse.dltk.core.tests.model.ModelTestsPlugin;
import org.eclipse.dltk.internal.core.BuildpathEntry;
import org.eclipse.dltk.internal.ui.util.CoreUtility;
import org.eclipse.dltk.ui.DLTKUIPlugin;
import org.eclipse.ui.dialogs.IOverwriteQuery;
import org.eclipse.ui.wizards.datatransfer.ImportOperation;
import org.eclipse.ui.wizards.datatransfer.ZipFileStructureProvider;
/**
* Helper methods to set up a IScriptProject.
*/
public class ScriptProjectHelper {
private static final int MAX_RETRY= 5;
public static final IPath JUNIT_SRC_381= new Path("testresources/junit381-noUI-src.zip");
public static final String JUNIT_SRC_ENCODING= "ISO-8859-1";
public static final IPath MYLIB= new Path("testresources/mylib.zip");
private static class ImportOverwriteQuery implements IOverwriteQuery {
@Override
public String queryOverwrite(String file) {
return ALL;
}
}
/**
* Adds a source container to a IScriptProject.
* @param jproject The parent project
* @param containerName The name of the new source container
* @param inclusionFilters Inclusion filters to set
* @param exclusionFilters Exclusion filters to set
* @return The handle to the new source container
* @throws CoreException Creation failed
*/
public static IProjectFragment addSourceContainer(IScriptProject jproject, String containerName, IPath[] inclusionFilters, IPath[] exclusionFilters) throws CoreException {
IProject project= jproject.getProject();
IContainer container= null;
if (containerName == null || containerName.length() == 0) {
container= project;
} else {
IFolder folder= project.getFolder(containerName);
if (!folder.exists()) {
CoreUtility.createFolder(folder, false, true, null);
}
container= folder;
}
IProjectFragment root= jproject.getProjectFragment(container);
IBuildpathEntry bpe= DLTKCore.newSourceEntry(root.getPath(),
inclusionFilters, exclusionFilters, BuildpathEntry.NO_EXTRA_ATTRIBUTES);
addToBuildpath(jproject, bpe);
return root;
}
public static void addToBuildpath(IScriptProject jproject, IBuildpathEntry cpe) throws ModelException {
IBuildpathEntry[] oldEntries= jproject.getRawBuildpath();
for (int i= 0; i < oldEntries.length; i++) {
if (oldEntries[i].equals(cpe)) {
return;
}
}
int nEntries= oldEntries.length;
IBuildpathEntry[] newEntries= new IBuildpathEntry[nEntries + 1];
System.arraycopy(oldEntries, 0, newEntries, 0, nEntries);
newEntries[nEntries]= cpe;
jproject.setRawBuildpath(newEntries, null);
}
/**
* Adds a source container to a IScriptProject.
* @param jproject The parent project
* @param containerName The name of the new source container
* @return The handle to the new source container
* @throws CoreException Creation failed
*/
public static IProjectFragment addSourceContainer(IScriptProject jproject, String containerName) throws CoreException {
return addSourceContainer(jproject, containerName, new Path[0]);
}
/**
* Adds a source container to a IScriptProject.
* @param jproject The parent project
* @param containerName The name of the new source container
* @param exclusionFilters Exclusion filters to set
* @return The handle to the new source container
* @throws CoreException Creation failed
*/
public static IProjectFragment addSourceContainer(IScriptProject jproject, String containerName, IPath[] exclusionFilters) throws CoreException {
return addSourceContainer(jproject, containerName, new Path[0], exclusionFilters);
}
/**
* Creates a IScriptProject.
* @param projectName The name of the project
* @param binFolderName Name of the output folder
* @return Returns the script project handle
* @throws CoreException Project creation failed
*/
public static IScriptProject createScriptProject(String projectName) throws CoreException {
IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
IProject project= root.getProject(projectName);
IProjectDescription description = ResourcesPlugin.getWorkspace().newProjectDescription(project.getName());
description.setNatureIds(new String[] { ModelTestsPlugin.TEST_NATURE });
if (!project.exists()) {
project.create(description, null);
} else {
project.refreshLocal(IResource.DEPTH_INFINITE, null);
}
if (!project.isOpen()) {
project.open(null);
}
IScriptProject jproject= DLTKCore.create(project);
jproject.setRawBuildpath(new IBuildpathEntry[0], null);
return jproject;
}
public static boolean setAutoBuilding(boolean state) throws CoreException {
// disable auto build
IWorkspace workspace= ResourcesPlugin.getWorkspace();
IWorkspaceDescription desc= workspace.getDescription();
boolean result= desc.isAutoBuilding();
desc.setAutoBuilding(state);
workspace.setDescription(desc);
return result;
}
public static void delete(final IModelElement elem) throws CoreException {
IWorkspaceRunnable runnable= monitor -> {
//performDummySearch();
if (elem instanceof IScriptProject) {
IScriptProject jproject= (IScriptProject) elem;
jproject.setRawBuildpath(new IBuildpathEntry[0], null);
}
for (int i= 0; i < MAX_RETRY; i++) {
try {
elem.getResource().delete(true, null);
i= MAX_RETRY;
} catch (CoreException e) {
if (i == MAX_RETRY - 1) {
DLTKUIPlugin.log(e);
throw e;
}
try {
Thread.sleep(1000); // sleep a second
} catch (InterruptedException e1) {
}
}
}
};
ResourcesPlugin.getWorkspace().run(runnable, null);
}
/**
* Adds a library entry with source attachment to a IScriptProject.
* @param jproject The parent project
* @param path The path of the library to add
* @param sourceAttachPath The source attachment path
* @param sourceAttachRoot The source attachment root path
* @return The handle of the created root
* @throws ScriptModelException
*/
public static IProjectFragment addLibrary(IScriptProject jproject, IPath path) throws ModelException {
IBuildpathEntry cpe= DLTKCore.newLibraryEntry(path);
addToBuildpath(jproject, cpe);
return jproject.getProjectFragment(path.toString());
}
public static IProjectFragment addSourceContainerWithImport(IScriptProject jproject, String containerName, File zipFile, String containerEncoding) throws InvocationTargetException, CoreException, IOException {
return addSourceContainerWithImport(jproject, containerName, zipFile, containerEncoding, new Path[0]);
}
public static IProjectFragment addSourceContainerWithImport(IScriptProject jproject, String containerName, File zipFile, String containerEncoding, IPath[] exclusionFilters) throws InvocationTargetException, CoreException, IOException {
ZipFile file= new ZipFile(zipFile);
try {
IProjectFragment root= addSourceContainer(jproject, containerName, exclusionFilters);
((IContainer) root.getCorrespondingResource()).setDefaultCharset(containerEncoding, null);
importFilesFromZip(file, root.getPath(), null);
return root;
} finally {
if (file != null) {
file.close();
}
}
}
private static void importFilesFromZip(ZipFile srcZipFile, IPath destPath, IProgressMonitor monitor) throws InvocationTargetException {
ZipFileStructureProvider structureProvider= new ZipFileStructureProvider(srcZipFile);
try {
ImportOperation op= new ImportOperation(destPath, structureProvider.getRoot(), structureProvider, new ImportOverwriteQuery());
op.run(monitor);
} catch (InterruptedException e) {
// should not happen
}
}
public static IProjectFragment addLibraryWithImport(IScriptProject jproject, IPath archivePath) throws IOException, CoreException {
IProject project= jproject.getProject();
IFile newFile= project.getFile(archivePath.lastSegment());
try (InputStream inputStream= new FileInputStream(archivePath.toFile())){
newFile.create(inputStream, true, null);
}
return addLibrary(jproject, newFile.getFullPath());
}
}