package org.eclipse.wst.common.tests;
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.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
/**
 * @author jsholl
 * 
 * To change this generated comment edit the template variable "typecomment": Window>Preferences>Java>Templates. To
 * enable and disable the creation of type comments go to Window>Preferences>Java>Code Generation.
 */
public class ProjectUtility {
    public static IProject[] getAllProjects() {
        return ResourcesPlugin.getWorkspace().getRoot().getProjects();
    }
    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
        IProject[] projects = getAllProjects();
        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
        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.open(null);
	                        project.close(null);
                    	} catch(Exception e2){
                    	}
                    }
                    Thread.sleep((int) Math.pow(2, j)); // if the VM isn't dead, try sleeping
                }
            }
            if (!success && lastException != null) {
                lastException.printStackTrace();
                Assert.fail("Caught Exception=" + lastException.getMessage() + " when deleting project=" + project.getName());
            }
        }
        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() + "\\";
                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);
            return url.getPath().substring(1);
        }
        return null;
    }
}