1 package org
.argeo
.slc
.ant
;
4 import java
.util
.Vector
;
6 import org
.apache
.log4j
.AppenderSkeleton
;
7 import org
.apache
.log4j
.LogManager
;
8 import org
.apache
.log4j
.spi
.LoggingEvent
;
9 import org
.apache
.tools
.ant
.BuildEvent
;
10 import org
.apache
.tools
.ant
.Project
;
11 import org
.argeo
.slc
.core
.process
.SlcExecution
;
12 import org
.argeo
.slc
.core
.process
.SlcExecutionNotifier
;
13 import org
.argeo
.slc
.core
.process
.SlcExecutionStep
;
14 import org
.argeo
.slc
.ws
.process
.WebServiceSlcExecutionNotifier
;
15 import org
.springframework
.context
.ApplicationContext
;
16 import org
.springframework
.context
.support
.AbstractApplicationContext
;
18 public class SlcExecutionBuildListener
extends AppenderSkeleton
implements
19 ProjectRelatedBuildListener
{
20 private Project project
;
22 // to avoid stack overflow when logging for log4j
23 private boolean isLogging
= false;
25 private List
<SlcExecutionNotifier
> notifiers
= new Vector
<SlcExecutionNotifier
>();
27 private boolean currentStepNotified
= true;
30 private boolean logBeforeFirstTarget
= false;
31 private boolean firstTargetStarted
= false;
33 private boolean logTaskStartFinish
= true;
35 public void init(Project project
) {
36 if (this.project
!= null) {
37 throw new SlcAntException("Build listener already initialized");
40 this.project
= project
;
42 if (!LogManager
.getRootLogger().isAttached(this)) {
43 LogManager
.getRootLogger().addAppender(this);
46 SlcExecution slcExecution
= (SlcExecution
) project
47 .getReference(SlcAntConstants
.REF_SLC_EXECUTION
);
48 if (slcExecution
== null)
49 throw new SlcAntException("No SLC Execution registered.");
51 for (SlcExecutionNotifier notifier
: notifiers
) {
52 notifier
.newExecution(slcExecution
);
57 public void buildStarted(BuildEvent event
) {
60 public void buildFinished(BuildEvent event
) {
61 SlcExecution slcExecution
= getSlcExecution(event
);
62 String oldStatus
= slcExecution
.getStatus();
63 slcExecution
.setStatus(SlcExecution
.STATUS_FINISHED
);
65 for (SlcExecutionNotifier notifier
: notifiers
) {
66 notifier
.updateStatus(slcExecution
, oldStatus
, slcExecution
70 // AbstractApplicationContext context = (AbstractApplicationContext) getProject()
71 // .getReference(SlcProjectHelper.REF_ROOT_CONTEXT);
72 // if (context != null)
76 public void messageLogged(BuildEvent event
) {
80 SlcExecution slcExecution
= getSlcExecution(event
);
81 if (slcExecution
!= null) {
82 if (currentStepNotified
) {
83 slcExecution
.getSteps().add(
84 new SlcExecutionStep("LOG", event
.getMessage()));
85 notifyStep(slcExecution
, slcExecution
.currentStep());
86 currentStepNotified
= true;
88 slcExecution
.currentStep().addLog(event
.getMessage());
91 // TODO: log before initialization?
95 public void targetStarted(BuildEvent event
) {
96 if (!firstTargetStarted
)
97 firstTargetStarted
= true;
99 addLogStep(event
, "Target " + event
.getTarget().getName() + " started");
102 public void targetFinished(BuildEvent event
) {
103 addLogStep(event
, "Target " + event
.getTarget().getName() + " finished");
106 public void taskStarted(BuildEvent event
) {
110 SlcExecution slcExecution
= getSlcExecution(event
);
111 if (!currentStepNotified
) {
112 notifyStep(slcExecution
, slcExecution
.currentStep());
113 currentStepNotified
= true;
117 if (logTaskStartFinish
)
118 msg
= "Task " + event
.getTask().getTaskName() + " started";
120 slcExecution
.getSteps().add(new SlcExecutionStep("LOG", msg
));
122 currentStepNotified
= false;
125 public void taskFinished(BuildEvent event
) {
129 SlcExecution slcExecution
= getSlcExecution(event
);
130 if (!currentStepNotified
) {
132 if (logTaskStartFinish
)
133 slcExecution
.currentStep().addLog(
134 "Task " + event
.getTask().getTaskName() + " finished");
136 notifyStep(slcExecution
, slcExecution
.currentStep());
137 currentStepNotified
= true;
141 public void setNotifiers(List
<SlcExecutionNotifier
> notifiers
) {
142 this.notifiers
= notifiers
;
145 protected SlcExecution
getSlcExecution(BuildEvent event
) {
146 Project projectEvt
= event
.getProject();
147 if (!projectEvt
.equals(project
))
148 throw new SlcAntException("Event project " + projectEvt
149 + " not consistent with listener project " + project
);
151 SlcExecution slcExecution
= (SlcExecution
) project
152 .getReference(SlcAntConstants
.REF_SLC_EXECUTION
);
154 if (slcExecution
== null)
155 throw new SlcAntException("No SLC Execution registered.");
159 protected void addLogStep(BuildEvent event
, String msg
) {
160 SlcExecution slcExecution
= getSlcExecution(event
);
161 slcExecution
.getSteps().add(new SlcExecutionStep("LOG", msg
));
163 notifyStep(slcExecution
, slcExecution
.currentStep());
164 currentStepNotified
= true;
167 protected void notifyStep(SlcExecution slcExecution
, SlcExecutionStep step
) {
168 Vector
<SlcExecutionStep
> additionalSteps
= new Vector
<SlcExecutionStep
>();
169 additionalSteps
.add(step
);
170 notifySteps(slcExecution
, additionalSteps
);
173 protected void notifySteps(SlcExecution slcExecution
,
174 List
<SlcExecutionStep
> additionalSteps
) {
175 for (SlcExecutionNotifier notifier
: notifiers
) {
176 notifier
.addSteps(slcExecution
, additionalSteps
);
183 protected void append(LoggingEvent event
) {
185 // avoid StackOverflow if notification calls Log4j itself.
189 // FIXME: make it more generic
190 if (event
.getLoggerName().equals(
191 WebServiceSlcExecutionNotifier
.class.getName())) {
198 SlcExecution slcExecution
= (SlcExecution
) project
199 .getReference(SlcAntConstants
.REF_SLC_EXECUTION
);
200 if (slcExecution
!= null) {
201 if (currentStepNotified
) {
202 slcExecution
.getSteps().add(
203 new SlcExecutionStep("LOG", event
.getMessage()
205 currentStepNotified
= false;
207 slcExecution
.currentStep()
208 .addLog(event
.getMessage().toString());
210 // TODO: log before initialization?
218 protected boolean shouldLog() {
219 return logBeforeFirstTarget
|| firstTargetStarted
;
223 public void close() {
227 public boolean requiresLayout() {
231 public Project
getProject() {