| /******************************************************************************* |
| * Copyright (c) 2007 Oracle. |
| * 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: |
| * Oracle - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jpt.core.tests.internal; |
| import java.io.File; |
| import java.io.IOException; |
| import java.net.URI; |
| import java.net.URL; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.Collections; |
| import java.util.List; |
| import junit.framework.Assert; |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.core.resources.IResource; |
| import org.eclipse.core.resources.IWorkspace; |
| import org.eclipse.core.resources.IWorkspaceRunnable; |
| import org.eclipse.core.resources.ResourcesPlugin; |
| import org.eclipse.core.runtime.AssertionFailedException; |
| 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.core.runtime.Platform; |
| import org.eclipse.core.runtime.Plugin; |
| /** |
| * Copied from org.eclipse.wst.common.tests |
| */ |
| public class ProjectUtility { |
| public static IProject[] getAllProjects() { |
| IProject[] projects = new IProject[0]; |
| try { |
| projects = ResourcesPlugin.getWorkspace().getRoot().getProjects(); |
| } catch (AssertionFailedException ex) { |
| // Catch Malformed tree exception that occurs from time to time... |
| } |
| return projects; |
| } |
| public static boolean projectExists(String projectName) { |
| return getProject(projectName) != null; |
| } |
| public static IProject verifyAndReturnProject(String projectName, boolean exists) { |
| IProject project = getProject(projectName); |
| if (exists) { |
| Assert.assertTrue("Project Does Not Exist:" + projectName, project.exists()); |
| } else { |
| Assert.assertTrue("Project Exists:" + projectName, !project.exists()); |
| } |
| return project; |
| } |
| public static void verifyProject(String projectName, boolean exists) { |
| IProject project = getProject(projectName); |
| if (exists) { |
| Assert.assertTrue("Project Does Not Exist:" + projectName, project.exists()); |
| } else { |
| Assert.assertTrue("Project Exists:" + projectName, !project.exists()); |
| } |
| } |
| public static IProject getProject(String projectName) { |
| IWorkspace workspace = ResourcesPlugin.getWorkspace(); |
| String pathString = projectName; |
| if (!(workspace.getRoot().getProject(pathString) == null)) |
| return workspace.getRoot().getProject(pathString); |
| else |
| return null; |
| } |
| public static void verifyNoProjects() { |
| IProject[] projects = getAllProjects(); |
| String projectNames = ""; |
| for (int i = 0; i < projects.length; i++) { |
| projectNames += " " + projects[i].getName(); |
| } |
| Assert.assertTrue("All projects not deleted" + projectNames, projects.length == 0); |
| } |
| public static void deleteProjectIfExists(String projectName) { |
| if (projectName == null) |
| return; |
| IProject project = getProject(projectName); |
| if (project != null && project.isAccessible()) { |
| try { |
| project.close(null); |
| project.delete(true, true, null); |
| ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, null); |
| } catch (Exception e) { |
| Assert.fail(e.getMessage()); |
| } |
| } |
| } |
| public static void deleteAllProjects() throws Exception { |
| //closing projects and tread work in here is a hack because of a BeanInfo bug holding |
| //onto jars loaded in another VM |
| |
| // for (int i = 0; i < projects.length; i++) { |
| // if (projects[i].exists()) { |
| // projects[i].close(null); // This should signal the extra VM to kill itself |
| // } |
| // } |
| // Thread.yield(); // give the VM a chance to die |
| IWorkspaceRunnable runnable = new IWorkspaceRunnable() { |
| |
| public void run(IProgressMonitor monitor) { |
| IProject[] projects = getAllProjects(); |
| for (int i = 0; i < projects.length; i++) { |
| IProject project = projects[i]; |
| boolean success = false; |
| Exception lastException = null; |
| // Don't make 2^12 is about 4 seconds which is the max we |
| // will wait for the VM to die |
| for (int j = 0; j < 13 && !success; j++) { |
| try { |
| if (project.exists()) { |
| project.delete(true, true, null); |
| ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, null); |
| } |
| success = true; |
| } catch (Exception e) { |
| lastException = e; |
| if (project.exists()) { |
| try { |
| project.close(null); |
| project.open(null); |
| } catch (Exception e2) { |
| } |
| } |
| try { |
| Thread.sleep((int) Math.pow(2, j)); |
| } catch (InterruptedException e1) { |
| } // if the VM |
| // isn't dead, |
| // try sleeping |
| } |
| } |
| if (!success && lastException != null) { |
| // Logger.getLogger().log("Problem while deleting: " + lastException.getMessage()); |
| // Assert.fail("Caught Exception=" + |
| // lastException.getMessage() + " when deleting |
| // project=" + project.getName()); |
| } |
| } |
| } |
| }; |
| try { |
| ResourcesPlugin.getWorkspace().run(runnable, null); |
| } catch (CoreException ce) { |
| } |
| //verifyNoProjects(); |
| } |
| /** |
| * Return the absolute path Strings to the files based on the fileSuffix and |
| * path within the plugin. |
| * |
| * @param path |
| * @param fileSuffix |
| * the file ending with the "." if required (the suffix will be |
| * used as is) |
| * @return |
| */ |
| public static List getSpecificFilesInDirectory(Plugin plugin, String path, final String fileSuffix) { |
| URL entry = null; |
| entry = plugin.getBundle().getEntry(path); |
| List result = null; |
| File folder = null; |
| if (entry != null) { |
| try { |
| entry = Platform.asLocalURL(entry); |
| folder = new File(new URI(entry.toString())); |
| } catch (Exception e1) { |
| e1.printStackTrace(); |
| return Collections.EMPTY_LIST; |
| } |
| List files = Arrays.asList(folder.list()); |
| if (!files.isEmpty()) { |
| String folderPath = folder.getAbsolutePath() + File.separator; |
| result = new ArrayList(); |
| for (int i = 0; i < files.size(); i++) { |
| String fileName = (String) files.get(i); |
| if (!fileName.endsWith(fileSuffix)) |
| continue; |
| result.add(folderPath + fileName); |
| } |
| } |
| } |
| if (result == null) |
| result = Collections.EMPTY_LIST; |
| return result; |
| } |
| public static List getJarsInDirectory(Plugin plugin, String path) { |
| return getSpecificFilesInDirectory(plugin, path, ".jar"); |
| } |
| public static List getRarsInDirectory(Plugin plugin, String path) { |
| return getSpecificFilesInDirectory(plugin, path, ".rar"); |
| } |
| public static List getEarsInDirectory(Plugin plugin, String path) { |
| return getSpecificFilesInDirectory(plugin, path, ".ear"); |
| } |
| public static List getWarsInDirectory(Plugin plugin, String path) { |
| return getSpecificFilesInDirectory(plugin, path, ".war"); |
| } |
| public static String getFullFileName(Plugin plugin, String pluginRelativeFileName) throws IOException { |
| IPath path = new Path(pluginRelativeFileName); |
| if (path.getDevice() != null) |
| return pluginRelativeFileName; |
| URL url = plugin.getBundle().getEntry(pluginRelativeFileName); |
| if (url != null) { |
| url = Platform.asLocalURL(url); |
| IPath iPath = new Path(url.getPath()); |
| return iPath.toOSString(); |
| } |
| return null; |
| } |
| } |