org.codehaus.mojo.sysdeo.SysdeoMojo.java Source code

Java tutorial

Introduction

Here is the source code for org.codehaus.mojo.sysdeo.SysdeoMojo.java

Source

package org.codehaus.mojo.sysdeo;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.FileUtils;
import org.apache.maven.plugin.MojoExecutionException;
import org.codehaus.mojo.sysdeo.ide.AbstractIdeSupportMojo;
import org.codehaus.mojo.sysdeo.ide.IdeDependency;
import org.codehaus.mojo.sysdeo.ide.IdeUtils;
import org.codehaus.plexus.util.xml.Xpp3Dom;
import org.codehaus.plexus.util.xml.Xpp3DomBuilder;
import org.codehaus.plexus.util.xml.Xpp3DomWriter;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;

/**
 * Generates the required configuration files for the eclipse Sysdeo-tomcat plugin
 *
 * @goal generate
 */
public class SysdeoMojo extends AbstractIdeSupportMojo {

    private static final String TOMCAT_PLUGIN = ".tomcatplugin";

    /**
     * Single directory for extra files to include in the WAR.
     *
     * @parameter expression="${basedir}/src/main/webapp"
     * @required
     */
    private File warSourceDirectory;

    /**
     * Application context definition for Tomcat.
     *
     * @parameter expression="${basedir}/src/main/webapp/META-INF/context.xml"
     * @required
     */
    private File contextDefinition;

    /**
     * Web application context path
     *
     * @parameter default-value="${project.build.finalName}"
     */
    private String webPath;

    /**
     * Use the M2_REPO Classpath Variable to point to dependencies in the local repository. MUST be set to false to use
     * this plugin with m2eclipse project import configurator.
     *
     * @parameter default-value="true"
     */
    private boolean useClasspathVariable;

    private List ignoreArtifact;

    /**
     * define artifacts to exclude from the devloader classpath as they create conflicts (LinkageErrors) with Tomcat
     * classes and APIs
     *
     * @parameter
     */
    private String[] ignoredArtifacts;

    public SysdeoMojo() {
        ignoreArtifact = new ArrayList();
        ignoreArtifact.add("jsp-api");
        ignoreArtifact.add("el-api");
        ignoreArtifact.add("servlet-api");
        ignoreArtifact.add("gwt-user");
    }

    protected boolean getUseProjectReferences() {
        return true;
    }

    protected boolean setup() {
        if (ignoredArtifacts != null) {
            for (int i = 0; i < ignoredArtifacts.length; i++) {
                ignoreArtifact.add(ignoredArtifacts[i]);
            }
        }
        if (!getProject().getPackaging().equals("war")) {
            getLog().info("Not executing sysdeo-tomcat plugin, this is project is not a war package");
            return false;
        }

        return true;
    }

    protected void writeConfiguration(IdeDependency[] dependencies) throws MojoExecutionException {

        File webclasspath = new File(warSourceDirectory, ".#webclasspath");
        if (webclasspath.exists()) {
            webclasspath.delete();
        }

        File projectDir = getProject().getBasedir();

        forceTomcatNature(projectDir);

        List referencedProjects = new ArrayList();
        List jarDependencies = new ArrayList();
        List systemDependencyPaths = new ArrayList();

        IdeDependency thisDependency = new IdeDependency();
        thisDependency.setGroupId(getProject().getGroupId());
        thisDependency.setArtifactId(getProject().getArtifactId());
        thisDependency.setVersion(getProject().getVersion());
        thisDependency = resolveWorkspaceProject(thisDependency);
        thisDependency.setOutputDirectory(getOutputDirectory());

        referencedProjects.add(thisDependency);

        for (int i = 0; i < dependencies.length; i++) {
            IdeDependency dependency = dependencies[i];
            if (dependency.isProvided() || dependency.isTestDependency()) {
                // Skip this dependency
                continue;
            }
            if (dependency.isReferencedProject() || getWorkspaceProjects().contains(dependency)) {
                referencedProjects.add(dependency);
            } else if (dependency.isSystemScoped()) {
                String absolutePath = dependency.getFile().getAbsolutePath();
                String osName = System.getProperty("os.name");
                if (osName.toUpperCase().indexOf("WINDOWS") >= 0) {
                    absolutePath = absolutePath.substring(0, 1).toUpperCase() + absolutePath.substring(1);
                    absolutePath = absolutePath.replace('\\', '/');
                }
                systemDependencyPaths.add(absolutePath);
            } else if (dependency.getType().equalsIgnoreCase("jar")
                    && !ignoreArtifact.contains(dependency.getArtifactId())) {
                jarDependencies.add(dependency);
            }
        }

        String extraContext = "";
        try {
            String contextString = FileUtils.readFileToString(contextDefinition, "UTF-8");
            int context = contextString.indexOf("Context");
            int start = contextString.indexOf(">", context);
            int stop = contextString.indexOf("</Context>");
            extraContext = contextString.substring(start + 1, stop);
            extraContext = URLEncoder.encode(extraContext);
        } catch (Exception e) {
            getLog().info("No valid context file found at: " + contextDefinition);
        }

        Configuration cfg = new Configuration();
        cfg.setClassForTemplateLoading(SysdeoMojo.class, "");

        Map context = new HashMap();
        context.put("referencedProjects", referencedProjects);
        context.put("jarDependencies", jarDependencies);
        context.put("systemDependencyPaths", systemDependencyPaths);
        context.put("webPath", webPath);
        context.put("localRepository", useClasspathVariable ? "M2_REPO" : getLocalRepository().getBasedir());
        context.put("warSourceDir",
                IdeUtils.toRelativeAndFixSeparator(getProject().getBasedir(), getWarSourceDirectory(), false));
        context.put("extraContext", extraContext);

        File tomcatPluginFile = new File(projectDir, TOMCAT_PLUGIN);
        try {
            Writer configWriter = new FileWriter(tomcatPluginFile);
            Template template = cfg.getTemplate("tomcatplugin.fm");
            template.process(context, configWriter);
            configWriter.flush();
            configWriter.close();
            getLog().info("Write tomcat plugin file to: " + tomcatPluginFile.getAbsolutePath());
        } catch (IOException ioe) {
            throw new MojoExecutionException("Unable to write tomcat plugin config file", ioe);
        } catch (TemplateException te) {
            throw new MojoExecutionException("Unable to merge freemarker template", te);
        }
    }

    protected void forceTomcatNature(File projectDir) {
        try {
            File dotProject = new File(projectDir, ".project");
            String content = FileUtils.readFileToString(dotProject, null);
            if (content.indexOf("<nature>com.sysdeo.eclipse.tomcat.tomcatnature</nature>") < 0) {
                getLog().info("Add tomcat nature to the eclipse .project file");
                try {
                    Xpp3Dom dom = Xpp3DomBuilder.build(new FileReader(dotProject));
                    Xpp3Dom nature = new Xpp3Dom("nature");
                    nature.setValue("com.sysdeo.eclipse.tomcat.tomcatnature");
                    dom.getChild("natures").addChild(nature);
                    FileWriter writer = new FileWriter(dotProject);
                    Xpp3DomWriter.write(writer, dom);
                    writer.close();
                } catch (Exception e) {
                    getLog().warn("Failed to add missing tomcat nature to the eclipse .project file", e);
                }
            }

            // Required to force devloader classpath refresh on POM changes
            File dotClassPath = new File(projectDir, ".classpath");
            FileUtils.touch(dotClassPath);
        } catch (IOException e) {
            getLog().info("Failed to retrieve the Eclipse .project file");
        }
    }

    /**
     * @return
     */
    protected String getOutputDirectory() {
        String relative = getProject().getFile().getParent();
        String buildOutputDirectory = getProject().getBuild().getOutputDirectory();
        return buildOutputDirectory.substring(relative.length() + 1).replace('\\', '/');
    }

    public File getContextDefinition() {
        return contextDefinition;
    }

    public void setContextDefinition(File contextDefinition) {
        this.contextDefinition = contextDefinition;
    }

    public File getWarSourceDirectory() {
        return warSourceDirectory;
    }

    public void setWarSourceDirectory(File warSourceDirectory) {
        this.warSourceDirectory = warSourceDirectory;
    }

    /**
     * @param useClasspathVariable the useClasspathVariable to set
     */
    public void setUseClasspathVariable(boolean useClasspathVariable) {
        this.useClasspathVariable = useClasspathVariable;
    }
}