]> git.argeo.org Git - gpl/argeo-slc.git/blob - org.argeo.slc.core/src/main/java/org/argeo/slc/ant/SlcExecutionBuildListener.java
Simplify defaults
[gpl/argeo-slc.git] / org.argeo.slc.core / 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.LogManager;
8 import org.apache.log4j.spi.LoggingEvent;
9 import org.apache.tools.ant.BuildEvent;
10 import org.apache.tools.ant.Project;
11
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;
16
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";
21
22 public static final String REF_SLC_EXECUTION = "slcExecution";
23
24 private Project project;
25
26 // to avoid stack overflow when logging for log4j
27 private boolean isLogging = false;
28
29 private List<SlcExecutionNotifier> notifiers = new Vector<SlcExecutionNotifier>();
30
31 // private Map<SlcExecution, SlcExecutionStep> currentStep = new
32 // HashMap<SlcExecution, SlcExecutionStep>();
33
34 // private SlcExecutionStep currentStep = null;
35 private boolean currentStepNotified = true;
36
37 public void init(Project project) {
38 if (this.project != null) {
39 throw new SlcAntException("Build listener already initialized");
40 }
41
42 this.project = project;
43
44 if (!LogManager.getRootLogger().isAttached(this)) {
45 LogManager.getRootLogger().addAppender(this);
46 }
47
48 SlcExecution slcExecution = (SlcExecution) project
49 .getReference(REF_SLC_EXECUTION);
50 if (slcExecution == null)
51 throw new SlcAntException("No SLC Execution registered.");
52
53 for (SlcExecutionNotifier notifier : notifiers) {
54 notifier.newExecution(slcExecution);
55 }
56
57 }
58
59 public void buildStarted(BuildEvent event) {
60 // SlcExecution slcExecution = getSlcExecution(event);
61
62 }
63
64 public void buildFinished(BuildEvent event) {
65 SlcExecution slcExecution = getSlcExecution(event);
66 slcExecution.setStatus(SlcExecution.STATUS_FINISHED);
67
68 for (SlcExecutionNotifier notifier : notifiers) {
69 notifier.updateExecution(slcExecution);
70 }
71 }
72
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;
81 } else {
82 slcExecution.currentStep().addLog(event.getMessage());
83 }
84 } else {
85 // TODO: log before initialization?
86 }
87 }
88
89 public void targetStarted(BuildEvent event) {
90 addLogStep(event, "Target " + event.getTarget().getName() + " started");
91 }
92
93 public void targetFinished(BuildEvent event) {
94 addLogStep(event, "Target " + event.getTarget().getName() + " finished");
95 }
96
97 public void taskStarted(BuildEvent event) {
98 SlcExecution slcExecution = getSlcExecution(event);
99 if (!currentStepNotified) {
100 notifyStep(slcExecution, slcExecution.currentStep());
101 currentStepNotified = true;
102 }
103
104 slcExecution.getSteps().add(
105 new SlcExecutionStep("LOG", "Task "
106 + event.getTask().getTaskName() + " started"));
107 currentStepNotified = false;
108 }
109
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;
117 }
118 }
119
120 public void setNotifiers(List<SlcExecutionNotifier> notifiers) {
121 this.notifiers = notifiers;
122 }
123
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);
129
130 SlcExecution slcExecution = (SlcExecution) project
131 .getReference(REF_SLC_EXECUTION);
132
133 if (slcExecution == null)
134 throw new SlcAntException("No SLC Execution registered.");
135 return slcExecution;
136 }
137
138 protected void addLogStep(BuildEvent event, String msg) {
139 SlcExecution slcExecution = getSlcExecution(event);
140 slcExecution.getSteps().add(new SlcExecutionStep("LOG", msg));
141
142 notifyStep(slcExecution, slcExecution.currentStep());
143 currentStepNotified = true;
144 }
145
146 protected void notifyStep(SlcExecution slcExecution, SlcExecutionStep step) {
147 Vector<SlcExecutionStep> additionalSteps = new Vector<SlcExecutionStep>();
148 additionalSteps.add(step);
149 notifySteps(slcExecution, additionalSteps);
150 }
151
152 protected void notifySteps(SlcExecution slcExecution,
153 List<SlcExecutionStep> additionalSteps) {
154 for (SlcExecutionNotifier notifier : notifiers) {
155 notifier.addSteps(slcExecution, additionalSteps);
156 }
157 }
158
159 /* Log4j methods */
160
161 @Override
162 protected void append(LoggingEvent event) {
163 if (isLogging) {
164 // avoid StackOverflow if notification calls Log4j itself.
165 return;
166 }
167
168 if (event.getLoggerName().equals(
169 WebServiceSlcExecutionNotifier.class.getName())) {
170 return;
171 }
172
173 isLogging = true;
174
175 try {
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()
182 .toString()));
183 currentStepNotified = false;
184 }
185 slcExecution.currentStep()
186 .addLog(event.getMessage().toString());
187 } else {
188 // TODO: log before initialization?
189 }
190 } finally {
191 isLogging = false;
192 }
193
194 }
195
196 @Override
197 public void close() {
198 // TODO Auto-generated method stub
199
200 }
201
202 @Override
203 public boolean requiresLayout() {
204 // TODO Auto-generated method stub
205 return false;
206 }
207
208 public Project getProject() {
209 return project;
210 }
211
212 }