All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.teatrove.maven.plugins.teacompiler.TeaCompilerMojo Maven / Gradle / Ivy

The newest version!
/*
 *  Copyright 1997-2011 teatrove.org
 *
 *  Licensed 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.
 */

package org.teatrove.maven.plugins.teacompiler;

import org.teatrove.maven.plugins.teacompiler.contextclassbuilder.DefaultContextClassBuilderHelper;
import org.teatrove.maven.plugins.teacompiler.contextclassbuilder.TeaCompilerExpressionEvaluator;
import org.teatrove.maven.teacompiler.contextclassbuilder.api.ContextClassBuilder;
import org.teatrove.maven.teacompiler.contextclassbuilder.api.ContextClassBuilderException;
import org.teatrove.maven.teacompiler.contextclassbuilder.api.ContextClassBuilderHelper;
import org.teatrove.tea.compiler.ErrorEvent;
import org.teatrove.tea.compiler.ErrorListener;
import org.teatrove.tea.util.FileCompiler;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.path.PathTranslator;
import org.codehaus.plexus.PlexusConstants;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.context.Context;
import org.codehaus.plexus.context.ContextException;
import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;

/**
 * A Maven 2 goal responsible for compiling Tea templates.
 *
 * @author Brian Jackson
 * @phase compile
 * @goal compile
 * @requiresDependencyResolution
 * @configurator include-project-dependencies
 * @since Jul 23, 2008 1:41:16 PM
 */
public class TeaCompilerMojo extends AbstractMojo implements Contextualizable {


    /**
     * Path Translator needed by the ExpressionEvaluator
     *
     * @component role="org.apache.maven.project.path.PathTranslator"
     */
    protected PathTranslator translator;

    /**
     * The MavenSession
     *
     * @parameter expression="${session}"
     */
    protected MavenSession session;

    /**
     * POM
     *
     * @parameter expression="${project}"
     * @readonly
     * @required
     */
    protected MavenProject project;


    /**
     * The configuration for a custom ContextClassBuilder.
     *
     * @parameter
     */
    private ContextClassBuilder contextClassBuilder;

    /**
     * The class name to use as the Tea context, if not set
     * The contextClassBuilder is used.
     *
     * @parameter
     */
    private String context;

    /**
     * The default directory to use to find Tea templates if none are specified.
     *
     * @parameter default-value="src/main/tea"
     * @readonly
     */
    private File defaultSourceDirectory;

    /**
     * A list of directories where Tea templates are located.
     *
     * @parameter
     */
    private File[] sourceDirectories;

    /**
     * The directory the compiled Tea templates should be written to.
     *
     * @parameter default-value="${project.build.outputDirectory}"
     */
    private File outputDirectory;

    /**
     * @parameter default-value="false"
     */
    private boolean force;

    /**
     * The root package the Tea templates should be compiled under.
     *
     * @parameter default-value="org.teatrove.teaservlet.template"
     */
    private String rootPackage;

    /**
     * @parameter
     */
    private String encoding;

    /**
     * @parameter default-value="false"
     */
    private boolean guardian;

    /**
     * @parameter
     */
    private String[] includes;

    /**
     * @parameter default-value="true"
     */
    private boolean failOnError;


    // set by the contextualize method. Only way to get the
    // plugin's container in 2.0.x
    protected PlexusContainer container;

    public void contextualize(Context context)
            throws ContextException {
        container = (PlexusContainer) context.get(PlexusConstants.PLEXUS_KEY);
    }


    public void execute() throws MojoExecutionException, MojoFailureException {

        final Log logger = getLog();

        // Create the Helper for the Context Class Builder
        ContextClassBuilderHelper helper =
                new DefaultContextClassBuilderHelper(
                        session,
                        new TeaCompilerExpressionEvaluator(session, translator, project),
                        logger, container, this.getClass().getClassLoader(), rootPackage
                );

        // Merge the contexts
        final Class contextClass;
        try {
            if(this.context == null) {
                if(contextClassBuilder == null) {
                    throw new MojoExecutionException("Either context or contextClassBuilder parameter is required.");
                }
                contextClass = contextClassBuilder.getContextClass(helper);
            } else {
                contextClass = Class.forName(this.context);
            }
        } catch (ContextClassBuilderException e) {
            throw new MojoExecutionException("Unable to find or create the Context.", e);
        } catch (ClassNotFoundException e) {
            throw new MojoExecutionException("Unable to load the Context.", e);
        }

        final File realOutputDirectory = new File(outputDirectory, rootPackage.replace('.', File.separatorChar));

        realOutputDirectory.mkdirs();

        if (sourceDirectories == null || sourceDirectories.length == 0) {
            sourceDirectories = new File[]{defaultSourceDirectory};
        } else {
            // Filter out any that don't exist
            List existing = new ArrayList(sourceDirectories.length);
            for (File sourceDirectory : sourceDirectories) {
                if (sourceDirectory.exists()) {
                    existing.add(sourceDirectory);
                } else if (logger.isDebugEnabled()) {
                    logger.debug("Removing source directory because it does not exist. [" + sourceDirectory + "].");
                }
            }
            sourceDirectories = existing.toArray(new File[existing.size()]);
        }

        final FileCompiler compiler =
                new FileCompiler(sourceDirectories, rootPackage, realOutputDirectory, null, encoding);

        compiler.setClassLoader(contextClass.getClassLoader());
        compiler.setRuntimeContext(contextClass);
        compiler.setForceCompile(force);
        compiler.addErrorListener(new ErrorListener() {
            public void compileError(ErrorEvent e) {
                logger.error(e.getDetailedErrorMessage());
            }
        });
        compiler.setExceptionGuardianEnabled(guardian);

        final String[] names;
        try {
            if (includes == null || includes.length == 0) {
                names = compiler.compileAll(true);
            } else {
                names = compiler.compile(includes);
            }
        } catch (IOException e) {
            throw new MojoExecutionException("I/O error while compiling templates.", e);
        }

        final int errorCount = compiler.getErrorCount();

        if (errorCount > 0) {
            String msg = errorCount + " error" + (errorCount != 1 ? "s" : "");
            if(failOnError) {
                throw new MojoFailureException(msg);
            } else if(logger.isWarnEnabled()){
                logger.warn(msg);
            }
        }

        if (logger.isInfoEnabled()) {
            logger.info("Compiled the following templates:");
            Arrays.sort(names);
            for (String name : names) {
                logger.info(name);
            }
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy