com.mountainminds.eclemma.core.JavaProjectKit.java Source code

Java tutorial

Introduction

Here is the source code for com.mountainminds.eclemma.core.JavaProjectKit.java

Source

/*******************************************************************************
 * Copyright (c) 2006, 2014 Mountainminds GmbH & Co. KG and Contributors
 * 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:
 *    Marc R. Hoffmann - initial API and implementation
 *    
 ******************************************************************************/
package com.mountainminds.eclemma.core;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.Reader;

import junit.framework.Assert;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IMarker;
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.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.OperationCanceledException;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.launching.JavaRuntime;

import com.mountainminds.eclemma.internal.core.EclEmmaCorePlugin;

/**
 * Utility class to setup Java projects programatically.
 */
public class JavaProjectKit {

    private static final String DEFAULT_PROJECT_NAME = "UnitTestProject";

    public final IWorkspace workspace;

    public final IProject project;

    public final IJavaProject javaProject;

    public JavaProjectKit() throws CoreException {
        this(DEFAULT_PROJECT_NAME);
    }

    public JavaProjectKit(String name) throws CoreException {
        workspace = ResourcesPlugin.getWorkspace();
        IWorkspaceRoot root = workspace.getRoot();
        project = root.getProject(name);
        project.create(null);
        project.open(null);
        IProjectDescription description = project.getDescription();
        description.setNatureIds(new String[] { JavaCore.NATURE_ID });
        project.setDescription(description, null);
        javaProject = JavaCore.create(project);
        javaProject.setRawClasspath(new IClasspathEntry[0], null);
        addClassPathEntry(JavaRuntime.getDefaultJREContainerEntry());
    }

    public void enableJava5() {
        javaProject.setOption(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_1_5);
        javaProject.setOption(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_1_5);
    }

    public IFolder setDefaultOutputLocation(String foldername) throws CoreException {
        IFolder folder = project.getFolder(foldername);
        folder.create(false, true, null);
        javaProject.setOutputLocation(folder.getFullPath(), null);
        return folder;
    }

    public IPackageFragmentRoot createSourceFolder() throws CoreException {
        IPackageFragmentRoot packageRoot = javaProject.getPackageFragmentRoot(javaProject.getResource());
        addClassPathEntry(JavaCore.newSourceEntry(packageRoot.getPath()));
        return packageRoot;
    }

    public IPackageFragmentRoot createSourceFolder(String foldername) throws CoreException {
        IFolder folder = project.getFolder(foldername);
        folder.create(false, true, null);
        IPackageFragmentRoot packageRoot = javaProject.getPackageFragmentRoot(folder);
        addClassPathEntry(JavaCore.newSourceEntry(packageRoot.getPath()));
        return packageRoot;
    }

    public IPackageFragmentRoot createSourceFolder(String foldername, String output) throws CoreException {
        IFolder folder = project.getFolder(foldername);
        folder.create(false, true, null);
        IPackageFragmentRoot packageRoot = javaProject.getPackageFragmentRoot(folder);
        IFolder outputFolder = project.getFolder(output);
        outputFolder.create(false, true, null);
        addClassPathEntry(JavaCore.newSourceEntry(packageRoot.getPath(), null, outputFolder.getFullPath()));
        return packageRoot;
    }

    public IPackageFragmentRoot createJAR(String jarsrc, String jarpath, IPath sourceAttachmentPath,
            IPath sourceAttachmentRootPath) throws CoreException, IOException {
        IFile jarfile = project.getFile(jarpath);
        InputStream source = openTestResource(new Path(jarsrc));
        jarfile.create(source, true, null);
        IPackageFragmentRoot packageRoot = javaProject.getPackageFragmentRoot(jarfile);
        addClassPathEntry(
                JavaCore.newLibraryEntry(packageRoot.getPath(), sourceAttachmentPath, sourceAttachmentRootPath));
        return packageRoot;
    }

    public IPackageFragmentRoot createExternalJAR(String jarsrc, IPath sourceAttachmentPath,
            IPath sourceAttachmentRootPath) throws CoreException, IOException {
        File jarfile = File.createTempFile("test", ".jar");
        InputStream source = openTestResource(new Path(jarsrc));
        OutputStream out = new FileOutputStream(jarfile);
        byte[] buffer = new byte[1024];
        int len;
        while ((len = source.read(buffer)) != -1) {
            out.write(buffer, 0, len);
        }
        out.close();
        IPackageFragmentRoot packageRoot = javaProject.getPackageFragmentRoot(jarfile.getAbsolutePath());
        addClassPathEntry(
                JavaCore.newLibraryEntry(packageRoot.getPath(), sourceAttachmentPath, sourceAttachmentRootPath));
        return packageRoot;
    }

    public void addProjectReference(JavaProjectKit otherProject) throws CoreException {
        addClassPathEntry(JavaCore.newProjectEntry(otherProject.project.getFullPath()));
    }

    public IPackageFragment createPackage(IPackageFragmentRoot fragmentRoot, String name) throws CoreException {
        return fragmentRoot.createPackageFragment(name, false, null);
    }

    public ICompilationUnit createCompilationUnit(IPackageFragment fragment, String name, String content)
            throws JavaModelException {
        return fragment.createCompilationUnit(name, content, false, null);
    }

    public ICompilationUnit createCompilationUnit(IPackageFragmentRoot fragmentRoot, String testsrc, String path)
            throws CoreException, IOException {
        IPath typepath = new Path(path);
        String pkgname = typepath.removeLastSegments(1).toString().replace('/', '.');
        IPackageFragment fragment = createPackage(fragmentRoot, pkgname);
        StringBuffer sb = new StringBuffer();
        InputStream source = openTestResource(new Path(testsrc).append(typepath));
        Reader r = new InputStreamReader(source);
        int c;
        while ((c = r.read()) != -1)
            sb.append((char) c);
        r.close();
        return createCompilationUnit(fragment, typepath.lastSegment(), sb.toString());
    }

    public void addClassPathEntry(IClasspathEntry entry) throws CoreException {
        IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
        IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length + 1];
        System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);
        newEntries[oldEntries.length] = entry;
        javaProject.setRawClasspath(newEntries, null);
    }

    public void destroy() throws CoreException {
        project.delete(true, true, null);
    }

    public InputStream openTestResource(IPath path) throws IOException {
        return FileLocator.openStream(Platform.getBundle(EclEmmaCorePlugin.ID), path, false);
    }

    public void assertNoErrors() throws CoreException {
        final IMarker[] markers = project.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
        if (markers.length > 0) {
            for (int i = 0; i < markers.length; i++) {
                Integer severity = (Integer) markers[i].getAttribute(IMarker.SEVERITY);
                Assert.assertTrue(String.valueOf(markers[i].getAttribute(IMarker.MESSAGE)),
                        severity.intValue() < IMarker.SEVERITY_ERROR);
            }
        }
    }

    public static void waitForBuild() throws OperationCanceledException, InterruptedException {
        Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD, null);
    }

}