org.eclipse.emf.cdo.dawn.codegen.util.ProjectCreationHelper.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.emf.cdo.dawn.codegen.util.ProjectCreationHelper.java

Source

/*
 * Copyright (c) 2010-2012, 2015 Eike Stepper (Berlin, Germany) 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:
 *    Martin Fluegge - initial API and implementation
 */
package org.eclipse.emf.cdo.dawn.codegen.util;

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.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
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.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.launching.JavaRuntime;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.ui.actions.WorkspaceModifyOperation;

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;

/**
 * @author Martin Fluegge
 */
public class ProjectCreationHelper {

    private String name;

    private String[] natures;

    public String getName() {
        return name;
    }

    public IProject getProject() {
        return ResourcesPlugin.getWorkspace().getRoot().getProject(name);
    }

    public IProject createProject() throws CoreException {
        IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(name);

        if (!project.exists()) {
            project.create(null);
        }

        if (!project.isOpen()) {
            project.open(null);
        }

        IProjectDescription description = project.getDescription();
        description.setNatureIds(natures);
        project.setDescription(description, null);

        return project;
    }

    /**
     * @param path
     * @param javaProject
     * @throws JavaModelException
     */
    public static void addJarToBuildPath(String path, IJavaProject javaProject) throws JavaModelException {
        IClasspathEntry newLibraryEntry = JavaCore.newLibraryEntry(new Path(path), null, null);
        ProjectCreationHelper.addToClasspath(javaProject, newLibraryEntry);
    }

    public static void addJarToBuildPath(IPath path, IJavaProject javaProject) throws JavaModelException {
        IClasspathEntry newLibraryEntry = JavaCore.newLibraryEntry(path, null, null);
        ProjectCreationHelper.addToClasspath(javaProject, newLibraryEntry);
    }

    public static void addVariableEntryToBuildPath(IPath path, IJavaProject javaProject) throws JavaModelException {
        IClasspathEntry newLibraryEntry = JavaCore.newVariableEntry(path, null, null);
        ProjectCreationHelper.addToClasspath(javaProject, newLibraryEntry);
    }

    /**
     * adds all jar files in this folder to the build path. Searches only on level 1
     *
     * @param folder
     *          the folder which contains the jar files
     * @param javaProject
     * @throws CoreException
     */
    public static void addAllJarsToBuildPath(IFolder folder, IJavaProject javaProject) throws CoreException {
        try {
            folder.refreshLocal(100, new NullProgressMonitor());
            for (IResource resource : folder.members()) {

                if (resource instanceof IFile && resource.getRawLocation().toString().endsWith(".jar")) {
                    addJarToBuildPath(resource.getRawLocation(), javaProject);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param javaProject
     * @param newEntry
     * @throws JavaModelException
     */
    public final static void addToClasspath(IJavaProject javaProject, IClasspathEntry newEntry)
            throws JavaModelException {
        if (newEntry == null) {
            return;
        }
        IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
        IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length + 1];
        System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);

        newEntries[oldEntries.length] = newEntry;
        javaProject.setRawClasspath(newEntries, null);
    }

    /**
     * @param javaProject
     * @param toBeRemoved
     * @throws JavaModelException
     */
    public final static void removeFromClasspath(IJavaProject javaProject, IPath toBeRemoved)
            throws JavaModelException {
        IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
        ArrayList<IClasspathEntry> newEntries = new ArrayList<IClasspathEntry>();

        for (IClasspathEntry classpathEntry : oldEntries) {
            if (!classpathEntry.getPath().equals(toBeRemoved)) {
                newEntries.add(classpathEntry);
            }
        }

        IClasspathEntry[] newEntriesArray = new IClasspathEntry[newEntries.size()];
        javaProject.setRawClasspath(newEntries.toArray(newEntriesArray), null);
    }

    /**
     * @return the newly created java project
     * @throws CoreException
     */
    public IJavaProject createJavaProject() throws CoreException {
        IProject project = createProject();
        return createJavaProject(project);
    }

    /**
     * Creates a JavaProject prom the given project
     *
     * @param project
     * @return the created JavaProject
     */
    public IJavaProject createJavaProject(IProject project) {
        try {
            // addJavaNature(project);
            IJavaProject javaProject = JavaCore.create(project);
            if (!javaProject.isOpen()) {
                javaProject.open(null);
            }
            createBinFolder(project, javaProject);
            clearSourcePath(javaProject);

            IClasspathEntry sourceFolder = createSourceFolder("src", project);

            addToClasspath(javaProject, sourceFolder);
            addJREContainerToProject(javaProject);
            return javaProject;
        } catch (CoreException e) {
            e.printStackTrace();
        }
        return null;

    }

    /**
     * @param javaProject
     * @throws JavaModelException
     */
    private void addJREContainerToProject(IJavaProject javaProject) throws JavaModelException {
        addToClasspath(javaProject, JavaRuntime.getDefaultJREContainerEntry());
    }

    /**
     * @param javaProject
     * @throws JavaModelException
     */
    private void clearSourcePath(IJavaProject javaProject) throws JavaModelException {
        javaProject.setRawClasspath(new IClasspathEntry[] {}, new NullProgressMonitor()); // clean classpath, means remove
        // Project root from classpath
    }

    /**
     * @param project
     * @throws CoreException
     */
    public void addJavaNature(IProject project) throws CoreException {
        IProjectDescription description = project.getDescription();
        String[] natures = description.getNatureIds();
        String[] newNatures = new String[natures.length + 1];
        System.arraycopy(natures, 0, newNatures, 0, natures.length);
        newNatures[natures.length] = JavaCore.NATURE_ID;
        description.setNatureIds(newNatures);
        project.setDescription(description, new NullProgressMonitor());
    }

    /**
     * @param path
     * @param project
     * @return
     * @throws CoreException
     */
    private IClasspathEntry createSourceFolder(String path, IProject project) throws CoreException {
        IFolder srcFolder = project.getFolder(new Path(path));
        if (!srcFolder.exists()) {
            srcFolder.create(false, true, null);
            IPath sourceFolderPath = srcFolder.getFullPath();
            IClasspathEntry entry = JavaCore.newSourceEntry(sourceFolderPath);

            return entry;
        }
        return null;
    }

    /**
     * @param path
     * @param project
     * @param javaProject
     * @return the created source folder
     * @throws CoreException
     */
    public IFolder createSourceFolder(String path, IProject project, IJavaProject javaProject)
            throws CoreException {
        IFolder srcFolder = project.getFolder(new Path(path));
        if (!srcFolder.exists()) {
            srcFolder.create(false, true, null);
            IPath sourceFolderPath = srcFolder.getFullPath();
            IClasspathEntry entry = JavaCore.newSourceEntry(sourceFolderPath);
            addToClasspath(javaProject, entry);
            return srcFolder;
        }
        return null;
    }

    /**
     * @param project
     * @param javaProject
     * @throws CoreException
     * @throws JavaModelException
     */
    private void createBinFolder(IProject project, IJavaProject javaProject)
            throws CoreException, JavaModelException {
        createOutputFolder("bin", project, javaProject);
    }

    /**
     * @param project
     * @param javaProject
     * @throws CoreException
     * @throws JavaModelException
     */
    private void createOutputFolder(String path, IProject project, IJavaProject javaProject)
            throws CoreException, JavaModelException {
        try {
            IFolder binFolder = project.getFolder(new Path(path));
            if (!binFolder.exists()) {
                binFolder.create(true, true, null);
                javaProject.setOutputLocation(binFolder.getFullPath(), null);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * @param name
     * @param project
     * @return the created folder
     */
    public IFolder createFolder(String name, IProject project) {
        IFolder folder = project.getFolder(name);

        if (!folder.exists()) {
            try {
                folder.create(IResource.NONE, true, null);
            } catch (CoreException e) {
                e.printStackTrace();
            }
        }
        return folder;
    }

    public IFolder getFolder(String name, IProject project) {
        IFolder folder = project.getFolder(name);

        return folder;
    }

    /**
     * @param name
     * @param folder
     * @param content
     * @return the created file
     */
    public IFile createFile(String name, IFolder folder, String content) {
        IFile file = folder.getFile("web.xml");

        try {

            if (!file.exists()) {
                byte[] bytes = content.getBytes();
                InputStream source = new ByteArrayInputStream(bytes);
                file.create(source, IResource.NONE, null);

            }
        } catch (CoreException e) {
            e.printStackTrace();
        }
        return file;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String[] getNatures() {
        return natures;
    }

    public void setNatures(String[] natures) {
        this.natures = natures;
    }

    public ProjectCreationHelper() {
    }

    public static void refreshProject(IResource resource, IProgressMonitor monitor)
            throws InvocationTargetException, InterruptedException {
        IRunnableWithProgress op = new WorkspaceModifyOperation(null) {
            @Override
            protected void execute(IProgressMonitor monitor) throws CoreException, InterruptedException {
                try {
                    IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
                    root.refreshLocal(IResource.DEPTH_INFINITE, monitor);

                } catch (CoreException e) {

                    e.printStackTrace();
                }
            }
        };
        op.run(monitor);
    }
}