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
;
12 import org
.argeo
.slc
.core
.process
.SlcExecution
;
13 import org
.argeo
.slc
.core
.process
.SlcExecutionNotifier
;
14 import org
.argeo
.slc
.core
.process
.SlcExecutionStep
;
15 import org
.argeo
.slc
.core
.process
.WebServiceSlcExecutionNotifier
;
17 public class SlcExecutionBuildListener
extends AppenderSkeleton
implements
18 ProjectRelatedBuildListener
{
19 public static final String ANT_TYPE
= "org.apache.tools.ant";
20 public static final String SLC_ANT_TYPE
= "org.argeo.slc.ant";
22 public static final String REF_SLC_EXECUTION
= "slcExecution";
24 private Project project
;
26 // to avoid stack overflow when logging for log4j
27 private boolean isLogging
= false;
29 private List
<SlcExecutionNotifier
> notifiers
= new Vector
<SlcExecutionNotifier
>();
31 // private Map<SlcExecution, SlcExecutionStep> currentStep = new
32 // HashMap<SlcExecution, SlcExecutionStep>();
34 // private SlcExecutionStep currentStep = null;
35 private boolean currentStepNotified
= true;
37 public void init(Project project
) {
38 if (this.project
!= null) {
39 throw new SlcAntException("Build listener already initialized");
42 this.project
= project
;
44 if (!LogManager
.getRootLogger().isAttached(this)) {
45 LogManager
.getRootLogger().addAppender(this);
48 SlcExecution slcExecution
= (SlcExecution
) project
49 .getReference(REF_SLC_EXECUTION
);
50 if (slcExecution
== null)
51 throw new SlcAntException("No SLC Execution registered.");
53 for (SlcExecutionNotifier notifier
: notifiers
) {
54 notifier
.newExecution(slcExecution
);
59 public void buildStarted(BuildEvent event
) {
60 // SlcExecution slcExecution = getSlcExecution(event);
64 public void buildFinished(BuildEvent event
) {
65 SlcExecution slcExecution
= getSlcExecution(event
);
66 slcExecution
.setStatus(SlcExecution
.STATUS_FINISHED
);
68 for (SlcExecutionNotifier notifier
: notifiers
) {
69 notifier
.updateExecution(slcExecution
);
73 public void messageLogged(BuildEvent event
) {
74 SlcExecution slcExecution
= getSlcExecution(event
);
75 if (slcExecution
!= null) {
76 if (currentStepNotified
) {
77 slcExecution
.getSteps().add(
78 new SlcExecutionStep("LOG", event
.getMessage()));
79 notifyStep(slcExecution
, slcExecution
.currentStep());
80 currentStepNotified
= true;
82 slcExecution
.currentStep().addLog(event
.getMessage());
85 // TODO: log before initialization?
89 public void targetStarted(BuildEvent event
) {
90 addLogStep(event
, "Target " + event
.getTarget().getName() + " started");
93 public void targetFinished(BuildEvent event
) {
94 addLogStep(event
, "Target " + event
.getTarget().getName() + " finished");
97 public void taskStarted(BuildEvent event
) {
98 SlcExecution slcExecution
= getSlcExecution(event
);
99 if (!currentStepNotified
) {
100 notifyStep(slcExecution
, slcExecution
.currentStep());
101 currentStepNotified
= true;
104 slcExecution
.getSteps().add(
105 new SlcExecutionStep("LOG", "Task "
106 + event
.getTask().getTaskName() + " started"));
107 currentStepNotified
= false;
110 public void taskFinished(BuildEvent event
) {
111 SlcExecution slcExecution
= getSlcExecution(event
);
112 if (!currentStepNotified
) {
113 slcExecution
.currentStep().addLog(
114 "Task " + event
.getTask().getTaskName() + " finished");
115 notifyStep(slcExecution
, slcExecution
.currentStep());
116 currentStepNotified
= true;
120 public void setNotifiers(List
<SlcExecutionNotifier
> notifiers
) {
121 this.notifiers
= notifiers
;
124 protected SlcExecution
getSlcExecution(BuildEvent event
) {
125 Project projectEvt
= event
.getProject();
126 if (!projectEvt
.equals(project
))
127 throw new SlcAntException("Event project " + projectEvt
128 + " not consistent with listener project " + project
);
130 SlcExecution slcExecution
= (SlcExecution
) project
131 .getReference(REF_SLC_EXECUTION
);
133 if (slcExecution
== null)
134 throw new SlcAntException("No SLC Execution registered.");
138 protected void addLogStep(BuildEvent event
, String msg
) {
139 SlcExecution slcExecution
= getSlcExecution(event
);
140 slcExecution
.getSteps().add(new SlcExecutionStep("LOG", msg
));
142 notifyStep(slcExecution
, slcExecution
.currentStep());
143 currentStepNotified
= true;
146 protected void notifyStep(SlcExecution slcExecution
, SlcExecutionStep step
) {
147 Vector
<SlcExecutionStep
> additionalSteps
= new Vector
<SlcExecutionStep
>();
148 additionalSteps
.add(step
);
149 notifySteps(slcExecution
, additionalSteps
);
152 protected void notifySteps(SlcExecution slcExecution
,
153 List
<SlcExecutionStep
> additionalSteps
) {
154 for (SlcExecutionNotifier notifier
: notifiers
) {
155 notifier
.addSteps(slcExecution
, additionalSteps
);
162 protected void append(LoggingEvent event
) {
164 // avoid StackOverflow if notification calls Log4j itself.
168 if (event
.getLoggerName().equals(
169 WebServiceSlcExecutionNotifier
.class.getName())) {
176 SlcExecution slcExecution
= (SlcExecution
) project
177 .getReference(REF_SLC_EXECUTION
);
178 if (slcExecution
!= null) {
179 if (currentStepNotified
) {
180 slcExecution
.getSteps().add(
181 new SlcExecutionStep("LOG", event
.getMessage()
183 currentStepNotified
= false;
185 slcExecution
.currentStep()
186 .addLog(event
.getMessage().toString());
188 // TODO: log before initialization?
197 public void close() {
198 // TODO Auto-generated method stub
203 public boolean requiresLayout() {
204 // TODO Auto-generated method stub
208 public Project
getProject() {