net.sourceforge.texlipse.wizards.TexlipseProjectCreationOperation.java Source code

Java tutorial

Introduction

Here is the source code for net.sourceforge.texlipse.wizards.TexlipseProjectCreationOperation.java

Source

/*
 * $Id$
 *
 * Copyright (c) 2004-2005 by the TeXlapse Team.
 * 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
 */
package net.sourceforge.texlipse.wizards;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

import net.sourceforge.texlipse.TexlipsePlugin;
import net.sourceforge.texlipse.builder.TexlipseNature;
import net.sourceforge.texlipse.properties.TexlipseProperties;
import net.sourceforge.texlipse.templates.ProjectTemplateManager;

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.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.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.ui.ide.IDE;

/**
 * Operation to add latex nature to the project.
 * The main file is also created here, using the appropriate template.
 * 
 * @author Kimmo Karlsson
 */
public class TexlipseProjectCreationOperation implements IRunnableWithProgress {

    // a reference to the page attributes
    private TexlipseProjectAttributes attributes;

    /**
     * Create a new operation.
     * @param attr Project attributes
     */
    public TexlipseProjectCreationOperation(TexlipseProjectAttributes attr) {
        attributes = attr;
    }

    /**
     * Run the project creation task. This method is invoked by the Eclipse IDE after the 
     * Project Creation Wizard is finished.
     * 
     * @param pMon progress monitor
     * @throws InvocationTargetException
     * @throws InterruptedException
     */
    public void run(IProgressMonitor pMon) throws InvocationTargetException, InterruptedException {

        IProgressMonitor monitor = pMon;
        // this null-check is recommended by developers of other plugins 
        if (pMon == null) {
            monitor = new NullProgressMonitor();
        }

        try {

            monitor.beginTask(TexlipsePlugin.getResourceString("projectWizardProgressCreating"), 12);

            IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
            String name = attributes.getProjectName();
            IProject project = root.getProject(name);
            monitor.worked(1);

            createProject(project, monitor);
            monitor.worked(1);
            addProjectNature(project, monitor);
            monitor.worked(1);
            createProjectDirs(project, monitor);
            monitor.worked(1);

            TexlipseProperties.setProjectProperty(project, TexlipseProperties.LANGUAGE_PROPERTY,
                    attributes.getLanguageCode() + "");
            TexlipseProperties.setProjectProperty(project, TexlipseProperties.MARK_OUTPUT_DERIVED_PROPERTY, "true");
            TexlipseProperties.setProjectProperty(project, TexlipseProperties.MARK_TEMP_DERIVED_PROPERTY, "true");
            TexlipseProperties.setProjectProperty(project, TexlipseProperties.MAKEINDEX_STYLEFILE_PROPERTY, "");
            TexlipseProperties.setProjectProperty(project, TexlipseProperties.BIBREF_DIR_PROPERTY, "");
            TexlipseProperties.setProjectProperty(project, TexlipseProperties.OUTPUTFILE_PROPERTY,
                    attributes.getOutputFile());
            TexlipseProperties.setProjectProperty(project, TexlipseProperties.OUTPUT_FORMAT,
                    attributes.getOutputFormat());
            TexlipseProperties.setProjectProperty(project, TexlipseProperties.BUILDER_NUMBER,
                    attributes.getBuilder() + "");
            TexlipsePlugin.getDefault().getPreferenceStore().setValue(TexlipseProperties.OUTPUT_FORMAT,
                    attributes.getOutputFormat());
            TexlipsePlugin.getDefault().getPreferenceStore().setValue(TexlipseProperties.BUILDER_NUMBER,
                    attributes.getBuilder());
            monitor.worked(1);

            createMainFile(project, monitor);
            monitor.worked(1);

            monitor.subTask(TexlipsePlugin.getResourceString("projectWizardProgressSettingsFile"));
            TexlipseProperties.saveProjectProperties(project);
            monitor.worked(1);

            IDE.openEditor(TexlipsePlugin.getCurrentWorkbenchPage(),
                    TexlipseProperties.getProjectSourceFile(project));

            monitor.worked(1);

        } catch (CoreException e) {
            TexlipsePlugin.log(TexlipsePlugin.getResourceString("projectWizardCreateError"), e);
        } finally {
            monitor.done();
        }
    }

    /**
     * Create the project directory.
     * If the user has specified an external project location,
     * the project is created with a custom description for the location.
     * 
     * @param project project
     * @param monitor progress monitor
     * @throws CoreException
     */
    private void createProject(IProject project, IProgressMonitor monitor) throws CoreException {

        monitor.subTask(TexlipsePlugin.getResourceString("projectWizardProgressDirectory"));

        if (!project.exists()) {
            if (attributes.getProjectLocation() != null) {
                IProjectDescription desc = project.getWorkspace().newProjectDescription(project.getName());
                IPath projectPath = new Path(attributes.getProjectLocation());
                IStatus stat = ResourcesPlugin.getWorkspace().validateProjectLocation(project, projectPath);
                if (stat.getSeverity() != IStatus.OK) {
                    // should not happen. the location should have been checked in the wizard page
                    throw new CoreException(stat);
                }
                desc.setLocation(projectPath);
                project.create(desc, monitor);
            } else {
                project.create(monitor);
            }
        }
        if (!project.isOpen()) {
            project.open(monitor);
        }
    }

    /**
     * Add a nature to the project.
     * 
     * @param project project
     * @param monitor progress monitor
     * @throws CoreException
     */
    public static void addProjectNature(IProject project, IProgressMonitor monitor) throws CoreException {

        monitor.subTask(TexlipsePlugin.getResourceString("projectWizardProgressNature"));

        IProjectDescription desc = project.getDescription();
        String[] natures = desc.getNatureIds();
        for (int i = 0; i < natures.length; i++) {
            // don't add if already there
            if (TexlipseNature.NATURE_ID.equals(natures[i])) {
                return;
            }
        }

        String[] newNatures = new String[natures.length + 1];
        System.arraycopy(natures, 0, newNatures, 1, natures.length);
        newNatures[0] = TexlipseNature.NATURE_ID;
        desc.setNatureIds(newNatures);
        project.setDescription(desc, monitor);
    }

    /**
     * Create project's (sub)directory structure.
     *  
     * @param project project
     * @param monitor progress monitor
     * @throws CoreException
     */
    private void createProjectDirs(IProject project, IProgressMonitor monitor) throws CoreException {

        monitor.subTask(TexlipsePlugin.getResourceString("projectWizardProgressSubdirs"));

        String outputDir = attributes.getOutputDir();
        String sourceDir = attributes.getSourceDir();
        String tempDir = attributes.getTempDir();

        createDir(project, monitor, outputDir, true);
        createDir(project, monitor, sourceDir, false);
        createDir(project, monitor, tempDir, true);

        TexlipseProperties.setProjectProperty(project, TexlipseProperties.OUTPUT_DIR_PROPERTY, outputDir);
        TexlipseProperties.setProjectProperty(project, TexlipseProperties.SOURCE_DIR_PROPERTY, sourceDir);
        TexlipseProperties.setProjectProperty(project, TexlipseProperties.TEMP_DIR_PROPERTY, tempDir);
    }

    /**
     * Create a subdirectory to the given project's directory.
     * @param project project
     * @param monitor progress monitor
     * @param dir directory name
     * @throws CoreException
     */
    private void createDir(IProject project, IProgressMonitor monitor, String dir, boolean derivedAsDefault)
            throws CoreException {
        if (dir != null && dir.length() > 0) {
            IFolder folder = project.getFolder(dir);
            folder.create(true, true, monitor);
            if (derivedAsDefault) {
                folder.setDerived(true);
            }
        }
    }

    /**
     * Create main file of the project from template.
     * 
     * @param project project
     * @param monitor progress monitor
     * @throws CoreException
     */
    private void createMainFile(IProject project, IProgressMonitor monitor) throws CoreException {

        monitor.subTask(TexlipsePlugin.getResourceString("projectWizardProgressFile"));

        String name = attributes.getSourceFile();
        if (name == null || name.length() == 0) {
            throw new CoreException(TexlipsePlugin.stat("Null main file name"));
        }

        TexlipseProperties.setProjectProperty(project, TexlipseProperties.MAINFILE_PROPERTY, name);

        byte[] template = getTemplate(attributes.getTemplate());
        if (template == null) {
            template = new byte[0];
        }
        ByteArrayInputStream stream = new ByteArrayInputStream(template);

        IFile mainFile = TexlipseProperties.getProjectSourceFile(project);
        mainFile.create(stream, true, monitor);
    }

    /**
     * Return the contents of a template.
     * 
     * @param name template name without the extension
     * @return contents of the template
     */
    private byte[] getTemplate(String name) {

        String[] userNames = ProjectTemplateManager.loadUserTemplateNames();
        for (int i = 0; i < userNames.length; i++) {

            if (userNames[i].equals(name)) {

                byte[] content = null;
                try {
                    content = ProjectTemplateManager.readUserTemplate(name);
                } catch (IOException e) {
                }
                if (content != null) {
                    return content;
                }
            }
        }

        String[] systemNames = ProjectTemplateManager.loadTemplateNames();
        for (int i = 0; i < systemNames.length; i++) {

            if (systemNames[i].equals(name)) {

                byte[] content = null;
                try {
                    content = ProjectTemplateManager.readSystemTemplate(name);
                } catch (IOException e) {
                }
                if (content != null) {
                    return content;
                }
            }
        }

        return null;
    }
}