package org.eclipse.ant.core;/* * (c) Copyright IBM Corp. 2000, 2001. * All Rights Reserved. */ import org.apache.tools.ant.BuildEvent;import org.apache.tools.ant.BuildListener;/** * Interface that must be implemented by clients wishing to be notified by * <code>AntRunner</code> of build events as they occur. * <p> * <b>Note:</b> This class/interface is part of an interim API that is still under  * development and expected to change significantly before reaching stability.  * It is being made available at this early stage to solicit feedback from pioneering  * adopters on the understanding that any code that uses this API will almost  * certainly be broken (repeatedly) as the API evolves. * </p> */
public interface IAntRunnerListener extends BuildListener {	/** * Logs a message appropriately if its priority indicates that * logging is warranted.  The priority will be one of  * <code>Project.MSG_ERR</code>, <code>Project.MSG_WARN</code>, * <code>Project.MSG_INFO</code>, <code>Project.MSG_VERBOSE</code> * or <code>Project.MSG_DEBUG</code>. *  * @see org.apache.tools.ant.Project * @param message the message to be logged * @param priority the priority of the message */public void messageLogged(String message,int priority);/** * Fired when a target selected by the user (i.e. given as a parameter in the command line  * or selected in the Ant UI) is being executed. * *  @see BuildEvent#getTarget()  */public void executeTargetStarted(BuildEvent event);/** * Fired when a target selected by the user (i.e. given as a parameter in the command line  * or selected in the Ant UI) is finished. * *  @see BuildEvent#getTarget() */public void executeTargetFinished(BuildEvent event);
}
