blob: 5e954c66597e14ca20863a151ef3df68e8a87b12 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2012 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
*
* Contributors:
* IBM Corporation - initial API and implementation
*
*******************************************************************************/
package org.eclipse.wst.jsdt.core.tests.utils;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.WeakHashMap;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
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.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.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.wst.jsdt.core.tests.internal.Activator;
public class BundleResourceUtil {
static WeakHashMap exists = new WeakHashMap();
public static void _copyBundleEntriesIntoWorkspace(final String rootEntry, final String fullTargetPath)
throws Exception {
Enumeration entries = Activator.getDefault().getBundle().getEntryPaths(rootEntry);
while(entries != null && entries.hasMoreElements()) {
String entryPath = entries.nextElement().toString();
String targetPath = new Path(fullTargetPath + "/" + entryPath.substring(rootEntry.length())).toString();
if(entryPath.endsWith("/")) {
IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(new Path(targetPath));
if(!folder.exists()) {
folder.create(true, true, new NullProgressMonitor());
}
_copyBundleEntriesIntoWorkspace(entryPath, targetPath);
} else {
_copyBundleEntryIntoWorkspace(entryPath, targetPath);
}
// System.out.println(entryPath + " -> " + targetPath);
}
}
public static IFile _copyBundleEntryIntoWorkspace(String entryname, String fullPath) throws Exception {
IFile file = null;
URL entry = Activator.getDefault().getBundle().getEntry(entryname);
if (entry != null) {
// MUST ensure parent folders all exist
IPath path = new Path(fullPath);
for (int j = path.segmentCount() - 2; j > 0; j--) {
IPath folderPath = path.removeLastSegments(j);
if (exists.get(folderPath) != null)
continue;
IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(folderPath);
if (!folder.exists()) {
folder.create(true, true, null);
}
exists.put(folderPath, Boolean.TRUE);
}
byte[] b = new byte[2048];
InputStream input = entry.openStream();
ByteArrayOutputStream output = new ByteArrayOutputStream();
int i = -1;
while((i = input.read(b)) > -1) {
output.write(b, 0, i);
}
file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
if(file != null) {
if(!file.exists()) {
file.create(new ByteArrayInputStream(output.toByteArray()), true, new NullProgressMonitor());
} else {
file.setContents(new ByteArrayInputStream(output.toByteArray()), true, false,
new NullProgressMonitor());
}
}
} else {
System.err.println("can't find " + entryname);
}
return file;
}
public static void copyBundleEntriesIntoWorkspace(final String rootEntry, final String fullTargetPath)
throws Exception {
IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
try {
_copyBundleEntriesIntoWorkspace(rootEntry, fullTargetPath);
} catch(Exception e) {
throw new CoreException(new Status(IStatus.ERROR,
Activator.getDefault().getBundle().getSymbolicName(), 0, null, e));
}
ResourcesPlugin.getWorkspace().checkpoint(true);
}
};
ResourcesPlugin.getWorkspace().run(runnable, new NullProgressMonitor());
}
public static IFile copyBundleEntryIntoWorkspace(final String entryname, final String fullPath) throws Exception {
final IFile file[] = new IFile[1];
IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
try {
file[0] = _copyBundleEntryIntoWorkspace(entryname, fullPath);
} catch(Exception e) {
throw new CoreException(new Status(IStatus.ERROR,
Activator.getDefault().getBundle().getSymbolicName(), 0, e.getMessage(), e));
}
ResourcesPlugin.getWorkspace().checkpoint(true);
}
};
ResourcesPlugin.getWorkspace().run(runnable, new NullProgressMonitor());
return file[0];
}
public static void copyBundleZippedEntriesIntoWorkspace(final String zipFileEntry, final IPath fullTargetPath)
throws CoreException {
IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
IFile file = null;
URL entry = Activator.getDefault().getBundle().getEntry(zipFileEntry);
if(entry != null) {
try {
byte[] b = new byte[2048];
ZipInputStream input = new ZipInputStream(entry.openStream());
ZipEntry nextEntry = input.getNextEntry();
while(nextEntry != null) {
IPath path = fullTargetPath.append(nextEntry.getName());
if(nextEntry.isDirectory()) {
IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(path);
if(!folder.exists()) {
folder.create(true, true, null);
}
} else {
IPath folderPath = path.removeLastSegments(1);
for(int i = folderPath.segmentCount(); i > 0; i--) {
IPath parentFolderPath = path.removeLastSegments(i);
if(parentFolderPath.segmentCount() > 1) {
IFolder folder = ResourcesPlugin.getWorkspace().getRoot().getFolder(
parentFolderPath);
if(!folder.exists()) {
folder.create(true, true, null);
}
}
}
file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
ByteArrayOutputStream output = new ByteArrayOutputStream();
int i = -1;
while((i = input.read(b)) > -1) {
output.write(b, 0, i);
}
if(!file.exists()) {
file.create(new ByteArrayInputStream(output.toByteArray()), true,
new NullProgressMonitor());
} else {
file.setContents(new ByteArrayInputStream(output.toByteArray()), true, false,
new NullProgressMonitor());
}
}
ResourcesPlugin.getWorkspace().checkpoint(true);
nextEntry = input.getNextEntry();
}
} catch(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch(CoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
System.err.println("can't find " + zipFileEntry);
}
ResourcesPlugin.getWorkspace().checkpoint(true);
}
};
ResourcesPlugin.getWorkspace().run(runnable, new NullProgressMonitor());
}
/**
* Creates a simple project.
*
* @param name
* -
* the name of the project
* @param location
* -
* the location of the project, or null if the default of
* "/name" within the workspace is to be used
* @param natureIds
* -
* an array of natures IDs to set on the project, null if none
* should be set
* @return
*/
public static IProject createSimpleProject(String name, IPath location, String[] natureIds) {
IProjectDescription description = ResourcesPlugin.getWorkspace().newProjectDescription(name);
if(location != null) {
description.setLocation(location);
}
if(natureIds != null) {
description.setNatureIds(natureIds);
}
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);
try {
project.create(description, new NullProgressMonitor());
project.open(new NullProgressMonitor());
} catch(CoreException e) {
e.printStackTrace();
}
return project;
}
}