001    /*
002     *   Copyright (C) Christian Schulte, 2005-206
003     *   All rights reserved.
004     *
005     *   Redistribution and use in source and binary forms, with or without
006     *   modification, are permitted provided that the following conditions
007     *   are met:
008     *
009     *     o Redistributions of source code must retain the above copyright
010     *       notice, this list of conditions and the following disclaimer.
011     *
012     *     o Redistributions in binary form must reproduce the above copyright
013     *       notice, this list of conditions and the following disclaimer in
014     *       the documentation and/or other materials provided with the
015     *       distribution.
016     *
017     *   THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
018     *   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
019     *   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
020     *   THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
021     *   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
022     *   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
023     *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
024     *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
025     *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
026     *   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
027     *
028     *   $JOMC: AbstractClassesValidateMojo.java 3838 2011-10-08 20:15:41Z schulte2005 $
029     *
030     */
031    package org.jomc.mojo;
032    
033    import java.io.File;
034    import java.util.logging.Level;
035    import javax.xml.bind.JAXBContext;
036    import javax.xml.bind.util.JAXBSource;
037    import javax.xml.transform.Source;
038    import org.apache.maven.plugin.MojoExecutionException;
039    import org.jomc.model.Module;
040    import org.jomc.modlet.ModelContext;
041    import org.jomc.modlet.ModelValidationReport;
042    import org.jomc.modlet.ObjectFactory;
043    import org.jomc.tools.ClassFileProcessor;
044    
045    /**
046     * Base class for validating class file model objects.
047     *
048     * @author <a href="mailto:schulte2005@users.sourceforge.net">Christian Schulte</a>
049     * @version $JOMC: AbstractClassesValidateMojo.java 3838 2011-10-08 20:15:41Z schulte2005 $
050     */
051    public abstract class AbstractClassesValidateMojo extends AbstractJomcMojo
052    {
053    
054        /** Constant for the name of the tool backing the mojo. */
055        private static final String TOOLNAME = "ClassFileProcessor";
056    
057        /** Creates a new {@code AbstractClassesValidateMojo} instance. */
058        public AbstractClassesValidateMojo()
059        {
060            super();
061        }
062    
063        @Override
064        protected final void executeTool() throws Exception
065        {
066            this.logSeparator();
067    
068            if ( this.isClassProcessingEnabled() )
069            {
070                this.logProcessingModule( TOOLNAME, this.getClassesModuleName() );
071    
072                final ModelContext context = this.createModelContext( this.getClassesClassLoader() );
073                final ClassFileProcessor tool = this.createClassFileProcessor( context );
074                final JAXBContext jaxbContext = context.createContext( this.getModel() );
075                final Source source = new JAXBSource( jaxbContext, new ObjectFactory().createModel( tool.getModel() ) );
076                ModelValidationReport validationReport = context.validateModel( this.getModel(), source );
077                this.log( context, validationReport.isModelValid() ? Level.INFO : Level.SEVERE, validationReport );
078    
079                if ( validationReport.isModelValid() )
080                {
081                    final Module module = tool.getModules().getModule( this.getClassesModuleName() );
082    
083                    if ( module != null )
084                    {
085                        validationReport = tool.validateModelObjects( module, context, this.getClassesDirectory() );
086                        this.log( context, validationReport.isModelValid() ? Level.INFO : Level.SEVERE, validationReport );
087    
088                        if ( !validationReport.isModelValid() )
089                        {
090                            throw new MojoExecutionException( Messages.getMessage( "classFileValidationFailure" ) );
091                        }
092    
093                        this.logToolSuccess( TOOLNAME );
094                    }
095                    else
096                    {
097                        this.logMissingModule( this.getClassesModuleName() );
098                    }
099                }
100                else
101                {
102                    throw new MojoExecutionException( Messages.getMessage( "classFileValidationFailure" ) );
103                }
104            }
105            else if ( this.isLoggable( Level.INFO ) )
106            {
107                this.log( Level.INFO, Messages.getMessage( "classFileValidationDisabled" ), null );
108            }
109        }
110    
111        /**
112         * Gets the name of the module to validate class file model objects of.
113         *
114         * @return The name of the module to validate class file model objects of.
115         *
116         * @throws MojoExecutionException if getting the name fails.
117         */
118        protected abstract String getClassesModuleName() throws MojoExecutionException;
119    
120        /**
121         * Gets the class loader to use for validating class file model objects.
122         *
123         * @return The class loader to use for validating class file model objects.
124         *
125         * @throws MojoExecutionException if getting the class loader fails.
126         */
127        protected abstract ClassLoader getClassesClassLoader() throws MojoExecutionException;
128    
129        /**
130         * Gets the directory holding the class files to validate model objects of.
131         *
132         * @return The directory holding the class files to validate model objects of.
133         *
134         * @throws MojoExecutionException if getting the directory fails.
135         */
136        protected abstract File getClassesDirectory() throws MojoExecutionException;
137    
138    }