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=3e427b1397d6e3ad39eb74540b89f2754e752daa;hb=489db3e2297debe1a32e5e98534d5dbf059e1c1d;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..3e427b139 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) { @@ -148,16 +125,15 @@ 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(SlcAntConstants.REF_SLC_EXECUTION); if (slcExecution == null) - throw new SlcAntException("No SLC Execution registered."); + throw new SlcException("No SLC Execution registered."); return slcExecution; } @@ -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(SlcAntConstants.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("LOG", 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)); } }