]> git.argeo.org Git - gpl/argeo-slc.git/blob - org.argeo.slc.agent/src/main/java/org/argeo/slc/ant/SlcExecutionBuildListener.java
Improve packaging
[gpl/argeo-slc.git] / org.argeo.slc.agent / src / main / java / org / argeo / slc / ant / SlcExecutionBuildListener.java
1 package org.argeo.slc.ant;
2
3 import java.util.List;
4 import java.util.Vector;
5
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;
17
18 public class SlcExecutionBuildListener extends AppenderSkeleton implements
19 BuildListener {
20 private List<SlcExecutionNotifier> notifiers = new Vector<SlcExecutionNotifier>();
21
22 private boolean currentStepNotified = true;
23
24 // CUSTOMIZATIONS
25 /**
26 * Whether to log Ant initialization stuff before the first target has been
27 * called.
28 */
29 private boolean logBeforeFirstTarget = false;
30 /** Whether the first target has been called. */
31 private boolean firstTargetStarted = false;
32
33 private boolean logTaskStartFinish = true;
34
35 public SlcExecutionBuildListener() {
36 // Default log level
37 setThreshold(Level.INFO);
38 }
39
40 public void buildStarted(BuildEvent event) {
41 SlcExecution slcExecution = getSlcExecution(event);
42 for (SlcExecutionNotifier notifier : notifiers) {
43 notifier.newExecution(slcExecution);
44 }
45 }
46
47 public void buildFinished(BuildEvent event) {
48 SlcExecution slcExecution = getSlcExecution(event);
49 String oldStatus = slcExecution.getStatus();
50 slcExecution.setStatus(SlcExecution.STATUS_FINISHED);
51
52 for (SlcExecutionNotifier notifier : notifiers) {
53 notifier.updateStatus(slcExecution, oldStatus, slcExecution
54 .getStatus());
55 }
56 }
57
58 public void messageLogged(BuildEvent event) {
59 if (!shouldLog())
60 return;
61
62 SlcExecution slcExecution = getSlcExecution(event);
63 if (slcExecution != null) {
64 if (currentStepNotified) {
65 slcExecution.getSteps().add(
66 new SlcExecutionStep(event.getMessage()));
67 notifyStep(slcExecution, slcExecution.currentStep());
68 currentStepNotified = true;
69 } else {
70 slcExecution.currentStep().addLog(event.getMessage());
71 }
72 } else {
73 // TODO: log before initialization?
74 }
75 }
76
77 public void targetStarted(BuildEvent event) {
78 if (!firstTargetStarted)
79 firstTargetStarted = true;
80
81 addLogStep(event, "Target " + event.getTarget().getName() + " started");
82 }
83
84 public void targetFinished(BuildEvent event) {
85 addLogStep(event, "Target " + event.getTarget().getName() + " finished");
86 }
87
88 public void taskStarted(BuildEvent event) {
89 if (!shouldLog())
90 return;
91
92 SlcExecution slcExecution = getSlcExecution(event);
93 if (!currentStepNotified) {
94 notifyStep(slcExecution, slcExecution.currentStep());
95 currentStepNotified = true;
96 }
97
98 String msg = null;
99 if (logTaskStartFinish)
100 msg = "Task " + event.getTask().getTaskName() + " started";
101
102 slcExecution.getSteps().add(new SlcExecutionStep(msg));
103
104 currentStepNotified = false;
105 }
106
107 public void taskFinished(BuildEvent event) {
108 if (!shouldLog())
109 return;
110
111 SlcExecution slcExecution = getSlcExecution(event);
112 if (!currentStepNotified) {
113
114 if (logTaskStartFinish)
115 slcExecution.currentStep().addLog(
116 "Task " + event.getTask().getTaskName() + " finished");
117
118 notifyStep(slcExecution, slcExecution.currentStep());
119 currentStepNotified = true;
120 }
121 }
122
123 public void setNotifiers(List<SlcExecutionNotifier> notifiers) {
124 this.notifiers = notifiers;
125 }
126
127 protected SlcExecution getSlcExecution(BuildEvent event) {
128 return getSlcExecution(event.getProject());
129 }
130
131 protected SlcExecution getSlcExecution(Project project) {
132 SlcExecution slcExecution = (SlcExecution) project
133 .getReference(AntConstants.REF_SLC_EXECUTION);
134
135 if (slcExecution == null)
136 throw new SlcException("No SLC Execution registered.");
137 return slcExecution;
138 }
139
140 protected void addLogStep(BuildEvent event, String msg) {
141 SlcExecution slcExecution = getSlcExecution(event);
142 slcExecution.getSteps().add(new SlcExecutionStep(msg));
143
144 notifyStep(slcExecution, slcExecution.currentStep());
145 currentStepNotified = true;
146 }
147
148 protected void notifyStep(SlcExecution slcExecution, SlcExecutionStep step) {
149 Vector<SlcExecutionStep> additionalSteps = new Vector<SlcExecutionStep>();
150 additionalSteps.add(step);
151 notifySteps(slcExecution, additionalSteps);
152 }
153
154 protected void notifySteps(SlcExecution slcExecution,
155 List<SlcExecutionStep> additionalSteps) {
156 for (SlcExecutionNotifier notifier : notifiers) {
157 notifier.addSteps(slcExecution, additionalSteps);
158 }
159 }
160
161 /* Log4j methods */
162
163 @Override
164 protected void append(LoggingEvent event) {
165 Project project = (Project) MDC.get(AntConstants.MDC_ANT_PROJECT);
166 if (project == null)
167 throw new SlcException("No Ant project registered in Log4j MDC.");
168
169 SlcExecution slcExecution = getSlcExecution(project);
170 if (currentStepNotified) {
171 slcExecution.getSteps().add(
172 new SlcExecutionStep(event.getMessage().toString()));
173 currentStepNotified = false;
174 } else {
175 slcExecution.currentStep().addLog(event.getMessage().toString());
176 }
177 }
178
179 protected boolean shouldLog() {
180 return logBeforeFirstTarget || firstTargetStarted;
181 }
182
183 @Override
184 public void close() {
185 }
186
187 @Override
188 public boolean requiresLayout() {
189 return false;
190 }
191
192 public void setLogBeforeFirstTarget(boolean logBeforeFirstTarget) {
193 this.logBeforeFirstTarget = logBeforeFirstTarget;
194 }
195
196 public void setLogTaskStartFinish(boolean logTaskStartFinish) {
197 this.logTaskStartFinish = logTaskStartFinish;
198 }
199
200 public void setLogLevel(String logLevel) {
201 setThreshold(Level.toLevel(logLevel));
202 }
203
204 }