View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.logging;
20  
21  import org.apache.maven.execution.ExecutionEvent;
22  import org.apache.maven.execution.ExecutionListener;
23  import org.apache.maven.execution.MavenExecutionRequest;
24  import org.apache.maven.execution.MavenSession;
25  import org.apache.maven.execution.ProjectExecutionEvent;
26  import org.apache.maven.execution.ProjectExecutionListener;
27  import org.apache.maven.lifecycle.LifecycleExecutionException;
28  import org.apache.maven.lifecycle.internal.ReactorBuildStatus;
29  
30  public class LoggingExecutionListener implements ExecutionListener, ProjectExecutionListener {
31  
32      private final ExecutionListener delegate;
33      private final BuildEventListener buildEventListener;
34  
35      public LoggingExecutionListener(ExecutionListener delegate, BuildEventListener buildEventListener) {
36          this.delegate = delegate;
37          this.buildEventListener = buildEventListener;
38      }
39  
40      @Override
41      public void beforeProjectExecution(ProjectExecutionEvent projectExecutionEvent)
42              throws LifecycleExecutionException {}
43  
44      @Override
45      public void beforeProjectLifecycleExecution(ProjectExecutionEvent projectExecutionEvent)
46              throws LifecycleExecutionException {}
47  
48      @Override
49      public void afterProjectExecutionSuccess(ProjectExecutionEvent projectExecutionEvent)
50              throws LifecycleExecutionException {}
51  
52      @Override
53      public void afterProjectExecutionFailure(ProjectExecutionEvent projectExecutionEvent) {
54          MavenSession session = projectExecutionEvent.getSession();
55          boolean halted;
56          // The ReactorBuildStatus is only available if the SmartBuilder is used
57          ReactorBuildStatus status =
58                  (ReactorBuildStatus) session.getRepositorySession().getData().get(ReactorBuildStatus.class);
59          if (status != null) {
60              halted = status.isHalted();
61          } else {
62              // assume sensible default
63              Throwable t = projectExecutionEvent.getCause();
64              halted = (t instanceof RuntimeException || !(t instanceof Exception))
65                      || !MavenExecutionRequest.REACTOR_FAIL_NEVER.equals(session.getReactorFailureBehavior())
66                              && !MavenExecutionRequest.REACTOR_FAIL_AT_END.equals(session.getReactorFailureBehavior());
67          }
68          Throwable cause = projectExecutionEvent.getCause();
69          buildEventListener.executionFailure(
70                  projectExecutionEvent.getProject().getArtifactId(), halted, cause != null ? cause.toString() : null);
71      }
72  
73      @Override
74      public void projectDiscoveryStarted(ExecutionEvent event) {
75          setMdc(event);
76          delegate.projectDiscoveryStarted(event);
77      }
78  
79      @Override
80      public void sessionStarted(ExecutionEvent event) {
81          setMdc(event);
82          buildEventListener.sessionStarted(event);
83          delegate.sessionStarted(event);
84      }
85  
86      @Override
87      public void sessionEnded(ExecutionEvent event) {
88          setMdc(event);
89          delegate.sessionEnded(event);
90      }
91  
92      @Override
93      public void projectStarted(ExecutionEvent event) {
94          setMdc(event);
95          buildEventListener.projectStarted(event.getProject().getArtifactId());
96          delegate.projectStarted(event);
97      }
98  
99      @Override
100     public void projectSucceeded(ExecutionEvent event) {
101         setMdc(event);
102         delegate.projectSucceeded(event);
103         buildEventListener.projectFinished(event.getProject().getArtifactId());
104     }
105 
106     @Override
107     public void projectFailed(ExecutionEvent event) {
108         setMdc(event);
109         delegate.projectFailed(event);
110         buildEventListener.projectFinished(event.getProject().getArtifactId());
111     }
112 
113     @Override
114     public void projectSkipped(ExecutionEvent event) {
115         setMdc(event);
116         buildEventListener.projectStarted(event.getProject().getArtifactId());
117         delegate.projectSkipped(event);
118         buildEventListener.projectFinished(event.getProject().getArtifactId());
119     }
120 
121     @Override
122     public void mojoStarted(ExecutionEvent event) {
123         setMdc(event);
124         buildEventListener.mojoStarted(event);
125         delegate.mojoStarted(event);
126     }
127 
128     @Override
129     public void mojoSucceeded(ExecutionEvent event) {
130         setMdc(event);
131         delegate.mojoSucceeded(event);
132     }
133 
134     @Override
135     public void mojoFailed(ExecutionEvent event) {
136         setMdc(event);
137         delegate.mojoFailed(event);
138     }
139 
140     @Override
141     public void mojoSkipped(ExecutionEvent event) {
142         setMdc(event);
143         delegate.mojoSkipped(event);
144     }
145 
146     @Override
147     public void forkStarted(ExecutionEvent event) {
148         setMdc(event);
149         delegate.forkStarted(event);
150         ProjectBuildLogAppender.setForkingProjectId(event.getProject().getArtifactId());
151     }
152 
153     @Override
154     public void forkSucceeded(ExecutionEvent event) {
155         delegate.forkSucceeded(event);
156         ProjectBuildLogAppender.setForkingProjectId(null);
157     }
158 
159     @Override
160     public void forkFailed(ExecutionEvent event) {
161         delegate.forkFailed(event);
162         ProjectBuildLogAppender.setForkingProjectId(null);
163     }
164 
165     @Override
166     public void forkedProjectStarted(ExecutionEvent event) {
167         setMdc(event);
168         delegate.forkedProjectStarted(event);
169     }
170 
171     @Override
172     public void forkedProjectSucceeded(ExecutionEvent event) {
173         setMdc(event);
174         delegate.forkedProjectSucceeded(event);
175         ProjectBuildLogAppender.setProjectId(null);
176     }
177 
178     @Override
179     public void forkedProjectFailed(ExecutionEvent event) {
180         setMdc(event);
181         delegate.forkedProjectFailed(event);
182         ProjectBuildLogAppender.setProjectId(null);
183     }
184 
185     private void setMdc(ExecutionEvent event) {
186         if (event.getProject() != null) {
187             ProjectBuildLogAppender.setProjectId(event.getProject().getArtifactId());
188         }
189     }
190 }