org.ajax4jsf.builder.mojo.AbstractCDKMojo.java Source code

Java tutorial

Introduction

Here is the source code for org.ajax4jsf.builder.mojo.AbstractCDKMojo.java

Source

/**
 * License Agreement.
 *
 * Rich Faces - Natural Ajax for Java Server Faces (JSF)
 *
 * Copyright (C) 2007 Exadel, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License version 2.1 as published by the Free Software Foundation.
 *
 * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
 */

package org.ajax4jsf.builder.mojo;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.project.MavenProject;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.codehaus.plexus.velocity.VelocityComponent;

/**
 * @author shura
 *
 */
public abstract class AbstractCDKMojo extends AbstractMojo {

    /**
     * Top maven project.
     * 
     * @parameter expression="${project}"
     * @readonly
     */
    protected MavenProject project;
    /**
     * 
     * @parameter
     */
    protected String key;
    /**
     * Place for component configuration XML files. All '*.xml' files wil be
     * parsed as components config. All '*.ent' files will be processed as
     * include configurations.
     * 
     * @parameter expression="src/main/config/component"
     */
    protected File componentConfigDirectory;
    /**
     * Place for validator configuration XML files. All '*.xml' files wil be
     * parsed as component config. All '*.ent' files will be processed as
     * include configurations.
     * 
     * @parameter expression="src/main/config/validator"
     */
    protected File validatorConfigDirectory;

    /**
     * Place for converter configuration XML files. All '*.xml' files wil be
     * parsed as components config. All '*.ent' files will be processed as
     * include configurations.
     * 
     * @parameter expression="src/main/config/converter"
     */
    protected File converterConfigDirectory;

    /**
     * Place for faces configuration XML files
     * 
     * @parameter expression="src/main/config/faces"
     */
    protected File facesConfigInclude;
    /**
     * Place for component configuration XML files
     * 
     * @parameter expression="src/main/config/taglib"
     */
    protected File taglibInclude;
    /**
     * Place for component configuration XML files
     * 
     * @parameter expression="src/main/config/resources"
     */
    protected File resourcesInclude;
    /**
     * 
     * @parameter expression="src/main/templates"
     */
    protected File templatesDirectory;
    /**
     * Directory where the output Java Files will be located.
     * 
     * @parameter expression="${project.build.directory}/generated-component/java"
     */
    protected File outputJavaDirectory;

    /**
     * @parameter expression="${project.build.directory}/generated-component/test"
     */
    protected File outputTestsDirectory;

    /**
     * Directory where the output Java Files will be located.
     * 
     * @parameter expression="${project.build.directory}/generated-component/resources"
     */
    protected File outputResourcesDirectory;
    /**
     * @parameter
     */
    protected Library library;
    /**
     * The source directories containing the sources to be compiled.
     * 
     * @parameter expression="${project.compileSourceRoots}"
     * @required
     * @readonly
     */
    protected List compileSourceRoots;
    /**
     * Project classpath.
     * 
     * @parameter expression="${project.compileClasspathElements}"
     * @required
     * @readonly
     */
    protected List classpathElements;
    /**
     * The directory for compiled classes.
     * 
     * @parameter expression="${project.build.outputDirectory}"
     * @required
     * @readonly
     */
    protected File outputDirectory;
    /**
     * @component
     */
    protected VelocityComponent velocity;

    /**
     * Check library configuration, and fill all empty values to default.
     * 
     * @return
     */
    protected Taglib checkLibraryConfig() {
        if (null != library) {
            getLog().debug("Library prefix is " + library.getPrefix());
        } else {
            library = new Library();
        }
        if (null == library.getPrefix()) {
            library.setPrefix(project.getGroupId());

        }
        getLog().debug("Default prefix for a generated packages: " + library.getPrefix());
        if (null == library.getDescription()) {
            library.setDescription(project.getDescription());
        }
        getLog().debug("Library description: " + library.getDescription());
        if (null == library.getJsfVersion()) {
            String version = Library.JSF11;
            // Check version-specific methods in UIComponent class
            try {
                Class<?> componentClass = createProjectClassLoader(project, false)
                        .loadClass("javax.faces.component.UIComponent");
                Method[] methods = componentClass.getDeclaredMethods();
                for (int i = 0; i < methods.length; i++) {
                    if ("encodeAll".equals(methods[i].getName())) {
                        version = Library.JSF12;
                        break;
                    }
                }
            } catch (ClassNotFoundException e) {
                // Ignore - by defaule, generate codes for JSF 1.1
            }
            library.setJsfVersion(version);
        }

        //velocity = new DefaultVelocityComponent();

        getLog().debug("Generate files for a JSF " + library.getJsfVersion());
        Renderkit[] renderkits = library.getRenderkits();
        if (null != renderkits) {
            for (int i = 0; i < renderkits.length; i++) {
                Renderkit renderkit = renderkits[i];
                getLog().debug("Renderkit name is " + renderkit.getName());
                if (null == renderkit.getPackage()) {
                    renderkit.setPackage(library.getPrefix() + ".renderkit." + renderkit.getName().toLowerCase());
                }
            }
        } else {
            renderkits = new Renderkit[1];
            Renderkit renderkit = new Renderkit();
            renderkit.setMarkup("html");
            renderkit.setName("HTML_BASIC");
            renderkit.setPackage(library.getPrefix() + ".renderkit." + renderkit.getName().toLowerCase());
            renderkits[0] = renderkit;
            library.setRenderkits(renderkits);
        }
        Taglib taglib = library.getTaglib();
        if (null != taglib) {
            getLog().debug("Taglib uri is " + taglib.getUri());
            getLog().debug("Taglib shortname is " + taglib.getShortName());
        } else {
            taglib = new Taglib();
            library.setTaglib(taglib);
        }
        if (null == taglib.getDisplayName()) {
            taglib.setDisplayName(project.getDescription());

        }
        if (null == taglib.getJspVersion()) {
            // Jsf 1.2 can use JSP 2.1 only, other - 2.0
            taglib.setJspVersion(library.getJsfVersion().equals(Library.JSF12) ? "2.1" : "1.2");
        }
        if (null == taglib.getUri()) {
            String url = project.getUrl();
            if (null == url) {
                url = "http://";
                String[] parts = project.getGroupId().split(".");
                for (int i = parts.length - 1; i >= 0; i--) {
                    url = url + parts[i];
                    if (i > 0) {
                        url = url + ".";
                    }
                }
                url = url + "/" + project.getArtifactId();
            }
            taglib.setUri(url);

        }
        if (null == taglib.getShortName()) {
            taglib.setShortName(project.getArtifactId());

        }
        if (null == taglib.getTaglib()) {
            taglib.setTaglib(taglib.getShortName());
        }

        if (null == taglib.getTlibVersion()) {
            taglib.setTlibVersion(createTaglibVersionFromProjectVersion());
        }
        getLog().debug("Taglib uri is " + taglib.getUri());
        getLog().debug("Taglib shortname is " + taglib.getShortName());
        if (null != library.getTaglibs() && library.getTaglibs().length > 0) {
            for (int i = 0; i < library.getTaglibs().length; i++) {
                Taglib t = library.getTaglibs()[i];
                checkTaglib(t);
            }
        }
        return taglib;
    }

    private String createTaglibVersionFromProjectVersion() {
        Artifact artifact = project.getArtifact();
        String version = artifact.getVersion();
        Matcher matcher = Pattern.compile("^(\\d+(?:\\.\\d+)*)").matcher(version);
        if (matcher.find()) {
            return matcher.group(1);
        }

        return "1.2";
    }

    protected void writeParsedTemplate(String templateName, VelocityContext context, File configFile)
            throws IOException, ResourceNotFoundException, ParseErrorException, MethodInvocationException,
            Exception {
        File dir = configFile.getParentFile();
        if (!dir.exists()) {
            dir.mkdirs();
        }
        VelocityEngine engine = velocity.getEngine();
        FileWriter fileWriter = new FileWriter(configFile);
        Template velocityTemplate = engine.getTemplate(templateName);
        velocityTemplate.merge(context, fileWriter);
        fileWriter.flush();
        fileWriter.close();
    }

    protected ClassLoader createProjectClassLoader(MavenProject project, boolean useCCL) {
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        try {
            List<?> compileClasspathElements = project.getCompileClasspathElements();
            String outputDirectory = project.getBuild().getOutputDirectory();
            URL[] urls = new URL[compileClasspathElements.size() + 1];
            int i = 0;
            urls[i++] = new File(outputDirectory).toURI().toURL();
            for (Iterator<?> iter = compileClasspathElements.iterator(); iter.hasNext();) {
                String element = (String) iter.next();
                urls[i++] = new File(element).toURI().toURL();
            }

            if (useCCL) {
                classLoader = new URLClassLoader(urls, classLoader);
            } else {
                classLoader = new URLClassLoader(urls);
            }
        } catch (MalformedURLException e) {
            getLog().error("Bad URL in classpath", e);
        } catch (DependencyResolutionRequiredException e) {
            getLog().error("Dependencies not resolved ", e);
        }

        return classLoader;
    }

    protected ClassLoader createProjectClassLoader(MavenProject project) {
        return createProjectClassLoader(project, true);
    }

    protected void checkTaglib(Taglib taglib) {
        if (null == taglib.getDisplayName()) {
            taglib.setDisplayName(library.getTaglib().getDisplayName());
        }
        if (null == taglib.getShortName()) {
            taglib.setShortName(library.getTaglib().getShortName());
        }
        if (null == taglib.getJspVersion()) {
            taglib.setJspVersion(library.getTaglib().getJspVersion());
        }
        if (null == taglib.getUri()) {
            taglib.setUri(library.getTaglib().getUri() + "/" + taglib.getShortName());
        }
        if (null == taglib.getTaglib()) {
            taglib.setTaglib(taglib.getShortName());
        }
        if (null == taglib.getTlibVersion()) {
            taglib.setTlibVersion(createTaglibVersionFromProjectVersion());
        }
        getLog().debug("Taglib uri is " + taglib.getUri());
        getLog().debug("Taglib shortname is " + taglib.getShortName());
        getLog().debug("Taglib version is " + taglib.getTlibVersion());
    }

}