ca.ubc.cs.ferret.tests.support.TestProject.java Source code

Java tutorial

Introduction

Here is the source code for ca.ubc.cs.ferret.tests.support.TestProject.java

Source

/*******************************************************************************
 * Copyright (c) 2004 - 2005 University Of British Columbia 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:
 *     University Of British Columbia - initial API and implementation
 *******************************************************************************/
/*
 * Created on Jul 20, 2004
 */
package ca.ubc.cs.ferret.tests.support;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.MalformedURLException;
import java.net.URL;

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.IncrementalProjectBuilder;
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.core.runtime.Platform;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
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.core.search.IJavaSearchConstants;
import org.eclipse.jdt.core.search.SearchEngine;
import org.eclipse.jdt.core.search.SearchPattern;
import org.eclipse.jdt.core.search.TypeNameRequestor;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.progress.IProgressService;

/**
 * From Erich Gamma's "Contributing to Eclipse" book.
 */
public class TestProject {
    public IProject project;

    public IJavaProject javaProject;

    private IPackageFragmentRoot sourceFolder;

    public TestProject(final String name) throws CoreException, InvocationTargetException, InterruptedException {
        IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
        project = root.getProject(name);
        project.create(null);
        project.open(null);

        javaProject = JavaCore.create(project);
        IFolder binFolder = createBinFolder();
        setJavaNature();
        javaProject.setRawClasspath(new IClasspathEntry[0], null);
        createOutputFolder(binFolder);
        addSystemLibraries();
    }

    public IProject getProject() {
        return project;
    }

    public IJavaProject getJavaProject() {
        return javaProject;
    }

    public void build() throws CoreException, InvocationTargetException, InterruptedException {
        WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
            protected void execute(IProgressMonitor monitor) throws CoreException {
                project.build(IncrementalProjectBuilder.FULL_BUILD, null);
            };
        };
        IProgressService service = PlatformUI.getWorkbench().getProgressService();
        service.run(true, true, op);
    }

    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 {
        StringBuffer buf = new StringBuffer();
        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 void dispose() throws CoreException {
    //      // WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
    //      // protected void execute(IProgressMonitor monitor) throws CoreException
    //      // {
    //      project.getProject().delete(true, true, null);
    //      waitForIndexer();
    //      // };
    //      // };
    //      // IProgressService service =
    //      // PlatformUI.getWorkbench().getProgressService();
    //      // service.run(true, true, op);
    //   }
    //
    //   public static void waitForAutoBuild() {
    //      boolean wasInterrupted = false;
    //      do {
    //         try {
    //            Platform.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, null);
    //            wasInterrupted = false;
    //         } catch (OperationCanceledException e) {
    //            e.printStackTrace();
    //         } catch (InterruptedException e) {
    //            wasInterrupted = true;
    //         }
    //      } while (wasInterrupted);
    //   }

    private IFolder createBinFolder() throws CoreException {
        IFolder binFolder = project.getFolder("bin");
        binFolder.create(false, true, null);
        return binFolder;
    }

    private void setJavaNature() throws CoreException {
        IProjectDescription description = project.getDescription();
        description.setNatureIds(new String[] { JavaCore.NATURE_ID });
        project.setDescription(description, null);
    }

    private void createOutputFolder(IFolder binFolder) throws JavaModelException {
        IPath outputLocation = binFolder.getFullPath();
        javaProject.setOutputLocation(outputLocation, null);
    }

    private 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);
    }

    public void addJar(Plugin plugin, String jar) throws MalformedURLException, IOException, 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);
    }

    private Path findFileInPlugin(Plugin plugin, String file) throws MalformedURLException, IOException {
        // Plugin p = Platform.getPlugin(plugin);
        URL pluginURL = plugin.getBundle().getEntry("/");
        URL jarURL = new URL(pluginURL, file);
        URL localJarURL = Platform.asLocalURL(jarURL);
        return new Path(localJarURL.getPath());
    }

    public void waitForIndexer() throws JavaModelException {
        new SearchEngine().searchAllTypeNames(null, null, SearchPattern.R_EXACT_MATCH, IJavaSearchConstants.CLASS,
                SearchEngine.createJavaSearchScope(new IJavaElement[0]), new TypeNameRequestor() {
                    // nothing needs to be done here...we accept everything
                }, IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, null);
    }
}