org.hyperic.hypclipse.internal.wizards.project.NewProjectCreationOperation.java Source code

Java tutorial

Introduction

Here is the source code for org.hyperic.hypclipse.internal.wizards.project.NewProjectCreationOperation.java

Source

/**********************************************************************************
 * 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
 *
 * Icons under 'icons/fugue' are made by Yusuke Kamiyamane http://www.pinvoke.com/.
 * Licensed under a Creative Commons Attribution 3.0 license.
 * <http://creativecommons.org/licenses/by/3.0/>
 *
 *********************************************************************************/
package org.hyperic.hypclipse.internal.wizards.project;

import java.io.File;
import java.io.FilenameFilter;
import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
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.SubProgressMonitor;
import org.eclipse.jdt.core.IAccessRule;
import org.eclipse.jdt.core.IClasspathAttribute;
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.jface.viewers.ISelection;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.ui.IWorkbenchPage;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.actions.WorkspaceModifyOperation;
import org.eclipse.ui.ide.IDE;
import org.eclipse.ui.part.ISetSelectionTarget;
import org.hyperic.hypclipse.internal.ClasspathComputer;
import org.hyperic.hypclipse.internal.ExecutionEnvironmentAnalyzer;
import org.hyperic.hypclipse.internal.HQDEMessages;
import org.hyperic.hypclipse.internal.HQDEPlugin;
import org.hyperic.hypclipse.internal.editor.build.WorkspaceBuildModel;
import org.hyperic.hypclipse.internal.editor.build.WorkspacePluginModelBase;
import org.hyperic.hypclipse.internal.preferences.PreferencesManager;
import org.hyperic.hypclipse.internal.util.CoreUtility;
import org.hyperic.hypclipse.internal.wizards.IProjectProvider;
import org.hyperic.hypclipse.plugin.IBuildEntry;
import org.hyperic.hypclipse.plugin.IBuildModelFactory;
import org.hyperic.hypclipse.plugin.IFieldData;
import org.hyperic.hypclipse.plugin.IPluginBase;
import org.hyperic.hypclipse.plugin.IPluginContentWizard;
import org.hyperic.hypclipse.plugin.IPluginFieldData;

/**
 * Handles the new project creation based on information
 * gathered from wizard.
 *
 */
public class NewProjectCreationOperation extends WorkspaceModifyOperation {

    private IFieldData fData;
    private IPluginContentWizard fContentWizard;
    private IProjectProvider fProjectProvider;
    private WorkspacePluginModelBase fModel;
    //   private boolean fResult;

    /**
     * 
     * @param data
     * @param provider
     * @param contentWizard
     */
    public NewProjectCreationOperation(IFieldData data, IProjectProvider provider,
            IPluginContentWizard contentWizard) {
        fData = data;
        fProjectProvider = provider;
        fContentWizard = contentWizard;
    }

    /*
     * (non-Javadoc)
     * @see org.eclipse.ui.actions.WorkspaceModifyOperation#execute(org.eclipse.core.runtime.IProgressMonitor)
     */
    protected void execute(IProgressMonitor monitor)
            throws CoreException, InvocationTargetException, InterruptedException {

        monitor.beginTask(HQDEMessages.NewProjectCreationOperation_creating, getNumberOfWorkUnits());
        monitor.subTask(HQDEMessages.NewProjectCreationOperation_project);

        // first create project to eclipse
        IProject project = createProject();
        monitor.worked(1);

        // adding java nature to project
        // also modify classpaths
        if (project.hasNature(JavaCore.NATURE_ID)) {
            monitor.subTask(HQDEMessages.NewProjectCreationOperation_setClasspath);
            setClasspath(project, fData);
            monitor.worked(1);
        }

        monitor.subTask("PDEUIMessages.NewProjectCreationOperation_manifestFile");
        createPluginDescriptor(project);
        monitor.worked(1);

        // generate the build.properties file
        monitor.subTask("PDEUIMessages.NewProjectCreationOperation_buildPropertiesFile");
        createBuildPropertiesFile(project, fData);
        monitor.worked(1);

        //      boolean contentWizardResult = true;
        if (fContentWizard != null) {
            //         contentWizardResult = fContentWizard.performFinish(project, fModel, new SubProgressMonitor(monitor, 1));
            fContentWizard.performFinish(project, fModel, new SubProgressMonitor(monitor, 1));
        }

        fModel.save();
        openFile((IFile) fModel.getUnderlyingResource());
        monitor.worked(1);

        //      fResult = contentWizardResult;

    }

    /**
     * 
     * @param project
     * @throws CoreException
     */
    private void createPluginDescriptor(IProject project) throws CoreException {
        IFile file = project.getFile("etc/hq-plugin.xml");
        fModel = new WorkspacePluginModelBase(file, false);
        IPluginBase pluginBase = fModel.getPluginBase();

        pluginBase.setPackage(fData.getPackageName());
        pluginBase.setName(fData.getName());
        if (((IPluginFieldData) fData).doGenerateClass())
            pluginBase.setProductPlugin(((IPluginFieldData) fData).getClassname());
    }

    private void createBuildPropertiesFile(IProject project, IFieldData data) throws CoreException {
        IFile file = project.getFile("hqbuild.properties");
        if (!file.exists()) {
            WorkspaceBuildModel model = new WorkspaceBuildModel(file);
            IBuildModelFactory factory = model.getFactory();

            // BIN.INCLUDES
            IBuildEntry binEntry = factory.createEntry(IBuildEntry.BIN_INCLUDES);
            //         fillBinIncludes(project, binEntry);
            createSourceOutputBuildEntries(model, factory, project, data);
            model.getBuild().add(binEntry);
            model.save();
        }
    }

    protected void createSourceOutputBuildEntries(WorkspaceBuildModel model, IBuildModelFactory factory,
            IProject project, IFieldData data) throws CoreException {
        String srcFolder = fData.getSourceFolderName();
        if (srcFolder != null) {

            IBuildEntry entry = factory.createEntry(IBuildEntry.JAR_PREFIX + ".");
            if (srcFolder.length() > 0)
                entry.addToken(new Path(srcFolder).addTrailingSeparator().toString());

            model.getBuild().add(entry);

            entry = factory.createEntry(IBuildEntry.OUTPUT_PREFIX + ".");
            String outputFolder = fData.getOutputFolderName().trim();
            if (outputFolder.length() > 0)
                entry.addToken(new Path(outputFolder).addTrailingSeparator().toString());

            model.getBuild().add(entry);

            IJavaProject javaProject = JavaCore.create(project);
            IClasspathEntry[] extraEntries = getHQDefaultClassPathEntries(javaProject, data);
            entry = factory.createEntry(IBuildEntry.JARS_EXTRA_CLASSPATH);

            if (extraEntries != null) {
                for (int i = 0; i < extraEntries.length; i++) {
                    entry.addToken(extraEntries[i].getPath().toOSString());
                }
            }
            model.getBuild().add(entry);

        }

    }

    /**
     * Sets project classpath.
     * 
     * @param project
     * @param data
     * @throws JavaModelException
     * @throws CoreException
     */
    private void setClasspath(IProject project, IFieldData data) throws JavaModelException, CoreException {
        IJavaProject javaProject = JavaCore.create(project);
        // Set output folder
        if (data.getOutputFolderName() != null) {
            IPath path = project.getFullPath().append(data.getOutputFolderName());
            javaProject.setOutputLocation(path, null);
        }
        IClasspathEntry[] entries = getClassPathEntries(javaProject, data);
        javaProject.setRawClasspath(entries, null);
    }

    /**
     * Constructs complete array of classpath entries which is
     * inserted to projects classpath.
     * 
     * @param project
     * @param data
     * @return
     */
    private IClasspathEntry[] getClassPathEntries(IJavaProject project, IFieldData data) {
        IClasspathEntry[] internalClassPathEntries = getInternalClassPathEntries(project, data);
        IClasspathEntry[] hqClassPathEntries = getHQDefaultClassPathEntries(project, data);

        IClasspathEntry[] entries = new IClasspathEntry[internalClassPathEntries.length + 1
                + hqClassPathEntries.length];

        System.arraycopy(internalClassPathEntries, 0, entries, 1, internalClassPathEntries.length);

        System.arraycopy(hqClassPathEntries, 0, entries, 1 + internalClassPathEntries.length,
                hqClassPathEntries.length);

        // Set EE of new project
        String executionEnvironment = null;
        if (data instanceof AbstractFieldData) {
            executionEnvironment = ((AbstractFieldData) data).getExecutionEnvironment();
        }
        ClasspathComputer.setComplianceOptions(project,
                ExecutionEnvironmentAnalyzer.getCompliance(executionEnvironment));
        entries[0] = ClasspathComputer.createJREEntry(executionEnvironment);
        //      entries[1] = ClasspathComputer.createContainerEntry();

        return entries;
    }

    /**
     * Example directory from agent side where some of the client libraries 
     * are located is:
     * C:\Program Files\Hyperic HQ Enterprise 4.0.1\agent-4.0.1-EE\bundles\agent-4.0.1-EE-905\pdk\lib
     * 
     * Jar libraries which are directly under this lib directory are 
     * automatically added to agents classpath. Since agent will always see
     * these libraries, we will add these files automatically to projects 
     * classpath.
     * 
     * This method will return array of classpath entries which
     * contains these libraries.
     * 
     * @param project
     * @param data hq bundle name to match from stored preferences
     * @return
     */
    protected IClasspathEntry[] getHQDefaultClassPathEntries(IJavaProject project, IFieldData data) {
        PreferencesManager pManager = PreferencesManager.getInstance();
        String hqLibHome = pManager.getEnvironmentLocation(data.getHQExecutionEnvironment());

        if (hqLibHome == null) {
            return new IClasspathEntry[0];
        }

        File lDir = new File(hqLibHome + "/pdk/lib");
        String[] jars = lDir.list(new FilenameFilter() {
            public boolean accept(File dir, String name) {
                if (name.endsWith(".jar"))
                    return true;
                return false;
            }
        });

        IClasspathEntry[] entries = new IClasspathEntry[jars.length];
        for (int i = 0; i < jars.length; i++) {
            File jar = new File(lDir, jars[i]);
            entries[i] = JavaCore.newLibraryEntry(new Path(jar.getAbsolutePath()), null, null, new IAccessRule[0],
                    new IClasspathAttribute[0], false);
        }

        return entries;
    }

    /**
     * 
     * @param project
     * @param data
     * @return
     */
    protected IClasspathEntry[] getInternalClassPathEntries(IJavaProject project, IFieldData data) {
        if (data.getSourceFolderName() == null) {
            return new IClasspathEntry[0];
        }
        IClasspathEntry[] entries = new IClasspathEntry[1];
        IPath path = project.getProject().getFullPath().append(data.getSourceFolderName());
        entries[0] = JavaCore.newSourceEntry(path);
        return entries;
    }

    /**
     * This helper method creates actual eclipse project.
     * Needed natures are attached to project. If there are
     * other basic resources like directories, those
     * are also created.
     * 
     * @return Handle to eclipse project
     * @throws CoreException
     */
    private IProject createProject() throws CoreException {
        IProject project = fProjectProvider.getProject();
        if (!project.exists()) {
            CoreUtility.createProject(project, fProjectProvider.getLocationPath(), null);
            project.open(null);
        }

        if (!project.hasNature("org.hyperic.hypclipse.PluginNature"))
            CoreUtility.addNatureToProject(project, "org.hyperic.hypclipse.PluginNature", null);
        if (!project.hasNature(JavaCore.NATURE_ID))
            CoreUtility.addNatureToProject(project, JavaCore.NATURE_ID, null);
        if (fData.getSourceFolderName() != null && fData.getSourceFolderName().trim().length() > 0) {
            IFolder folder = project.getFolder(fData.getSourceFolderName());
            if (!folder.exists())
                CoreUtility.createFolder(folder);
        }
        return project;
    }

    /**
     * This method is calculating work units which is used in
     * progress monitor. During project creation, progress 
     * feedback is given back to user.
     * 
     * @return Number of work units
     */
    protected int getNumberOfWorkUnits() {
        int numUnits = 4;
        if (fData instanceof IPluginFieldData) {
            IPluginFieldData data = (IPluginFieldData) fData;
            if (data.doGenerateClass())
                numUnits++;
            if (fContentWizard != null)
                numUnits++;
        }
        return numUnits;
    }

    /**
     * Opens file to eclipse framework. This function is usually
     * called after project is created and some created 
     * file wants to be opened right away.
     * 
     * @param file Resource to open
     */
    private void openFile(final IFile file) {
        final IWorkbenchWindow ww = HQDEPlugin.getActiveWorkbenchWindow();
        final IWorkbenchPage page = ww.getActivePage();
        if (page == null)
            return;
        final IWorkbenchPart focusPart = page.getActivePart();
        ww.getShell().getDisplay().asyncExec(new Runnable() {
            public void run() {
                if (focusPart instanceof ISetSelectionTarget) {
                    ISelection selection = new StructuredSelection(file);
                    ((ISetSelectionTarget) focusPart).selectReveal(selection);
                }
                try {
                    IDE.openEditor(page, file, true);
                } catch (PartInitException e) {
                }
            }
        });
    }

}