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: 547772 $ $Date: 2007-06-15 15:59:14 -0400 (Fri, 15 Jun 2007) $ 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 /** 074 * Whether to stop or proceed when errors and failures are encountered 075 * 076 * @parameter expression="${stopOnFailure}" default-value="true" 077 */ 078 protected boolean stopOnFailure; 079 080 /** 081 * Provides hooks into the reporting interface to allow for customized reports to be generated 082 * for goal executions. 083 */ 084 public void execute() throws MojoExecutionException, MojoFailureException { 085 init(); 086 087 if ( log.isDebugEnabled() ) { 088 if ( reporters != null ) { 089 log.debug("Reporters: " + Arrays.asList(reporters)); 090 } 091 else { 092 log.debug("No reporters configured"); 093 } 094 } 095 096 reportBegin(); 097 098 try { 099 doExecute(); 100 } 101 catch ( Exception e ) { 102 reportError(e); 103 104 if ( stopOnFailure ) { 105 if ( e instanceof MojoExecutionException ) { 106 throw new MojoExecutionException(e.getMessage(), e); 107 } 108 else if ( e instanceof MojoFailureException ) { 109 MojoFailureException x = new MojoFailureException(e.getMessage()); 110 x.initCause(e); 111 throw x; 112 } 113 else { 114 throw new MojoExecutionException(e.getMessage(), e); 115 } 116 } 117 else { 118 log.warn("Ignoring failure !"); 119 } 120 } 121 finally { 122 reportEnd(); 123 } 124 } 125 126 protected File getLogFile() { 127 if (logFile == null) { 128 return new File(logOutputDirectory, getFullClassName() + ".log"); 129 } 130 131 try { 132 return logFile.getCanonicalFile(); 133 } 134 catch (java.io.IOException e) { 135 throw new RuntimeException(e); 136 } 137 } 138 139 /** 140 * Sub-class must override to provide the goal name. 141 * 142 * @return The name of the goal. 143 */ 144 protected abstract String getFullClassName(); 145 146 // 147 // Reporter 148 // 149 150 private void reportBegin() { 151 if ( reporters == null ) { 152 return; 153 } 154 155 final Reportable source = new Reportable() { 156 final Date start = new Date(); 157 158 public Date getStartTime() { 159 return start; 160 } 161 162 public String getName() { 163 return getFullClassName(); 164 } 165 166 public File getLogFile() { 167 return ReportingMojoSupport.this.getLogFile(); 168 } 169 }; 170 171 for ( int i =0; i < reporters.length; i++ ) { 172 reporters[i].reportBegin(source); 173 } 174 } 175 176 private void reportError(final Throwable cause) { 177 assert cause != null; 178 179 if ( reporters == null ) { 180 return; 181 } 182 183 for ( int i=0; i < reporters.length; i++ ) { 184 reporters[i].reportError(cause); 185 } 186 } 187 188 private void reportEnd() { 189 if ( reporters == null ) { 190 return; 191 } 192 193 for ( int i=0; i < reporters.length; i++ ) { 194 reporters[i].reportEnd(); 195 } 196 } 197 }