001 /**
002 * Copyright 2004-2012 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.apache.torque.mojo;
017
018 import org.apache.maven.execution.MavenSession;
019 import org.apache.maven.plugin.AbstractMojo;
020 import org.apache.maven.plugin.MojoExecutionException;
021 import org.apache.maven.plugin.MojoFailureException;
022 import org.apache.maven.project.MavenProject;
023 import org.apache.maven.settings.Settings;
024 import org.kuali.maven.mojo.MavenLogger;
025
026 /**
027 * Mojo essentials. Contains the "skip" logic that is the de facto standard for
028 * maven plugins. Contains a number of maven related properties that are common
029 * to most mojos. Also sets up logging so that if libraries called by a mojo
030 * issue log statements to Jakarta Commons Logging or Log4j, those log messages
031 * are shown in maven's output
032 */
033 public abstract class BaseMojo extends AbstractMojo {
034 public static final String FS = System.getProperty("file.separator");
035 public static final String SKIP_PACKAGING_TYPE = "pom";
036
037 /**
038 * When true, redirect logging from Log4j and Jakarta Commons Logging to the
039 * Maven logging system
040 *
041 * @parameter expression="${startMavenLogger}" default-value="true"
042 */
043 private boolean startMavenLogger;
044
045 /**
046 * When <code>true</code>, skip the execution of this mojo
047 *
048 * @parameter default-value="false"
049 */
050 private boolean skip;
051
052 /**
053 * Setting this parameter to <code>true</code> will force the execution of
054 * this mojo, even if it would get skipped usually.
055 *
056 * @parameter expression="${forceMojoExecution}" default-value="false"
057 * @required
058 */
059 private boolean forceMojoExecution;
060
061 /**
062 * The encoding to use when reading/writing files. If not specified this
063 * defaults to the platform specific encoding of whatever machine the build
064 * is running on.
065 *
066 * @parameter expression="${encoding}"
067 * default-value="${project.build.sourceEncoding}"
068 */
069 private String encoding;
070
071 /**
072 * The Maven project this plugin runs in.
073 *
074 * @parameter expression="${project}"
075 * @required
076 * @readonly
077 */
078 private MavenProject project;
079
080 /**
081 * @parameter expression="${settings}"
082 * @required
083 * @since 1.0
084 * @readonly
085 */
086 private Settings settings;
087
088 /**
089 * @parameter default-value="${session}"
090 * @required
091 * @readonly
092 */
093 private MavenSession mavenSession;
094
095 protected void beforeExecution() throws MojoExecutionException, MojoFailureException {
096 }
097
098 protected void afterExecution() throws MojoExecutionException, MojoFailureException {
099 }
100
101 @Override
102 public void execute() throws MojoExecutionException, MojoFailureException {
103 beforeExecution();
104 if (isStartMavenLogger()) {
105 MavenLogger.startPluginLog(this);
106 }
107 if (skipMojo()) {
108 return;
109 }
110 executeMojo();
111 if (isStartMavenLogger()) {
112 MavenLogger.endPluginLog(this);
113 }
114 afterExecution();
115 }
116
117 protected abstract void executeMojo() throws MojoExecutionException, MojoFailureException;
118
119 /**
120 * <p>
121 * Determine if the mojo execution should get skipped.
122 * </p>
123 * This is the case if:
124 * <ul>
125 * <li>{@link #skip} is <code>true</code></li>
126 * <li>if the mojo gets executed on a project with packaging type 'pom' and
127 * {@link #forceMojoExecution} is <code>false</code></li>
128 * </ul>
129 *
130 * @return <code>true</code> if the mojo execution should be skipped.
131 */
132 protected boolean skipMojo() {
133 if (skip) {
134 getLog().info("Skipping execution");
135 return true;
136 }
137
138 if (!forceMojoExecution && project != null && SKIP_PACKAGING_TYPE.equals(project.getPackaging())) {
139 getLog().info("Skipping execution for project with packaging type '" + SKIP_PACKAGING_TYPE + "'");
140 return true;
141 }
142
143 return false;
144 }
145
146 /**
147 * Returns the maven project.
148 *
149 * @return The maven project where this plugin runs in.
150 */
151 public MavenProject getProject() {
152 return project;
153 }
154
155 public String getEncoding() {
156 return encoding;
157 }
158
159 public void setEncoding(String encoding) {
160 this.encoding = encoding;
161 }
162
163 public boolean isSkip() {
164 return skip;
165 }
166
167 public void setSkip(boolean skip) {
168 this.skip = skip;
169 }
170
171 public boolean isForceMojoExecution() {
172 return forceMojoExecution;
173 }
174
175 public void setForceMojoExecution(boolean forceMojoExecution) {
176 this.forceMojoExecution = forceMojoExecution;
177 }
178
179 public Settings getSettings() {
180 return settings;
181 }
182
183 public void setSettings(Settings settings) {
184 this.settings = settings;
185 }
186
187 public MavenSession getMavenSession() {
188 return mavenSession;
189 }
190
191 public void setMavenSession(MavenSession mavenSession) {
192 this.mavenSession = mavenSession;
193 }
194
195 public void setProject(MavenProject project) {
196 this.project = project;
197 }
198
199 public boolean isStartMavenLogger() {
200 return startMavenLogger;
201 }
202
203 public void setStartMavenLogger(boolean startMavenLogger) {
204 this.startMavenLogger = startMavenLogger;
205 }
206 }