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: AbstractModelShowMojo.java 4613 2012-09-22 10:07:08Z schulte $
029 *
030 */
031package org.jomc.mojo;
032
033import java.io.File;
034import java.io.StringWriter;
035import java.util.logging.Level;
036import javax.xml.bind.Marshaller;
037import org.apache.maven.plugin.MojoExecutionException;
038import org.jomc.modlet.Model;
039import org.jomc.modlet.ModelContext;
040import org.jomc.modlet.ObjectFactory;
041
042/**
043 * Base class for displaying and dumping model objects.
044 *
045 * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
046 * @version $JOMC: AbstractModelShowMojo.java 4613 2012-09-22 10:07:08Z schulte $
047 * @since 1.1
048 */
049public abstract class AbstractModelShowMojo extends AbstractJomcMojo
050{
051
052    /** Constant for the name of the tool backing the mojo. */
053    private static final String TOOLNAME = "ModelProcessor";
054
055    /**
056     * File to write the model to.
057     *
058     * @parameter expression="${jomc.document}"
059     */
060    private File document;
061
062    /**
063     * Encoding of the document to write.
064     *
065     * @parameter default-value="${project.build.sourceEncoding}" expression="${jomc.documentEncoding}"
066     */
067    private String documentEncoding;
068
069    /** Creates a new {@code AbstractModelShowMojo} instance. */
070    public AbstractModelShowMojo()
071    {
072        super();
073    }
074
075    @Override
076    protected final void executeTool() throws Exception
077    {
078        this.logSeparator();
079        this.logProcessingModel( TOOLNAME, this.getModel() );
080
081        final ModelContext modelContext = this.createModelContext( this.getDisplayClassLoader() );
082        final Marshaller m = modelContext.createMarshaller( this.getModel() );
083        final Model displayModel = this.getDisplayModel( modelContext );
084        m.setSchema( modelContext.createSchema( this.getModel() ) );
085        m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
086
087        if ( displayModel != null )
088        {
089            if ( this.document == null )
090            {
091                final StringWriter stringWriter = new StringWriter();
092                m.marshal( new ObjectFactory().createModel( displayModel ), stringWriter );
093
094                final boolean verbose = this.isVerbose();
095                try
096                {
097                    this.setVerbose( true );
098
099                    if ( this.isLoggable( Level.INFO ) )
100                    {
101                        this.log( Level.INFO, stringWriter.toString(), null );
102                    }
103                }
104                finally
105                {
106                    this.setVerbose( verbose );
107                }
108            }
109            else
110            {
111                if ( this.document.exists() && !this.document.delete() && this.isLoggable( Level.WARNING ) )
112                {
113                    this.log( Level.WARNING, Messages.getMessage(
114                        "failedDeletingFile", this.document.getAbsolutePath() ), null );
115
116                }
117
118                if ( this.isLoggable( Level.INFO ) )
119                {
120                    this.log( Level.INFO, Messages.getMessage(
121                        "writingEncoded", this.document.getAbsolutePath(), this.documentEncoding ), null );
122
123                }
124
125                m.setProperty( Marshaller.JAXB_ENCODING, this.documentEncoding );
126                m.marshal( new ObjectFactory().createModel( displayModel ), this.document );
127            }
128
129            this.logToolSuccess( TOOLNAME );
130        }
131        else if ( this.isLoggable( Level.WARNING ) )
132        {
133            this.log( Level.WARNING, Messages.getMessage( "modelObjectNotFound" ), null );
134        }
135    }
136
137    /**
138     * Gets the model to display or dump.
139     *
140     * @param modelContext The model context to use for getting the model.
141     *
142     * @return The model to display or dump.
143     *
144     * @throws MojoExecutionException if getting the model fails.
145     */
146    protected abstract Model getDisplayModel( ModelContext modelContext ) throws MojoExecutionException;
147
148    /**
149     * Gets the class loader to use for displaying or dumping model objects.
150     *
151     * @return The class loader to use for displaying or dumping model objects.
152     *
153     * @throws MojoExecutionException if getting the class loader fails.
154     */
155    protected abstract ClassLoader getDisplayClassLoader() throws MojoExecutionException;
156
157}