X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=org.argeo.slc.agent%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fant%2FSlcExecutionBuildListener.java;h=d2661792bcefef3a12d891b81877fdf63fc5ba5e;hb=b7f351768f4577c0799ab3c5df116ce30270af49;hp=2b373a08219db1c663df007c4948026fddf2bede;hpb=fe7713bc24976ddb7e7b3a0e9656b14b9356d5c1;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 2b373a082..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,62 +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; -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.AbstractApplicationContext; 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) { @@ -71,11 +53,6 @@ public class SlcExecutionBuildListener extends AppenderSkeleton implements notifier.updateStatus(slcExecution, oldStatus, slcExecution .getStatus()); } - -// AbstractApplicationContext context = (AbstractApplicationContext) getProject() -// .getReference(SlcProjectHelper.REF_ROOT_CONTEXT); -// if (context != null) -// context.close(); } public void messageLogged(BuildEvent event) { @@ -86,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 { @@ -122,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; } @@ -148,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; @@ -186,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() { @@ -233,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)); } }