org.jactr.eclipse.ui.wizards.templates.BaseACTRContributorTemplateSection.java Source code

Java tutorial

Introduction

Here is the source code for org.jactr.eclipse.ui.wizards.templates.BaseACTRContributorTemplateSection.java

Source

/*
 * Created on Mar 28, 2007 Copyright (C) 2001-5, Anthony Harrison anh23@pitt.edu
 * (jactr.org) This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public License as
 * published by the Free Software Foundation; either version 2.1 of the License,
 * or (at your option) any later version. This library is distributed in the
 * hope that it will be useful, but WITHOUT ANY WARRANTY; without even the
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
 * the GNU Lesser General Public License for more details. You should have
 * received a copy of the GNU Lesser General Public License along with this
 * library; if not, write to the Free Software Foundation, Inc., 59 Temple
 * Place, Suite 330, Boston, MA 02111-1307 USA
 */
package org.jactr.eclipse.ui.wizards.templates;

import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.ResourceBundle;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.pde.core.build.IBuildEntry;
import org.eclipse.pde.core.plugin.IPluginModelBase;
import org.eclipse.pde.core.plugin.IPluginReference;
import org.eclipse.pde.internal.core.build.WorkspaceBuildModel;
import org.eclipse.pde.internal.core.ibundle.IBundle;
import org.eclipse.pde.internal.core.ibundle.IBundlePluginModelBase;
import org.eclipse.pde.ui.templates.OptionTemplateSection;
import org.eclipse.pde.ui.templates.PluginReference;
import org.jactr.eclipse.core.bundles.meta.ManifestTools;
import org.jactr.eclipse.core.project.ACTRProjectUtils;
import org.jactr.eclipse.ui.UIPlugin;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;

public abstract class BaseACTRContributorTemplateSection extends OptionTemplateSection {

    /**
     * Logger definition
     */

    static private final transient Log LOGGER = LogFactory.getLog(BaseACTRContributorTemplateSection.class);

    public BaseACTRContributorTemplateSection() {
        super();
    }

    @Override
    protected ResourceBundle getPluginResourceBundle() {
        Bundle bundle = Platform.getBundle(UIPlugin.ID);
        return Platform.getResourceBundle(bundle);
    }

    @Override
    protected URL getInstallURL() {
        return UIPlugin.getDefault().getBundle().getEntry("/");
    }

    @Override
    protected String getTemplateDirectory() {
        return "code_templates";
    }

    @Override
    public void initializeFields(IPluginModelBase model) {

    }

    public String[] getNewFiles() {
        return new String[0];
    }

    protected void addClasspathEntries(Collection<String> entries, boolean asSource) throws CoreException {
        IJavaProject javaProject = JavaCore.create(project);

        IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
        IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length + entries.size()];

        /*
         * first old entry
         */
        newEntries[0] = oldEntries[0];

        System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);

        Iterator<String> itr = entries.iterator();
        for (int i = oldEntries.length; itr.hasNext(); i++) {
            IPath path = project.getFullPath().append(itr.next());
            if (asSource)
                newEntries[i] = JavaCore.newSourceEntry(path);
            else
                newEntries[i] = JavaCore.newLibraryEntry(path, null, null, true);
        }

        javaProject.setRawClasspath(newEntries, null);
    }

    protected void addSourceFolders(Collection<String> folders) throws CoreException {
        addClasspathEntries(folders, true);

        /**
         * this ensures that all the class path entries we've added are included in
         * the packaged jar file <br>
         * this is still necessary since model.getBuildModel() will normally return
         * null..
         */

        WorkspaceBuildModel model = new WorkspaceBuildModel(project.getFile("build.properties"));

        // default jar
        IBuildEntry root = model.getBuild().getEntry(IBuildEntry.JAR_PREFIX + ".");

        for (String folder : folders)
            if (!root.contains(folder))
                root.addToken(folder);

        model.save();
        model.dispose();
    }

    /**
     * returns a collection of the basic actr plugin references
     * 
     * @return
     */
    protected Collection<IPluginReference> getDefaultPluginReferences() {
        ArrayList<IPluginReference> rtn = new ArrayList<IPluginReference>();
        /*
         * access to the core
         */
        rtn.add(new PluginReference("org.jactr", null, 0));
        /*
         * and can be accessed from io (needed for the buddy policy stuff)
         */
        rtn.add(new PluginReference("org.jactr.io", null, 0));
        /*
         * so that they get the default tools
         */
        rtn.add(new PluginReference("org.jactr.tools", null, 0));
        /*
         * basic logging.. this may change org.apache.commons.logging official
         * package is still pending..
         */
        rtn.add(new PluginReference("org.jactr.support", null, 0));

        rtn.add(new PluginReference("org.commonreality.api", null, 0));
        rtn.add(new PluginReference("org.commonreality.core", null, 0));
        rtn.add(new PluginReference("org.commonreality.time", null, 0));
        rtn.add(new PluginReference("org.commonreality.sensors", null, 0));
        rtn.add(new PluginReference("org.commonreality.modalities", null, 0));

        rtn.add(new PluginReference("org.apache.log4j", null, 0));
        return rtn;
    }

    @Override
    public IPluginReference[] getDependencies(String schemaVersion) {
        ArrayList<IPluginReference> plugins = new ArrayList<IPluginReference>();
        plugins.addAll(getDefaultPluginReferences());

        return plugins.toArray(new IPluginReference[plugins.size()]);
    }

    /**
     * will use the IPluginBaseModel to try to set Eclipse-RegisterBuddy in the
     * header file which allows the required plugins to access the classes in this
     * package..
     * 
     * @param additionalBuddies
     */
    protected void addEclipseBuddies(Collection<String> additionalBuddies) throws CoreException {
        if (!ManifestTools.addEclipseBuddies(model, additionalBuddies))
            throw new CoreException(new Status(IStatus.ERROR, UIPlugin.ID,
                    "model info is " + model.getClass().getName() + " cannot set buddy info"));
    }

    protected void exportPackages(Collection<String> packagesToExport) throws CoreException {
        /**
         * need this to ensure that everything is exported
         */
        if (model instanceof IBundlePluginModelBase) {
            if (LOGGER.isDebugEnabled())
                LOGGER.debug("we have access to the bundle information, attempting to update");
            IBundle bundle = ((IBundlePluginModelBase) model).getBundleModel().getBundle();

            String oldExports = bundle.getHeader(Constants.EXPORT_PACKAGE);
            StringBuilder packages = new StringBuilder(oldExports == null ? "" : oldExports);

            if (packages.length() != 0)
                packages.append(",");

            for (String packageToExport : packagesToExport)
                packages.append(packageToExport).append(",");

            if (packages.length() > 1)
                packages.delete(packages.length() - 1, packages.length());

            bundle.setHeader(Constants.EXPORT_PACKAGE, packages.toString());
        } else
            throw new CoreException(new Status(IStatus.ERROR, UIPlugin.ID,
                    "model info is " + model.getClass().getName() + " cannot set export info"));
    }

    /**
     * adds the project nature..
     * 
     * @throws CoreException
     */
    protected void addProjectNature() throws CoreException {
        ACTRProjectUtils.addNature(project);
    }
}