1 /*
2 * Copyright (C) Christian Schulte, 2005-206
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * o Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 *
12 * o Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
15 * distribution.
16 *
17 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
18 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
19 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * $JOMC: AbstractModelShowMojo.java 4866 2014-02-16 17:40:24Z schulte $
29 *
30 */
31 package org.jomc.mojo;
32
33 import java.io.File;
34 import java.io.StringWriter;
35 import java.util.logging.Level;
36 import javax.xml.bind.JAXBElement;
37 import javax.xml.bind.Marshaller;
38 import org.apache.maven.plugin.MojoExecutionException;
39 import org.jomc.modlet.ModelContext;
40
41 /**
42 * Base class for displaying and dumping model objects.
43 *
44 * @author <a href="mailto:cs@schulte.it">Christian Schulte</a>
45 * @version $JOMC: AbstractModelShowMojo.java 4866 2014-02-16 17:40:24Z schulte $
46 * @since 1.1
47 */
48 public abstract class AbstractModelShowMojo extends AbstractJomcMojo
49 {
50
51 /** Constant for the name of the tool backing the mojo. */
52 private static final String TOOLNAME = "ModelProcessor";
53
54 /**
55 * File to write the model to.
56 *
57 * @parameter expression="${jomc.document}"
58 */
59 private File document;
60
61 /**
62 * Encoding of the document to write.
63 *
64 * @parameter default-value="${project.build.sourceEncoding}" expression="${jomc.documentEncoding}"
65 */
66 private String documentEncoding;
67
68 /** Creates a new {@code AbstractModelShowMojo} instance. */
69 public AbstractModelShowMojo()
70 {
71 super();
72 }
73
74 @Override
75 protected final void executeTool() throws Exception
76 {
77 this.logSeparator();
78 this.logProcessingModel( TOOLNAME, this.getModel() );
79
80 final ModelContext modelContext = this.createModelContext( this.getDisplayClassLoader() );
81 final Marshaller m = modelContext.createMarshaller( this.getModel() );
82 final JAXBElement<?> displayModel = this.getDisplayModel( modelContext );
83 m.setSchema( modelContext.createSchema( this.getModel() ) );
84 m.setProperty( Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE );
85
86 if ( displayModel != null )
87 {
88 if ( this.document == null )
89 {
90 final StringWriter stringWriter = new StringWriter();
91 m.marshal( displayModel, stringWriter );
92
93 final boolean verbose = this.isVerbose();
94 try
95 {
96 this.setVerbose( true );
97
98 if ( this.isLoggable( Level.INFO ) )
99 {
100 this.log( Level.INFO, stringWriter.toString(), null );
101 }
102 }
103 finally
104 {
105 this.setVerbose( verbose );
106 }
107 }
108 else
109 {
110 if ( this.document.exists() && !this.document.delete() && this.isLoggable( Level.WARNING ) )
111 {
112 this.log( Level.WARNING, Messages.getMessage(
113 "failedDeletingFile", this.document.getAbsolutePath() ), null );
114
115 }
116
117 if ( this.isLoggable( Level.INFO ) )
118 {
119 this.log( Level.INFO, Messages.getMessage(
120 "writingEncoded", this.document.getAbsolutePath(), this.documentEncoding ), null );
121
122 }
123
124 m.setProperty( Marshaller.JAXB_ENCODING, this.documentEncoding );
125 m.marshal( displayModel, this.document );
126 }
127
128 this.logToolSuccess( TOOLNAME );
129 }
130 else if ( this.isLoggable( Level.WARNING ) )
131 {
132 this.log( Level.WARNING, Messages.getMessage( "modelObjectNotFound" ), null );
133 }
134 }
135
136 /**
137 * Gets the model object to display or dump.
138 *
139 * @param modelContext The model context to use for getting the model.
140 *
141 * @return The model object to display or dump.
142 *
143 * @throws MojoExecutionException if getting the model fails.
144 */
145 protected abstract JAXBElement<?> getDisplayModel( ModelContext modelContext ) throws MojoExecutionException;
146
147 /**
148 * Gets the class loader to use for displaying or dumping model objects.
149 *
150 * @return The class loader to use for displaying or dumping model objects.
151 *
152 * @throws MojoExecutionException if getting the class loader fails.
153 */
154 protected abstract ClassLoader getDisplayClassLoader() throws MojoExecutionException;
155
156 }