1 package org
.argeo
.slc
.ant
;
4 import java
.util
.Vector
;
6 import org
.apache
.log4j
.AppenderSkeleton
;
7 import org
.apache
.log4j
.Level
;
8 import org
.apache
.log4j
.MDC
;
9 import org
.apache
.log4j
.spi
.LoggingEvent
;
10 import org
.apache
.tools
.ant
.BuildEvent
;
11 import org
.apache
.tools
.ant
.BuildListener
;
12 import org
.apache
.tools
.ant
.Project
;
13 import org
.argeo
.slc
.core
.SlcException
;
14 import org
.argeo
.slc
.core
.process
.SlcExecution
;
15 import org
.argeo
.slc
.core
.process
.SlcExecutionNotifier
;
16 import org
.argeo
.slc
.core
.process
.SlcExecutionStep
;
18 public class SlcExecutionBuildListener
extends AppenderSkeleton
implements
20 private List
<SlcExecutionNotifier
> notifiers
= new Vector
<SlcExecutionNotifier
>();
22 private boolean currentStepNotified
= true;
26 * Whether to log Ant initialization stuff before the first target has been
29 private boolean logBeforeFirstTarget
= false;
30 /** Whether the first target has been called. */
31 private boolean firstTargetStarted
= false;
33 private boolean logTaskStartFinish
= true;
35 public SlcExecutionBuildListener() {
37 setThreshold(Level
.INFO
);
40 public void buildStarted(BuildEvent event
) {
41 SlcExecution slcExecution
= getSlcExecution(event
);
42 for (SlcExecutionNotifier notifier
: notifiers
) {
43 notifier
.newExecution(slcExecution
);
47 public void buildFinished(BuildEvent event
) {
48 SlcExecution slcExecution
= getSlcExecution(event
);
49 String oldStatus
= slcExecution
.getStatus();
50 slcExecution
.setStatus(SlcExecution
.STATUS_FINISHED
);
52 for (SlcExecutionNotifier notifier
: notifiers
) {
53 notifier
.updateStatus(slcExecution
, oldStatus
, slcExecution
58 public void messageLogged(BuildEvent event
) {
62 SlcExecution slcExecution
= getSlcExecution(event
);
63 if (slcExecution
!= null) {
64 if (currentStepNotified
) {
65 slcExecution
.getSteps().add(
66 new SlcExecutionStep("LOG", event
.getMessage()));
67 notifyStep(slcExecution
, slcExecution
.currentStep());
68 currentStepNotified
= true;
70 slcExecution
.currentStep().addLog(event
.getMessage());
73 // TODO: log before initialization?
77 public void targetStarted(BuildEvent event
) {
78 if (!firstTargetStarted
)
79 firstTargetStarted
= true;
81 addLogStep(event
, "Target " + event
.getTarget().getName() + " started");
84 public void targetFinished(BuildEvent event
) {
85 addLogStep(event
, "Target " + event
.getTarget().getName() + " finished");
88 public void taskStarted(BuildEvent event
) {
92 SlcExecution slcExecution
= getSlcExecution(event
);
93 if (!currentStepNotified
) {
94 notifyStep(slcExecution
, slcExecution
.currentStep());
95 currentStepNotified
= true;
99 if (logTaskStartFinish
)
100 msg
= "Task " + event
.getTask().getTaskName() + " started";
102 slcExecution
.getSteps().add(new SlcExecutionStep("LOG", msg
));
104 currentStepNotified
= false;
107 public void taskFinished(BuildEvent event
) {
111 SlcExecution slcExecution
= getSlcExecution(event
);
112 if (!currentStepNotified
) {
114 if (logTaskStartFinish
)
115 slcExecution
.currentStep().addLog(
116 "Task " + event
.getTask().getTaskName() + " finished");
118 notifyStep(slcExecution
, slcExecution
.currentStep());
119 currentStepNotified
= true;
123 public void setNotifiers(List
<SlcExecutionNotifier
> notifiers
) {
124 this.notifiers
= notifiers
;
127 protected SlcExecution
getSlcExecution(BuildEvent event
) {
128 return getSlcExecution(event
.getProject());
131 protected SlcExecution
getSlcExecution(Project project
) {
132 SlcExecution slcExecution
= (SlcExecution
) project
133 .getReference(AntConstants
.REF_SLC_EXECUTION
);
135 if (slcExecution
== null)
136 throw new SlcException("No SLC Execution registered.");
140 protected void addLogStep(BuildEvent event
, String msg
) {
141 SlcExecution slcExecution
= getSlcExecution(event
);
142 slcExecution
.getSteps().add(new SlcExecutionStep("LOG", msg
));
144 notifyStep(slcExecution
, slcExecution
.currentStep());
145 currentStepNotified
= true;
148 protected void notifyStep(SlcExecution slcExecution
, SlcExecutionStep step
) {
149 Vector
<SlcExecutionStep
> additionalSteps
= new Vector
<SlcExecutionStep
>();
150 additionalSteps
.add(step
);
151 notifySteps(slcExecution
, additionalSteps
);
154 protected void notifySteps(SlcExecution slcExecution
,
155 List
<SlcExecutionStep
> additionalSteps
) {
156 for (SlcExecutionNotifier notifier
: notifiers
) {
157 notifier
.addSteps(slcExecution
, additionalSteps
);
164 protected void append(LoggingEvent event
) {
165 Project project
= (Project
) MDC
.get(AntConstants
.MDC_ANT_PROJECT
);
167 throw new SlcException("No Ant project registered in Log4j MDC.");
169 SlcExecution slcExecution
= getSlcExecution(project
);
170 if (currentStepNotified
) {
171 slcExecution
.getSteps().add(
172 new SlcExecutionStep("LOG", event
.getMessage().toString()));
173 currentStepNotified
= false;
175 slcExecution
.currentStep().addLog(event
.getMessage().toString());
179 protected boolean shouldLog() {
180 return logBeforeFirstTarget
|| firstTargetStarted
;
184 public void close() {
188 public boolean requiresLayout() {
192 public void setLogBeforeFirstTarget(boolean logBeforeFirstTarget
) {
193 this.logBeforeFirstTarget
= logBeforeFirstTarget
;
196 public void setLogTaskStartFinish(boolean logTaskStartFinish
) {
197 this.logTaskStartFinish
= logTaskStartFinish
;
200 public void setLogLevel(String logLevel
) {
201 setThreshold(Level
.toLevel(logLevel
));