+++ /dev/null
-package org.argeo.slc.ant;\r
-\r
-import java.util.List;\r
-import java.util.Vector;\r
-\r
-import org.apache.log4j.AppenderSkeleton;\r
-import org.apache.log4j.LogManager;\r
-import org.apache.log4j.spi.LoggingEvent;\r
-import org.apache.tools.ant.BuildEvent;\r
-import org.apache.tools.ant.Project;\r
-\r
-import org.argeo.slc.core.process.SlcExecution;\r
-import org.argeo.slc.core.process.SlcExecutionNotifier;\r
-import org.argeo.slc.core.process.SlcExecutionStep;\r
-import org.argeo.slc.core.process.WebServiceSlcExecutionNotifier;\r
-\r
-public class SlcExecutionBuildListener extends AppenderSkeleton implements\r
- ProjectRelatedBuildListener {\r
- public static final String ANT_TYPE = "org.apache.tools.ant";\r
- public static final String SLC_ANT_TYPE = "org.argeo.slc.ant";\r
-\r
- public static final String REF_SLC_EXECUTION = "slcExecution";\r
-\r
- private Project project;\r
-\r
- // to avoid stack overflow when logging for log4j\r
- private boolean isLogging = false;\r
-\r
- private List<SlcExecutionNotifier> notifiers = new Vector<SlcExecutionNotifier>();\r
-\r
- private boolean currentStepNotified = true;\r
-\r
- // CUSTOMIZATIONS\r
- private boolean logBeforeFirstTarget = false;\r
- private boolean firstTargetStarted = false;\r
-\r
- private boolean logTaskStartFinish = true;\r
-\r
- public void init(Project project) {\r
- if (this.project != null) {\r
- throw new SlcAntException("Build listener already initialized");\r
- }\r
-\r
- this.project = project;\r
-\r
- if (!LogManager.getRootLogger().isAttached(this)) {\r
- LogManager.getRootLogger().addAppender(this);\r
- }\r
-\r
- SlcExecution slcExecution = (SlcExecution) project\r
- .getReference(REF_SLC_EXECUTION);\r
- if (slcExecution == null)\r
- throw new SlcAntException("No SLC Execution registered.");\r
-\r
- for (SlcExecutionNotifier notifier : notifiers) {\r
- notifier.newExecution(slcExecution);\r
- }\r
-\r
- }\r
-\r
- public void buildStarted(BuildEvent event) {\r
- }\r
-\r
- public void buildFinished(BuildEvent event) {\r
- SlcExecution slcExecution = getSlcExecution(event);\r
- String oldStatus = slcExecution.getStatus();\r
- slcExecution.setStatus(SlcExecution.STATUS_FINISHED);\r
-\r
- for (SlcExecutionNotifier notifier : notifiers) {\r
- notifier.updateStatus(slcExecution, oldStatus, slcExecution\r
- .getStatus());\r
- }\r
- }\r
-\r
- public void messageLogged(BuildEvent event) {\r
- if (!shouldLog())\r
- return;\r
-\r
- SlcExecution slcExecution = getSlcExecution(event);\r
- if (slcExecution != null) {\r
- if (currentStepNotified) {\r
- slcExecution.getSteps().add(\r
- new SlcExecutionStep("LOG", event.getMessage()));\r
- notifyStep(slcExecution, slcExecution.currentStep());\r
- currentStepNotified = true;\r
- } else {\r
- slcExecution.currentStep().addLog(event.getMessage());\r
- }\r
- } else {\r
- // TODO: log before initialization?\r
- }\r
- }\r
-\r
- public void targetStarted(BuildEvent event) {\r
- if (!firstTargetStarted)\r
- firstTargetStarted = true;\r
-\r
- addLogStep(event, "Target " + event.getTarget().getName() + " started");\r
- }\r
-\r
- public void targetFinished(BuildEvent event) {\r
- addLogStep(event, "Target " + event.getTarget().getName() + " finished");\r
- }\r
-\r
- public void taskStarted(BuildEvent event) {\r
- if (!shouldLog())\r
- return;\r
-\r
- SlcExecution slcExecution = getSlcExecution(event);\r
- if (!currentStepNotified) {\r
- notifyStep(slcExecution, slcExecution.currentStep());\r
- currentStepNotified = true;\r
- }\r
-\r
- String msg = null;\r
- if (logTaskStartFinish)\r
- msg = "Task " + event.getTask().getTaskName() + " started";\r
-\r
- slcExecution.getSteps().add(new SlcExecutionStep("LOG", msg));\r
-\r
- currentStepNotified = false;\r
- }\r
-\r
- public void taskFinished(BuildEvent event) {\r
- if (!shouldLog())\r
- return;\r
-\r
- SlcExecution slcExecution = getSlcExecution(event);\r
- if (!currentStepNotified) {\r
-\r
- if (logTaskStartFinish)\r
- slcExecution.currentStep().addLog(\r
- "Task " + event.getTask().getTaskName() + " finished");\r
-\r
- notifyStep(slcExecution, slcExecution.currentStep());\r
- currentStepNotified = true;\r
- }\r
- }\r
-\r
- public void setNotifiers(List<SlcExecutionNotifier> notifiers) {\r
- this.notifiers = notifiers;\r
- }\r
-\r
- protected SlcExecution getSlcExecution(BuildEvent event) {\r
- Project projectEvt = event.getProject();\r
- if (!projectEvt.equals(project))\r
- throw new SlcAntException("Event project " + projectEvt\r
- + " not consistent with listener project " + project);\r
-\r
- SlcExecution slcExecution = (SlcExecution) project\r
- .getReference(REF_SLC_EXECUTION);\r
-\r
- if (slcExecution == null)\r
- throw new SlcAntException("No SLC Execution registered.");\r
- return slcExecution;\r
- }\r
-\r
- protected void addLogStep(BuildEvent event, String msg) {\r
- SlcExecution slcExecution = getSlcExecution(event);\r
- slcExecution.getSteps().add(new SlcExecutionStep("LOG", msg));\r
-\r
- notifyStep(slcExecution, slcExecution.currentStep());\r
- currentStepNotified = true;\r
- }\r
-\r
- protected void notifyStep(SlcExecution slcExecution, SlcExecutionStep step) {\r
- Vector<SlcExecutionStep> additionalSteps = new Vector<SlcExecutionStep>();\r
- additionalSteps.add(step);\r
- notifySteps(slcExecution, additionalSteps);\r
- }\r
-\r
- protected void notifySteps(SlcExecution slcExecution,\r
- List<SlcExecutionStep> additionalSteps) {\r
- for (SlcExecutionNotifier notifier : notifiers) {\r
- notifier.addSteps(slcExecution, additionalSteps);\r
- }\r
- }\r
-\r
- /* Log4j methods */\r
-\r
- @Override\r
- protected void append(LoggingEvent event) {\r
- if (isLogging) {\r
- // avoid StackOverflow if notification calls Log4j itself.\r
- return;\r
- }\r
-\r
- if (event.getLoggerName().equals(\r
- WebServiceSlcExecutionNotifier.class.getName())) {\r
- return;\r
- }\r
-\r
- isLogging = true;\r
-\r
- try {\r
- SlcExecution slcExecution = (SlcExecution) project\r
- .getReference(REF_SLC_EXECUTION);\r
- if (slcExecution != null) {\r
- if (currentStepNotified) {\r
- slcExecution.getSteps().add(\r
- new SlcExecutionStep("LOG", event.getMessage()\r
- .toString()));\r
- currentStepNotified = false;\r
- }\r
- slcExecution.currentStep()\r
- .addLog(event.getMessage().toString());\r
- } else {\r
- // TODO: log before initialization?\r
- }\r
- } finally {\r
- isLogging = false;\r
- }\r
-\r
- }\r
-\r
- protected boolean shouldLog() {\r
- return logBeforeFirstTarget || firstTargetStarted;\r
- }\r
-\r
- @Override\r
- public void close() {\r
- }\r
-\r
- @Override\r
- public boolean requiresLayout() {\r
- return false;\r
- }\r
-\r
- public Project getProject() {\r
- return project;\r
- }\r
-\r
-}\r