org.jamon.eclipse.maven.configurator.JamonProjectConfigurator.java Source code

Java tutorial

Introduction

Here is the source code for org.jamon.eclipse.maven.configurator.JamonProjectConfigurator.java

Source

/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

package org.jamon.eclipse.maven.configurator;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.model.Plugin;
import org.apache.maven.project.MavenProject;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.JavaCore;
import org.jamon.eclipse.JamonNature;
import org.jamon.eclipse.ProcessorJarLocations;
import org.jamon.eclipse.ProcessorSourceType;
import org.eclipse.m2e.jdt.IClasspathDescriptor;
import org.eclipse.m2e.jdt.IJavaProjectConfigurator;
import org.eclipse.m2e.core.project.IMavenProjectFacade;
import org.eclipse.m2e.core.project.configurator.AbstractProjectConfigurator;
import org.eclipse.m2e.core.project.configurator.ProjectConfigurationRequest;

public class JamonProjectConfigurator extends AbstractProjectConfigurator implements IJavaProjectConfigurator {

    private static final String JAMON_PLUGIN_ARTIFACT_ID = "jamon-maven-plugin";

    private static final String JAMON_GROUP_ID = "org.jamon";

    static final String PLUGIN_ID = "org.jamon.eclipse.maven.configurator";

    @Override
    public void configure(ProjectConfigurationRequest request, IProgressMonitor monitor) throws CoreException {
        JamonPluginConfiguration jamonPluginConfiguration = JamonPluginConfiguration
                .forProjectConfigurationRequest(request, monitor, maven);
        if (jamonPluginConfiguration == null) {
            // Do nothing if there is no plugin configuration
            return;
        }
        Plugin jamonPlugin = getJamonPlugin(request.getMavenProject());
        if (jamonPlugin == null) {
            // Do nothing if the jamon maven plugin isn't defined
            return;
        }

        String templateSourceDir = jamonPluginConfiguration.getTemplateSourceDir();
        String templateOutputDir = jamonPluginConfiguration.getTemplateOutputDir();

        createFolder(request.getProject(), request.getProject().getFolder(templateOutputDir), monitor);

        request.getProject().getFolder(".settings").refreshLocal(IResource.DEPTH_ONE, monitor);

        Artifact jamonProcessorArtifact = jamonPluginConfiguration.getJamonProcessorArtifact();
        if (jamonProcessorArtifact != null) {
            JamonNature.addToProject(request.getProject(), templateSourceDir, templateOutputDir,
                    new ProcessorJarLocations().withProcessorSourceType(ProcessorSourceType.EXTERNAL)
                            .withExternalLocation(
                                    Path.fromOSString(jamonProcessorArtifact.getFile().getAbsolutePath())));
        } else {
            JamonNature.addToProject(request.getProject(), templateSourceDir, templateOutputDir,
                    new ProcessorJarLocations().withProcessorSourceType(ProcessorSourceType.PLUGIN));
        }

    }

    @Override
    public void unconfigure(ProjectConfigurationRequest request, IProgressMonitor monitor) throws CoreException {
        JamonNature.removeFromProject(request.getProject());
        super.unconfigure(request, monitor);
    }

    /**
     * This configures Maven Dependency Container classpath {@inheritDoc}
     */
    public void configureClasspath(IMavenProjectFacade facade, IClasspathDescriptor classpath,
            IProgressMonitor monitor) {
        // Nothing to do unless we are modifying the Maven Dependency Classpath
    }

    /**
     * This configures Eclipse's classpath. This adds templateOutputDir to the classpath
     */
    public void configureRawClasspath(ProjectConfigurationRequest request, IClasspathDescriptor classpath,
            IProgressMonitor monitor) throws CoreException {
        if (JamonNature.projectHasNature(request.getProject())) {
            JamonPluginConfiguration jamonPluginConfiguration = JamonPluginConfiguration
                    .forProjectConfigurationRequest(request, monitor, maven);
            if (jamonPluginConfiguration != null) {
                IFolder templateDir = request.getProject()
                        .getFolder(jamonPluginConfiguration.getTemplateOutputDir());
                createFolder(request.getProject(), templateDir, monitor);
                classpath.addEntry(JavaCore.newSourceEntry(templateDir.getFullPath().makeAbsolute()));
            }
        }
    }

    /**
     * Gets the Jamon plugin from pom.xml. Returns null if it is not found.
     *
     * @param project
     * @return
     */
    private static Plugin getJamonPlugin(MavenProject project) {
        for (Plugin plugin : project.getBuildPlugins()) {
            if (isJamonArtifact(plugin)) {
                return plugin;
            }
        }
        return null;
    }

    private static boolean isJamonArtifact(Plugin plugin) {
        return JAMON_GROUP_ID.equals(plugin.getGroupId())
                && JAMON_PLUGIN_ARTIFACT_ID.equals(plugin.getArtifactId());
    }

    /**
     * Creates a folder and any parent folders that don't exist inside of a project
     *
     * @param project
     * @param folder
     * @param monitor
     * @throws CoreException
     */
    private void createFolder(IProject project, IFolder folder, IProgressMonitor monitor) throws CoreException {
        if (!folder.exists()) {
            if (!folder.getParent().exists()) {
                createFolder(project, folder.getParent().getFolder(null), monitor);
            }
            folder.create(false, true, monitor);
        }
    }

}