001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019
020 package org.apache.geronimo.mavenplugins.geronimo.reporting;
021
022 import org.apache.geronimo.mavenplugins.geronimo.GeronimoMojoSupport;
023
024 import java.io.File;
025 import java.util.Date;
026 import java.util.Arrays;
027
028 import org.apache.maven.plugin.MojoExecutionException;
029 import org.apache.maven.plugin.MojoFailureException;
030
031 /**
032 * Support for Geronimo mojos which can be processed by a set of {@link Reporter}s.
033 *
034 * @version $Rev: 451383 $ $Date: 2006-09-29 11:54:33 -0700 (Fri, 29 Sep 2006) $
035 */
036 public abstract class ReportingMojoSupport
037 extends GeronimoMojoSupport
038 {
039 /**
040 * Enable logging mode.
041 *
042 * @parameter expression="${logOutput}" default-value="false"
043 */
044 protected boolean logOutput = false;
045
046 //
047 // TODO: Figure out how to inject the mojo's goal name
048 //
049
050 /**
051 * The directory where log files will be put under.
052 *
053 * @parameter expression="${logOutputDirectory}" default-value="${project.build.directory}/geronimo-logs"
054 */
055 protected File logOutputDirectory;
056
057 /**
058 * When logOutput is enabled, the output is logged to the file location specified here. If this
059 * value is not present, then "${logOutputDirectory}/<em>goal-name</em>" log will be used.
060 *
061 * @parameter
062 */
063 protected File logFile = null;
064
065 /**
066 * A set of reporters which will do something interesting with the execution results.
067 *
068 * @parameter
069 */
070 protected Reporter[] reporters = null;
071
072 /**
073 * Provides hooks into the reporting interface to allow for customized reports to be generated
074 * for goal executions.
075 */
076 public void execute() throws MojoExecutionException, MojoFailureException {
077 init();
078
079 if (log.isDebugEnabled()) {
080 if (reporters != null) {
081 log.debug("Reporters: " + Arrays.asList(reporters));
082 }
083 else {
084 log.debug("No reporters configured");
085 }
086 }
087
088 reportBegin();
089
090 try {
091 doExecute();
092 }
093 catch(Exception e) {
094 reportError(e);
095
096 if (e instanceof MojoExecutionException) {
097 throw new MojoExecutionException(e.getMessage(), e);
098 }
099 else if (e instanceof MojoFailureException) {
100 MojoFailureException x = new MojoFailureException(e.getMessage());
101 x.initCause(e);
102 throw x;
103 }
104 else {
105 throw new MojoExecutionException(e.getMessage(), e);
106 }
107 }
108 finally {
109 reportEnd();
110 }
111 }
112
113 protected File getLogFile() {
114 if (logFile == null) {
115 return new File(logOutputDirectory, getGoalName() + ".log");
116 }
117
118 return logFile;
119 }
120
121 /**
122 * Sub-class must override to provide the goal name.
123 *
124 * @return The name of the goal.
125 */
126 protected abstract String getGoalName();
127
128 //
129 // Reporter
130 //
131
132 private void reportBegin() {
133 if (reporters == null) {
134 return;
135 }
136
137 final Reportable source = new Reportable() {
138 final Date start = new Date();
139
140 public Date getStartTime() {
141 return start;
142 }
143
144 public String getName() {
145 return getGoalName();
146 }
147
148 public File getLogFile() {
149 return ReportingMojoSupport.this.getLogFile();
150 }
151 };
152
153 for (int i =0; i < reporters.length; i++) {
154 reporters[i].reportBegin(source);
155 }
156 }
157
158 private void reportError(final Throwable cause) {
159 assert cause != null;
160
161 if (reporters == null) {
162 return;
163 }
164
165 for (int i=0; i < reporters.length; i++) {
166 reporters[i].reportError(cause);
167 }
168 }
169
170 private void reportEnd() {
171 if (reporters == null) {
172 return;
173 }
174
175 for (int i=0; i < reporters.length; i++) {
176 reporters[i].reportEnd();
177 }
178 }
179 }