X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.agent%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fant%2FSlcExecutionBuildListener.java;h=d2661792bcefef3a12d891b81877fdf63fc5ba5e;hb=b7f351768f4577c0799ab3c5df116ce30270af49;hp=922b03d48d366fc13b9a6fcb9e74b257f8b07f46;hpb=8c01b7fe3fc909e34be473914e567487357a6bba;p=gpl%2Fargeo-slc.git diff --git a/org.argeo.slc.agent/src/main/java/org/argeo/slc/ant/SlcExecutionBuildListener.java b/org.argeo.slc.agent/src/main/java/org/argeo/slc/ant/SlcExecutionBuildListener.java index 922b03d48..d2661792b 100644 --- a/org.argeo.slc.agent/src/main/java/org/argeo/slc/ant/SlcExecutionBuildListener.java +++ b/org.argeo.slc.agent/src/main/java/org/argeo/slc/ant/SlcExecutionBuildListener.java @@ -4,60 +4,44 @@ import java.util.List; import java.util.Vector; import org.apache.log4j.AppenderSkeleton; -import org.apache.log4j.LogManager; +import org.apache.log4j.Level; +import org.apache.log4j.MDC; import org.apache.log4j.spi.LoggingEvent; import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.BuildListener; import org.apache.tools.ant.Project; +import org.argeo.slc.core.SlcException; import org.argeo.slc.core.process.SlcExecution; import org.argeo.slc.core.process.SlcExecutionNotifier; import org.argeo.slc.core.process.SlcExecutionStep; -import org.argeo.slc.ws.process.WebServiceSlcExecutionNotifier; public class SlcExecutionBuildListener extends AppenderSkeleton implements - ProjectRelatedBuildListener { - public static final String ANT_TYPE = "org.apache.tools.ant"; - public static final String SLC_ANT_TYPE = "org.argeo.slc.ant"; - - public static final String REF_SLC_EXECUTION = "slcExecution"; - - private Project project; - - // to avoid stack overflow when logging for log4j - private boolean isLogging = false; - + BuildListener { private List notifiers = new Vector(); private boolean currentStepNotified = true; // CUSTOMIZATIONS + /** + * Whether to log Ant initialization stuff before the first target has been + * called. + */ private boolean logBeforeFirstTarget = false; + /** Whether the first target has been called. */ private boolean firstTargetStarted = false; private boolean logTaskStartFinish = true; - public void init(Project project) { - if (this.project != null) { - throw new SlcAntException("Build listener already initialized"); - } - - this.project = project; - - if (!LogManager.getRootLogger().isAttached(this)) { - LogManager.getRootLogger().addAppender(this); - } - - SlcExecution slcExecution = (SlcExecution) project - .getReference(REF_SLC_EXECUTION); - if (slcExecution == null) - throw new SlcAntException("No SLC Execution registered."); + public SlcExecutionBuildListener() { + // Default log level + setThreshold(Level.INFO); + } + public void buildStarted(BuildEvent event) { + SlcExecution slcExecution = getSlcExecution(event); for (SlcExecutionNotifier notifier : notifiers) { notifier.newExecution(slcExecution); } - - } - - public void buildStarted(BuildEvent event) { } public void buildFinished(BuildEvent event) { @@ -79,7 +63,7 @@ public class SlcExecutionBuildListener extends AppenderSkeleton implements if (slcExecution != null) { if (currentStepNotified) { slcExecution.getSteps().add( - new SlcExecutionStep("LOG", event.getMessage())); + new SlcExecutionStep(event.getMessage())); notifyStep(slcExecution, slcExecution.currentStep()); currentStepNotified = true; } else { @@ -115,7 +99,7 @@ public class SlcExecutionBuildListener extends AppenderSkeleton implements if (logTaskStartFinish) msg = "Task " + event.getTask().getTaskName() + " started"; - slcExecution.getSteps().add(new SlcExecutionStep("LOG", msg)); + slcExecution.getSteps().add(new SlcExecutionStep(msg)); currentStepNotified = false; } @@ -141,22 +125,21 @@ public class SlcExecutionBuildListener extends AppenderSkeleton implements } protected SlcExecution getSlcExecution(BuildEvent event) { - Project projectEvt = event.getProject(); - if (!projectEvt.equals(project)) - throw new SlcAntException("Event project " + projectEvt - + " not consistent with listener project " + project); + return getSlcExecution(event.getProject()); + } + protected SlcExecution getSlcExecution(Project project) { SlcExecution slcExecution = (SlcExecution) project - .getReference(REF_SLC_EXECUTION); + .getReference(AntConstants.REF_SLC_EXECUTION); if (slcExecution == null) - throw new SlcAntException("No SLC Execution registered."); + throw new SlcException("No SLC Execution registered."); return slcExecution; } protected void addLogStep(BuildEvent event, String msg) { SlcExecution slcExecution = getSlcExecution(event); - slcExecution.getSteps().add(new SlcExecutionStep("LOG", msg)); + slcExecution.getSteps().add(new SlcExecutionStep(msg)); notifyStep(slcExecution, slcExecution.currentStep()); currentStepNotified = true; @@ -179,38 +162,18 @@ public class SlcExecutionBuildListener extends AppenderSkeleton implements @Override protected void append(LoggingEvent event) { - if (isLogging) { - // avoid StackOverflow if notification calls Log4j itself. - return; - } - - // FIXME: make it more generic - if (event.getLoggerName().equals( - WebServiceSlcExecutionNotifier.class.getName())) { - return; - } - - isLogging = true; - - try { - SlcExecution slcExecution = (SlcExecution) project - .getReference(REF_SLC_EXECUTION); - if (slcExecution != null) { - if (currentStepNotified) { - slcExecution.getSteps().add( - new SlcExecutionStep("LOG", event.getMessage() - .toString())); - currentStepNotified = false; - } - slcExecution.currentStep() - .addLog(event.getMessage().toString()); - } else { - // TODO: log before initialization? - } - } finally { - isLogging = false; + Project project = (Project) MDC.get(AntConstants.MDC_ANT_PROJECT); + if (project == null) + throw new SlcException("No Ant project registered in Log4j MDC."); + + SlcExecution slcExecution = getSlcExecution(project); + if (currentStepNotified) { + slcExecution.getSteps().add( + new SlcExecutionStep(event.getMessage().toString())); + currentStepNotified = false; + } else { + slcExecution.currentStep().addLog(event.getMessage().toString()); } - } protected boolean shouldLog() { @@ -226,8 +189,16 @@ public class SlcExecutionBuildListener extends AppenderSkeleton implements return false; } - public Project getProject() { - return project; + public void setLogBeforeFirstTarget(boolean logBeforeFirstTarget) { + this.logBeforeFirstTarget = logBeforeFirstTarget; + } + + public void setLogTaskStartFinish(boolean logTaskStartFinish) { + this.logTaskStartFinish = logTaskStartFinish; + } + + public void setLogLevel(String logLevel) { + setThreshold(Level.toLevel(logLevel)); } }