Leave the bootstrap stuff in there as it still hasn't been integrated into myrmidon git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@271940 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -1,14 +0,0 @@ | |||
| README for Ant(Eater) | |||
| --------------------------------------------------------------------------------- | |||
| Execution: | |||
| ant [args] target | |||
| Args: | |||
| -help | |||
| -quiet | |||
| -verbose | |||
| -taskpath [path] | |||
| -antfile [file] | |||
| @@ -1,67 +0,0 @@ | |||
| package org.apache.ant.buildtarget; | |||
| import org.apache.ant.*; | |||
| /** | |||
| * A simple task that builds a target if a property is set to true | |||
| * | |||
| * @author James Duncan Davidson (duncan@apache.org) | |||
| */ | |||
| public class BuildTargetTask extends AbstractTask { | |||
| // ----------------------------------------------------------------- | |||
| // PRIVATE DATA MEMBERS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Data to echo | |||
| */ | |||
| private String ifProperty; | |||
| /** | |||
| * Target to execute | |||
| */ | |||
| private String targetName; | |||
| // ----------------------------------------------------------------- | |||
| // PUBLIC METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Executes this task. | |||
| */ | |||
| public boolean execute() throws AntException { | |||
| // XXX should really check internal state before proceeding! Target | |||
| // has to be set... | |||
| // XXX oh, and we should really check to see if the target exists | |||
| // and fail out if it doesn't. :) | |||
| if (ifProperty != null) { | |||
| String ifPropertyValue = project.getProperty(ifProperty); | |||
| if (ifPropertyValue.equals("true")) { | |||
| project.startBuild(targetName); | |||
| return true; | |||
| } else { | |||
| return true; | |||
| } | |||
| } else { | |||
| project.startBuild(targetName); | |||
| return true; | |||
| } | |||
| } | |||
| /** | |||
| * Sets the property that will be examined | |||
| */ | |||
| public void setIf(String ifProperty) { | |||
| this.ifProperty = ifProperty; | |||
| } | |||
| /** | |||
| * Sets the target to be executed | |||
| */ | |||
| public void setTarget(String targetName) { | |||
| this.targetName = targetName; | |||
| } | |||
| } | |||
| @@ -1,4 +0,0 @@ | |||
| # taskdef.properties for Echo task | |||
| tasks=buildtarget | |||
| task.buildtarget.class=org.apache.ant.buildtarget.BuildTargetTask | |||
| @@ -1,42 +0,0 @@ | |||
| package org.apache.ant.echo; | |||
| import org.apache.ant.*; | |||
| /** | |||
| * A very simple task that takes a bit of text and echos it back out | |||
| * when it is executed. This is useful for troubleshooting properties | |||
| * in buildfiles, letting the user know that something is going to happen | |||
| * and as a very simple example that can be copied to create other tasks. | |||
| * | |||
| * @author James Duncan Davidson (duncan@apache.org) | |||
| */ | |||
| public class EchoTask extends AbstractTask { | |||
| // ----------------------------------------------------------------- | |||
| // PRIVATE DATA MEMBERS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Data to echo | |||
| */ | |||
| private String text; | |||
| // ----------------------------------------------------------------- | |||
| // PUBLIC METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Executes this task. | |||
| */ | |||
| public boolean execute() throws AntException { | |||
| project.getFrontEnd().writeMessage(text); | |||
| return true; | |||
| } | |||
| /** | |||
| * Sets the text that this task will echo. | |||
| */ | |||
| public void setText(String text) { | |||
| this.text = text; | |||
| } | |||
| } | |||
| @@ -1,4 +0,0 @@ | |||
| # taskdef.properties for Echo task | |||
| tasks=echo | |||
| task.echo.class=org.apache.ant.echo.EchoTask | |||
| @@ -1,22 +0,0 @@ | |||
| <?xml version="1.0"?> | |||
| <!-- Comment outside of project --> | |||
| <project name="Ant" default="default"> | |||
| <!-- Comment inside of project --> | |||
| <description>Primary buildfile for building Ant itself</description> | |||
| <property name="foo" value="true"/> | |||
| <target name="default" depends="main"> | |||
| <echo text="Default Target is Executing"/> | |||
| <buildtarget target="main" if="foo"/> | |||
| </target> | |||
| <target name="main"> | |||
| <echo text="Main Target is Executing"/> | |||
| </target> | |||
| </project> | |||
| @@ -1,85 +0,0 @@ | |||
| package org.apache.ant; | |||
| import java.io.*; | |||
| import java.util.*; | |||
| import java.lang.reflect.*; | |||
| import java.beans.*; | |||
| /** | |||
| * Superclass of all Tasks. All tasks extend from this. | |||
| * | |||
| * @author James Duncan Davidson (duncan@apache.org) | |||
| */ | |||
| public abstract class AbstractTask { | |||
| // ----------------------------------------------------------------- | |||
| // PROTECTED DATA MEMBERS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * | |||
| */ | |||
| protected Project project; | |||
| // ----------------------------------------------------------------- | |||
| // ABSTRACT PUBLIC METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * | |||
| */ | |||
| public abstract boolean execute() throws AntException; | |||
| // ----------------------------------------------------------------- | |||
| // PUBLIC METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Used by the system to set the attributes which then get reflected | |||
| * into the particular implementation class | |||
| */ | |||
| public void setAttributes(Hashtable attributes) { | |||
| Class clazz = this.getClass(); | |||
| BeanInfo bi; | |||
| try { | |||
| bi = Introspector.getBeanInfo(clazz); | |||
| } catch (IntrospectionException ie) { | |||
| System.out.println("Can't reflect on: " + clazz); | |||
| // XXX exception out | |||
| return; | |||
| } | |||
| PropertyDescriptor[] pda = bi.getPropertyDescriptors(); | |||
| for (int i = 0; i < pda.length; i++) { | |||
| PropertyDescriptor pd = pda[i]; | |||
| String property = pd.getName(); | |||
| Object o = attributes.get(property); | |||
| if (o != null) { | |||
| String value = (String)o; | |||
| Method setMethod = pd.getWriteMethod(); | |||
| if (setMethod != null) { | |||
| Class[] ma = setMethod.getParameterTypes(); | |||
| if (ma.length == 1) { | |||
| Class c = ma[0]; | |||
| if (c.getName().equals("java.lang.String")) { | |||
| try { | |||
| setMethod.invoke(this, new String[] {value}); | |||
| } catch (Exception e) { | |||
| // XXX bad bad bad -- narrow to exact exceptions | |||
| System.out.println("OUCH: " + e); | |||
| // XXX exception out. | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Used by system to set the project. | |||
| */ | |||
| public void setProject(Project project) { | |||
| this.project = project; | |||
| } | |||
| } | |||
| @@ -1,138 +0,0 @@ | |||
| // ------------------------------------------------------------------------------- | |||
| // Copyright (c)2000 Apache Software Foundation | |||
| // ------------------------------------------------------------------------------- | |||
| package org.apache.ant; | |||
| /** | |||
| * Signals a problem while setting up or executing a build. | |||
| * | |||
| * @author James Duncan Davidson (duncan@apache.org) | |||
| */ | |||
| public class AntException extends Exception { | |||
| // ----------------------------------------------------------------- | |||
| // PRIVATE MEMBERS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * The cause of this exception. | |||
| */ | |||
| private Throwable cause; | |||
| /** | |||
| * Project within which this exception occured, if applicable. | |||
| */ | |||
| private Project project; | |||
| /** | |||
| * Target within which this exception occurred, if applicable. | |||
| */ | |||
| private Target target; | |||
| /** | |||
| * Task within which this exception occurred, if applicable. | |||
| */ | |||
| private Task task; | |||
| // ----------------------------------------------------------------- | |||
| // CONSTRUCTORS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Constructs a new AntException with no message. | |||
| */ | |||
| public AntException() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Constructs a new AntException with the given message. | |||
| */ | |||
| public AntException(String msg) { | |||
| super(msg); | |||
| } | |||
| /** | |||
| * Constructs a new AntException with the given message and cause. | |||
| */ | |||
| public AntException(String msg, Throwable cause) { | |||
| super(msg); | |||
| this.cause = cause; | |||
| } | |||
| /** | |||
| * Constructs a new AntException with the given cause and a | |||
| * detailed message of (cause==null ? null : cause.toString()) | |||
| */ | |||
| public AntException(Throwable cause) { | |||
| super(cause==null ? null : cause.toString()); | |||
| this.cause = cause; | |||
| } | |||
| // ----------------------------------------------------------------- | |||
| // PUBLIC METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Returns the cause of this exception. | |||
| */ | |||
| public Throwable getCause() { | |||
| return cause; | |||
| } | |||
| /** | |||
| * Returns the Project within the scope of which this exception occurred, | |||
| * if applicable. Otherwise null. | |||
| */ | |||
| public Project getProject() { | |||
| return project; | |||
| } | |||
| /** | |||
| * Returns the Target within the scope of which this exception occurred, | |||
| * if applicable. Otherwise null. | |||
| */ | |||
| public Target getTarget() { | |||
| return target; | |||
| } | |||
| /** | |||
| * Returns the Task wihtin the scope of which this exception occurred, | |||
| * if applicable. Otherwise null. | |||
| */ | |||
| public Task getTask() { | |||
| return task; | |||
| } | |||
| // ----------------------------------------------------------------- | |||
| // PACKAGE METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Sets the project within the scope of which this exception occurred. | |||
| * This method is called by the internal error handling mechanism of | |||
| * Ant before it is propogated out. | |||
| */ | |||
| void setProject(Project project) { | |||
| this.project = project; | |||
| } | |||
| /** | |||
| * Sets the target within the scope of which this exception occurred. | |||
| * This method is called by the internal error handling mechansim of | |||
| * Ant before it is propogated out. | |||
| */ | |||
| void setTarget(Target target) { | |||
| this.target = target; | |||
| } | |||
| /** | |||
| * Sets the task within the scope of which this exception occurred. | |||
| * This method is called by the internal error handling mechanism of | |||
| * Ant before it is propogated out. | |||
| */ | |||
| void setTask(Task task) { | |||
| this.task = task; | |||
| } | |||
| } | |||
| @@ -1,103 +0,0 @@ | |||
| // ------------------------------------------------------------------------------- | |||
| // Copyright (c)2000 Apache Software Foundation | |||
| // ------------------------------------------------------------------------------- | |||
| package org.apache.ant; | |||
| /** | |||
| * Abstract class that lets Ant talk to a front end such as a CLI front end, | |||
| * GUI front end, Servlet front end, or some other front end. | |||
| * | |||
| * @author James Duncan Davidson (duncan@apache.org) | |||
| */ | |||
| public abstract class AntFrontEnd { | |||
| // ----------------------------------------------------------------- | |||
| // CONSTANTS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Indicates that an associated message has a low importance. | |||
| */ | |||
| public static final int MSG_LEVEL_LOW = 1; | |||
| /** | |||
| * Indicates that an associated message has a medium importance. | |||
| */ | |||
| public static final int MSG_LEVEL_MED = 2; | |||
| /** | |||
| * Indicates that an associated message has a high importance. | |||
| */ | |||
| public static final int MSG_LEVEL_HIGH = 3; | |||
| // ----------------------------------------------------------------- | |||
| // PUBLIC METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Send notification to the FrontEnd that execution has moved into | |||
| * the scope of a particular project. The default implementation | |||
| * does nothing. | |||
| */ | |||
| public void notifyProjectStart(Project project) { | |||
| } | |||
| /** | |||
| * Send notification to the FrontEnd that execution has moved out | |||
| * of the scope of a particular Project. The default implementation | |||
| * does nothing. | |||
| */ | |||
| public void notifyProjectEnd(Project project) { | |||
| } | |||
| /** | |||
| * Send notification to the FrontEnd that execution has moved into | |||
| * the scope of a particular target. The default implementation does | |||
| * nothing. | |||
| */ | |||
| public void notifyTargetStart(Target target) { | |||
| } | |||
| /** | |||
| * Send notification to the FrontEnd that execution has moved out of | |||
| * the scope of a particular target. The default implementation does | |||
| * nothing. | |||
| */ | |||
| public void notifyTargetEnd(Target target) { | |||
| } | |||
| /** | |||
| * Send notification to the FrontEnd that execution has moved into the | |||
| * scope of a particular task. The default implementation does nothing. | |||
| */ | |||
| public void notifyTaskStart(Task task) { | |||
| } | |||
| /** | |||
| * Send notification to the FrontEnd that execution has moved out of | |||
| * the scope of a particular task. The default implementation does | |||
| * nothing. | |||
| */ | |||
| public void notifyTaskEnd(Task task) { | |||
| } | |||
| /** | |||
| * Writes a message to the front end with a medium importance. | |||
| */ | |||
| public void writeMessage(String message) { | |||
| writeMessage(message, MSG_LEVEL_MED); | |||
| } | |||
| /** | |||
| * Writes a message to the front end. | |||
| */ | |||
| public abstract void writeMessage(String message, int level); | |||
| } | |||
| @@ -1,286 +0,0 @@ | |||
| // --------------------------------------------------------------------- | |||
| // (c)2000 Apache Software Foundation | |||
| // | |||
| // --------------------------------------------------------------------- | |||
| package org.apache.ant; | |||
| import java.io.*; | |||
| import java.util.*; | |||
| /** | |||
| * In memory container for an Ant project. | |||
| * | |||
| * @author James Duncan Davidson (duncan@apache.org) | |||
| */ | |||
| public class Project { | |||
| // ----------------------------------------------------------------- | |||
| // PRIVATE DATA MEMBERS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * | |||
| */ | |||
| //private Ant ant; | |||
| /** | |||
| * Base directory of this project. Usually this value is the directory | |||
| * where the project file was found, but can be different. | |||
| */ | |||
| private File baseDir; | |||
| /** | |||
| * | |||
| */ | |||
| private String defaultTargetName; | |||
| /** | |||
| * Short description of the project. | |||
| */ | |||
| private String description; | |||
| /** | |||
| * Front end that this project communicates to. | |||
| */ | |||
| private AntFrontEnd frontEnd; | |||
| /** | |||
| * Properties of this project. | |||
| */ | |||
| private Properties properties = new Properties(); | |||
| /** | |||
| * Parent project to this project, if one exists. | |||
| */ | |||
| private Project parentProject = null; | |||
| /** | |||
| * | |||
| */ | |||
| private String name; | |||
| /** | |||
| * Hashtable containing all of the targets that are part of this | |||
| * project. Targets are stored in this hashtable using the name | |||
| * of the target as the key and the Target object for the target | |||
| * as the value. | |||
| */ | |||
| private Hashtable targets = new Hashtable(); | |||
| /** | |||
| * TaskManager for this project. | |||
| */ | |||
| private TaskManager taskManager; | |||
| // ----------------------------------------------------------------- | |||
| // CONSTRUCTORS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Creates a new Project object with the given FrontEnd and TaskManager | |||
| */ | |||
| public Project(AntFrontEnd frontEnd, TaskManager taskManager) { | |||
| this.frontEnd = frontEnd; | |||
| this.taskManager = taskManager; | |||
| } | |||
| // ----------------------------------------------------------------- | |||
| // PUBLIC METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Adds a target to this project. | |||
| */ | |||
| public void addTarget(Target target) { | |||
| // XXX check out for name, if null, reject! | |||
| targets.put(target.getName(), target); | |||
| } | |||
| /** | |||
| * Returns the base directory of this project. | |||
| */ | |||
| public File getBaseDir() { | |||
| return baseDir; | |||
| } | |||
| /** | |||
| * Returns the default target for this project, if there is one. Otherwise | |||
| * it returns null. | |||
| */ | |||
| public String getDefaultTargetName() { | |||
| return defaultTargetName; | |||
| } | |||
| /** | |||
| * Returns a short description of this project, if any. If not, returns | |||
| * null. | |||
| */ | |||
| public String getDescription() { | |||
| return description; | |||
| } | |||
| /** | |||
| * Gets the front end that is running this project. | |||
| */ | |||
| public AntFrontEnd getFrontEnd() { | |||
| return frontEnd; | |||
| } | |||
| /** | |||
| * Returns the parent Project object to this Project if a parent | |||
| * project exists. If there is not a parent Project object, null | |||
| * is returned. | |||
| */ | |||
| public Project getParent() { | |||
| return parentProject; | |||
| } | |||
| /** | |||
| * Returns the target identified with the given name. If no target | |||
| * is known by the given name, then null is returned. | |||
| */ | |||
| public Target getTarget(String name) { | |||
| return (Target)targets.get(name); | |||
| } | |||
| /** | |||
| * Gets an exumeration of all the targets that are part of this project. | |||
| */ | |||
| public Enumeration getTargets() { | |||
| return targets.elements(); | |||
| } | |||
| /** | |||
| * Gets the name of this project. | |||
| */ | |||
| public String getName() { | |||
| return name; | |||
| } | |||
| /** | |||
| * Returns the value of a property. Returns null if the property does | |||
| * not exist. | |||
| */ | |||
| public String getProperty(String propertyName) { | |||
| return properties.getProperty(propertyName); | |||
| } | |||
| /** | |||
| * | |||
| */ | |||
| //public void setAnt(Ant ant) { | |||
| // this.ant = ant; | |||
| //} | |||
| /** | |||
| * Sets the base dir for this project. | |||
| */ | |||
| public void setBaseDir(File dir) { | |||
| // XXX should check this to make sure it's a dir! | |||
| baseDir = dir; | |||
| } | |||
| /** | |||
| * Sets the default target for this project. | |||
| */ | |||
| public void setDefaultTargetName(String targetName) { | |||
| defaultTargetName = targetName; | |||
| } | |||
| /** | |||
| * Sets the description for this project. | |||
| */ | |||
| public void setDescription(String description) { | |||
| this.description = description; | |||
| } | |||
| /** | |||
| * Sets the front end for this project. | |||
| */ | |||
| public void setFrontEnd(AntFrontEnd frontEnd) { | |||
| this.frontEnd = frontEnd; | |||
| } | |||
| /** | |||
| * Sets the name of this project. | |||
| */ | |||
| public void setName(String name) { | |||
| this.name = name; | |||
| } | |||
| /** | |||
| * Sets a property on this project. If the property is already | |||
| * set, this method will override it. | |||
| */ | |||
| public void setProperty(String propertyName, String propertyValue) { | |||
| properties.put(propertyName, propertyValue); | |||
| } | |||
| /** | |||
| * Starts a build of this project using the default target if one | |||
| * is set. | |||
| */ | |||
| public void startBuild() throws AntException { | |||
| // XXX need to do something if the default target isn't set.. | |||
| // maybe look for target name 'default', then bail? | |||
| startBuild(defaultTargetName); | |||
| } | |||
| /** | |||
| * Starts a build of this project with the entry point at the given | |||
| * target. | |||
| */ | |||
| public void startBuild(String targetName) throws AntException { | |||
| // notify AntFrontEnd that we are starting a build on a project | |||
| frontEnd.notifyProjectStart(this); | |||
| Target target = getTarget(targetName); | |||
| frontEnd.notifyTargetStart(target); | |||
| // XXX don't forget to execute dependancies first! | |||
| Enumeration enum = target.getTasks().elements(); | |||
| while (enum.hasMoreElements()) { | |||
| Task task = (Task)enum.nextElement(); | |||
| frontEnd.notifyTaskStart(task); | |||
| try { | |||
| AbstractTask aTask = taskManager.getTaskInstance(task.getType()); | |||
| aTask.setProject(this); | |||
| aTask.setAttributes(task.getAttributes()); | |||
| boolean b = aTask.execute(); | |||
| if (!b) { | |||
| String msg = "Task " + task.getType() + " failed"; | |||
| AntException ae = new AntException(msg); | |||
| throw ae; | |||
| } | |||
| } catch (Exception e) { | |||
| AntException ae; | |||
| if (!(e instanceof AntException)) { | |||
| ae = new AntException(e); | |||
| } else { | |||
| ae = (AntException)e; | |||
| } | |||
| ae.setProject(this); | |||
| ae.setTarget(target); | |||
| ae.setTask(task); | |||
| throw ae; | |||
| } | |||
| frontEnd.notifyTaskEnd(task); | |||
| } | |||
| // notify frontEnd that we are done | |||
| frontEnd.notifyTargetEnd(target); | |||
| frontEnd.notifyProjectEnd(this); | |||
| } | |||
| /** | |||
| * Givens a string representation of this object. Useful for debugging. | |||
| */ | |||
| public String toString() { | |||
| return "Project name=" + name; | |||
| } | |||
| } | |||
| @@ -1,307 +0,0 @@ | |||
| // ------------------------------------------------------------------------------- | |||
| // Copyright (c)2000 Apache Software Foundation | |||
| // ------------------------------------------------------------------------------- | |||
| package org.apache.ant; | |||
| import java.io.*; | |||
| import java.util.*; | |||
| import javax.xml.parsers.*; | |||
| import org.xml.sax.*; | |||
| /** | |||
| * Helper class to build Project object trees. | |||
| * | |||
| * XXX right now this class only deals with the primary levels (project/target/task) | |||
| * and nothing else. Also, it only supports attributes.... | |||
| * | |||
| * @author James Duncan Davidson (duncan@apache.org) | |||
| */ | |||
| public class ProjectBuilder { | |||
| // ----------------------------------------------------------------- | |||
| // PRIVATE MEMBERS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * | |||
| */ | |||
| private AntFrontEnd frontEnd; | |||
| /** | |||
| * | |||
| */ | |||
| private SAXParserFactory parserFactory; | |||
| /** | |||
| * | |||
| */ | |||
| private TaskManager taskManager; | |||
| // ----------------------------------------------------------------- | |||
| // CONSTRUCTORS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Creates a new project builder that will build projects for the given | |||
| * Ant. | |||
| */ | |||
| public ProjectBuilder(AntFrontEnd frontEnd) { | |||
| this.frontEnd = frontEnd; | |||
| taskManager = new TaskManager(frontEnd); | |||
| parserFactory = SAXParserFactory.newInstance(); | |||
| parserFactory.setValidating(false); | |||
| } | |||
| // ----------------------------------------------------------------- | |||
| // PUBLIC METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Builds a project from the given file. | |||
| */ | |||
| public Project buildFromFile(File file) throws AntException { | |||
| try { | |||
| SAXParser parser = parserFactory.newSAXParser(); | |||
| BuilderHandlerBase bhb = new BuilderHandlerBase(); | |||
| bhb.setProjectFileLocation(file); | |||
| parser.parse(file, bhb); | |||
| Project project = bhb.getProject(); | |||
| project.setFrontEnd(frontEnd); | |||
| return project; | |||
| } catch (ParserConfigurationException pce) { | |||
| throw new AntException(pce); | |||
| } catch (SAXException se) { | |||
| Exception e = se.getException(); | |||
| if (e != null && e instanceof AntException) { | |||
| // it's one of our own thrown from inside the parser to stop it | |||
| throw (AntException)e; | |||
| } | |||
| throw new AntException(se); | |||
| } catch (IOException ioe) { | |||
| throw new AntException(ioe); | |||
| } | |||
| } | |||
| /** | |||
| * Returns the TaskManager associated with this ProjectBuilder and | |||
| * the projects that it builds | |||
| */ | |||
| public TaskManager getTaskManager() { | |||
| return taskManager; | |||
| } | |||
| // ----------------------------------------------------------------- | |||
| // INNER CLASSES | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Inner class that implements the needed SAX methods to get all the | |||
| * data needed out of a build file. | |||
| */ | |||
| class BuilderHandlerBase extends HandlerBase { | |||
| private static final int STATE_START = 0; | |||
| private static final int STATE_PROJECT = 1; | |||
| private static final int STATE_TARGET = 2; | |||
| private static final int STATE_TASK = 3; | |||
| private static final int STATE_DESCRIPTION = 4; | |||
| private static final int STATE_PROPERTY = 5; | |||
| private static final int STATE_FINISHED = 99; | |||
| private int state = STATE_START; | |||
| private Vector tagCharDataStack = new Vector(); | |||
| private Target currentTarget; | |||
| private Task currentTask; | |||
| Project project = new Project(frontEnd, taskManager); | |||
| Project getProject() { | |||
| return project; | |||
| } | |||
| void setProjectFileLocation(File file) { | |||
| project.setBaseDir(file.getParentFile()); | |||
| } | |||
| public void startElement(String name, AttributeList atts) throws SAXException { | |||
| StringBuffer tagCharData = new StringBuffer(); | |||
| tagCharDataStack.insertElementAt(tagCharData, 0); | |||
| switch (state) { | |||
| case STATE_START: | |||
| if (name.equals("project")) { | |||
| state = STATE_PROJECT; | |||
| String projectName = atts.getValue("name"); | |||
| if (projectName != null) { | |||
| project.setName(projectName); | |||
| } else { | |||
| String msg = "Project element doesn't contain a name attribute"; | |||
| AntException ae = new AntException(msg); | |||
| throw new SAXException(ae); | |||
| } | |||
| String defaultTarget = atts.getValue("default"); | |||
| if (defaultTarget != null) { | |||
| project.setDefaultTargetName(defaultTarget); | |||
| } | |||
| String baseDirName = atts.getValue("basedir"); | |||
| if (baseDirName != null) { | |||
| // XXX need to check to see if base dir exists | |||
| project.setBaseDir(new File(baseDirName)); | |||
| } | |||
| } else { | |||
| String msg = "Project file doesn't contain a project element as " + | |||
| "its root node"; | |||
| AntException ae = new AntException(msg); | |||
| throw new SAXException(ae); | |||
| } | |||
| break; | |||
| case STATE_PROJECT: | |||
| // valid tags in a project object are: description, property, and target | |||
| if (name.equals("description")) { | |||
| state = STATE_DESCRIPTION; | |||
| } else if (name.equals("property")) { | |||
| state = STATE_PROPERTY; | |||
| String propertyName = atts.getValue("name"); | |||
| String propertyValue = atts.getValue("value"); | |||
| if (propertyName == null) { | |||
| String msg = "Name attribute must be present on property"; | |||
| AntException ae = new AntException(msg); | |||
| throw new SAXException(ae); | |||
| } else if (propertyValue == null) { | |||
| String msg = "Value attribute must be present on property"; | |||
| AntException ae = new AntException(msg); | |||
| throw new SAXException(ae); | |||
| } else { | |||
| project.setProperty(propertyName, propertyValue); | |||
| } | |||
| } else if (name.equals("target")) { | |||
| state = STATE_TARGET; | |||
| String targetName = atts.getValue("name"); | |||
| if (targetName != null) { | |||
| currentTarget = new Target(targetName); | |||
| project.addTarget(currentTarget); | |||
| } else { | |||
| // XXX figure out which target we're talking about! | |||
| // Like a location | |||
| String msg = "Target element doesn't contain a name attribute"; | |||
| AntException ae = new AntException(msg); | |||
| throw new SAXException(ae); | |||
| } | |||
| String depends = atts.getValue("depends"); | |||
| if (depends != null) { | |||
| StringTokenizer tok = new StringTokenizer(depends, ",", false); | |||
| while(tok.hasMoreTokens()) { | |||
| currentTarget.addDependancy(tok.nextToken().trim()); | |||
| } | |||
| } | |||
| // XXX add dependency checks | |||
| } else { | |||
| System.out.println("Expecting target, got: " + name); | |||
| // XXX exception out | |||
| } | |||
| break; | |||
| case STATE_TARGET: | |||
| // Valid tags inside target: task | |||
| state = STATE_TASK; | |||
| //System.out.println("Getting task: " + name + " for target " + | |||
| // currentTarget); | |||
| // XXX need to validate that task type (name) exists in system | |||
| // else exception out. | |||
| currentTask = new Task(name); | |||
| currentTarget.addTask(currentTask); | |||
| for (int i = 0; i < atts.getLength(); i++) { | |||
| String atName = atts.getName(i); | |||
| String atValue = atts.getValue(i); | |||
| currentTask.addAttribute(atName, atValue); | |||
| } | |||
| break; | |||
| case STATE_TASK: | |||
| // data in here needs to be reflected into tasks | |||
| System.out.println("Not yet supporting tags inside of tasks!"); | |||
| System.out.println("The project build will probably bust right here"); | |||
| break; | |||
| default: | |||
| System.out.println("I'm not sure, but we're off base here: " + name); | |||
| // XXX exception out | |||
| } | |||
| } | |||
| public void characters(char ch[], int start, int length) throws SAXException { | |||
| StringBuffer buf = (StringBuffer)tagCharDataStack.elementAt(0); | |||
| buf.append(ch, start, length); | |||
| } | |||
| public void endElement(String name) throws SAXException { | |||
| StringBuffer elementData = (StringBuffer)tagCharDataStack.elementAt(0); | |||
| tagCharDataStack.removeElementAt(0); | |||
| switch (state) { | |||
| case STATE_TASK: | |||
| state = STATE_TARGET; | |||
| break; | |||
| case STATE_TARGET: | |||
| if (name.equals("target")) { | |||
| state = STATE_PROJECT; | |||
| } else { | |||
| System.out.println("Expecting to get an end of target, got: " + name); | |||
| // XXX exception out. | |||
| } | |||
| break; | |||
| case STATE_DESCRIPTION: | |||
| if (name.equals("description")) { | |||
| state = STATE_PROJECT; | |||
| project.setDescription(elementData.toString().trim()); | |||
| } else { | |||
| System.out.println("Expecting to get an end of description, got: " + | |||
| name); | |||
| // XXX exception out. | |||
| } | |||
| break; | |||
| case STATE_PROPERTY: | |||
| if (name.equals("property")) { | |||
| state = STATE_PROJECT; | |||
| } else { | |||
| System.out.println("Expecting to get end of property, got: " + name); | |||
| // XXX exception out | |||
| } | |||
| break; | |||
| case STATE_PROJECT: | |||
| if (name.equals("project")) { | |||
| state = STATE_FINISHED; | |||
| } else { | |||
| System.out.println("Expecting to get end of project, got: " + name); | |||
| // XXX exception out; | |||
| } | |||
| break; | |||
| default: | |||
| System.out.println("I'm not sure what we are ending here: " + name); | |||
| // XXX exception out; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| @@ -1,90 +0,0 @@ | |||
| // --------------------------------------------------------------------- | |||
| // (c)2000 Apache Software Foundation | |||
| // | |||
| // --------------------------------------------------------------------- | |||
| package org.apache.ant; | |||
| import java.util.*; | |||
| /** | |||
| * In memory container for an Ant target. | |||
| */ | |||
| public class Target { | |||
| // ----------------------------------------------------------------- | |||
| // PRIVATE DATA MEMBERS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * String containing the name of the target. This name must be | |||
| * unique withing a project. | |||
| */ | |||
| private String name; | |||
| /** | |||
| * Vector containing the names of the targets that this target | |||
| * depends on. | |||
| */ | |||
| private Vector dependsList = new Vector(); | |||
| /** | |||
| * Vector containing the tasks that are part of this target. | |||
| */ | |||
| private Vector tasks = new Vector(); | |||
| // ----------------------------------------------------------------- | |||
| // CONSTRUCTORS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Constructs a new Target object with the given name. | |||
| */ | |||
| public Target(String name) { | |||
| this.name = name; | |||
| } | |||
| // ----------------------------------------------------------------- | |||
| // PUBLIC ACCESSOR METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Adds a dependancy to this task. | |||
| */ | |||
| public void addDependancy(String targetName) { | |||
| dependsList.addElement(targetName); | |||
| } | |||
| /** | |||
| * | |||
| */ | |||
| public void addTask(Task task) { | |||
| tasks.addElement(task); | |||
| } | |||
| /** | |||
| * Returns a String containing the name of this Target. | |||
| */ | |||
| public String getName() { | |||
| return name; | |||
| } | |||
| /** | |||
| * | |||
| */ | |||
| public String toString() { | |||
| return "TARGET: " + name; | |||
| } | |||
| /** | |||
| * Returns a Vector of Tasks contained in this Target. | |||
| * <p> | |||
| * Please use caution when using this method. I am not happy | |||
| * about exposing this data as something other than a | |||
| * Collection, but don't want to use 1.1 collections. So, | |||
| * this method may change in the future. You have been warned. | |||
| */ | |||
| public Vector getTasks() { | |||
| return tasks; | |||
| } | |||
| } | |||
| @@ -1,86 +0,0 @@ | |||
| // --------------------------------------------------------------------- | |||
| // (c)2000 Apache Software Foundation | |||
| // | |||
| // --------------------------------------------------------------------- | |||
| package org.apache.ant; | |||
| import java.util.*; | |||
| /** | |||
| * In memory container for an Ant target. | |||
| * | |||
| * XXX need a way to query which attributes are valid for this particular | |||
| * task type... Like into Ant object to do this? | |||
| */ | |||
| public class Task { | |||
| // ----------------------------------------------------------------- | |||
| // PRIVATE DATA MEMBERS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * | |||
| */ | |||
| private Hashtable attributes = new Hashtable(); | |||
| /** | |||
| * String containing the type of the task. | |||
| */ | |||
| private String type; | |||
| // ----------------------------------------------------------------- | |||
| // CONSTRUCTORS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Constructs a new Target object with the given name. | |||
| */ | |||
| public Task(String type) { | |||
| this.type = type; | |||
| } | |||
| // ----------------------------------------------------------------- | |||
| // PUBLIC ACCESSOR METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * | |||
| */ | |||
| public void addAttribute(String name, String value) { | |||
| attributes.put(name, value); | |||
| } | |||
| public String getAttribute(String name) { | |||
| return (String)attributes.get(name); | |||
| } | |||
| /** | |||
| * | |||
| */ | |||
| public Hashtable getAttributes() { | |||
| return attributes; | |||
| } | |||
| /** | |||
| * | |||
| */ | |||
| public Enumeration getAttributeNames() { | |||
| return attributes.keys(); | |||
| } | |||
| /** | |||
| * Returns a String containing the name of this Target. | |||
| */ | |||
| public String getType() { | |||
| return type; | |||
| } | |||
| /** | |||
| * | |||
| */ | |||
| public String toString() { | |||
| return "TASK: " + type; | |||
| } | |||
| } | |||
| @@ -1,268 +0,0 @@ | |||
| // ------------------------------------------------------------------------------- | |||
| // Copyright (c)2000 Apache Software Foundation | |||
| // ------------------------------------------------------------------------------- | |||
| package org.apache.ant; | |||
| import java.io.*; | |||
| import java.net.*; | |||
| import java.util.*; | |||
| import java.util.zip.*; | |||
| /** | |||
| * Manager of tasks and all things related to tasks. Tasks can be found in a | |||
| * wide number of locations -- and most of these locations require class loading | |||
| * help. As well, new nodes on the task search path may be added at any time. | |||
| * When these are added, new tasks should be scanned for. | |||
| * | |||
| * @author James Duncan Davidson (duncan@apache.org) | |||
| */ | |||
| public class TaskManager { | |||
| // ----------------------------------------------------------------- | |||
| // PRIVATE DATA MEMBERS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * FrontEnd that this TaskManager can communicate through. | |||
| */ | |||
| private AntFrontEnd frontEnd; | |||
| /** | |||
| * Data structure where all the Class definition for all known tasks are | |||
| * held. | |||
| */ | |||
| private Hashtable taskClasses = new Hashtable(); | |||
| /** | |||
| * Data structure that holds all the nodes where tasks are picked up from. | |||
| */ | |||
| private Vector taskPathNodes = new Vector(); | |||
| // ----------------------------------------------------------------- | |||
| // CONSTRUCTORS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Creates a new TaskManager. | |||
| */ | |||
| TaskManager(AntFrontEnd frontEnd) { | |||
| this.frontEnd = frontEnd; | |||
| } | |||
| // ----------------------------------------------------------------- | |||
| // PUBLIC METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Adds a node to the task path | |||
| */ | |||
| public void addTaskPathNode(File file) throws AntException { | |||
| taskPathNodes.addElement(file); | |||
| processTaskPathNode(file); | |||
| } | |||
| // ----------------------------------------------------------------- | |||
| // PACKAGE METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * | |||
| */ | |||
| AbstractTask getTaskInstance(String taskName) throws AntException { | |||
| Class clazz = (Class)taskClasses.get(taskName); | |||
| try { | |||
| return (AbstractTask)clazz.newInstance(); | |||
| } catch (Exception e) { | |||
| String msg = "Can't instantiate task: " + taskName; | |||
| AntException ae = new AntException(msg, e); | |||
| throw ae; | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------- | |||
| // PRIVATE METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Returns an enum of the task names that are defined in a given | |||
| * properties file. | |||
| */ | |||
| private Enumeration getTaskNames(Properties props) { | |||
| Vector v = new Vector(); | |||
| String s = props.getProperty("tasks"); | |||
| StringTokenizer tok = new StringTokenizer(s, ",", false); | |||
| while (tok.hasMoreTokens()) { | |||
| String taskName = tok.nextToken().trim(); | |||
| v.addElement(taskName); | |||
| } | |||
| return v.elements(); | |||
| } | |||
| /** | |||
| * Processes a directory to get class defintions from it | |||
| */ | |||
| private void processDir(File dir) { | |||
| frontEnd.writeMessage("Scanning " + dir + " for tasks", | |||
| AntFrontEnd.MSG_LEVEL_LOW); | |||
| File file = new File(dir, "taskdef.properties"); | |||
| if (file.exists()) { | |||
| try { | |||
| InputStream in = new FileInputStream(file); | |||
| Properties props = new Properties(); | |||
| props.load(in); | |||
| in.close(); | |||
| Enumeration enum = getTaskNames(props); | |||
| while (enum.hasMoreElements()) { | |||
| String taskName = (String)enum.nextElement(); | |||
| String taskClass = props.getProperty("task." + taskName + ".class"); | |||
| URLClassLoader loader = new URLClassLoader(new URL[] {dir.toURL()}); | |||
| try { | |||
| Class clazz = loader.loadClass(taskClass); | |||
| frontEnd.writeMessage("Got Task: " + taskName + | |||
| clazz, AntFrontEnd.MSG_LEVEL_LOW); | |||
| taskClasses.put(taskName, clazz); | |||
| } catch (ClassNotFoundException cnfe) { | |||
| System.out.println("Couldn't load task: " + taskName); | |||
| System.out.println(cnfe); | |||
| // XXX error out and stop.... | |||
| } | |||
| } | |||
| } catch (IOException ioe) { | |||
| System.out.println("Could not work with dir: " + dir); | |||
| System.out.println(ioe); | |||
| // XXX error out and stop the build | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Processes a jar file to get class definitions from it | |||
| */ | |||
| private void processJar(File file) throws AntException { | |||
| frontEnd.writeMessage("Scanning " + file + " for tasks", | |||
| AntFrontEnd.MSG_LEVEL_LOW); | |||
| try { | |||
| ZipFile zipFile = new ZipFile(file); | |||
| ZipEntry zipEntry = zipFile.getEntry("taskdef.properties"); | |||
| if (zipEntry != null) { | |||
| InputStream in = zipFile.getInputStream(zipEntry); | |||
| Properties props = new Properties(); | |||
| props.load(in); | |||
| in.close(); | |||
| Enumeration enum = getTaskNames(props); | |||
| while (enum.hasMoreElements()) { | |||
| String taskName = (String)enum.nextElement(); | |||
| String taskClass = props.getProperty("task." + taskName + ".class"); | |||
| if (taskClass == null) { | |||
| String msg = "No class definition for task " + taskName + | |||
| "in jar file " + file; | |||
| throw new AntException(msg); | |||
| } | |||
| URLClassLoader loader = new URLClassLoader(new URL[] {file.toURL()}); | |||
| try { | |||
| Class clazz = loader.loadClass(taskClass); | |||
| frontEnd.writeMessage("Got Task: " + taskName + | |||
| clazz, AntFrontEnd.MSG_LEVEL_LOW); | |||
| taskClasses.put(taskName, clazz); | |||
| } catch (ClassNotFoundException cnfe) { | |||
| System.out.println("Couldn't load task: " + taskName); | |||
| System.out.println(cnfe); | |||
| // XXX error out and stop.... | |||
| } | |||
| } | |||
| } | |||
| // make sure to not leave resources hanging | |||
| zipFile.close(); | |||
| } catch (IOException ioe) { | |||
| System.out.println("Couldn't work with file: " + file); | |||
| System.out.println(ioe); | |||
| // XXX need to exception out of here properly to stop things | |||
| } | |||
| } | |||
| /** | |||
| * Processes a node of the task path searching for task definitions there | |||
| * and adding them to the list of known tasks | |||
| */ | |||
| private void processTaskPathNode(File file) throws AntException { | |||
| // task path nodes can be any of the following: | |||
| // * jar file | |||
| // * directory of jar files | |||
| // * directory holding class files | |||
| if(file.isDirectory()) { | |||
| // first look for all jar files here | |||
| // second look for a taskdefs.properties here to see if we should | |||
| // treat the directory as a classpath | |||
| String[] files = file.list(); | |||
| for (int i = 0; i < files.length; i++) { | |||
| if (files[i].endsWith(".jar")) { | |||
| processJar(new File(file, files[i])); | |||
| } else if (files[i].equals("taskdef.properties")) { | |||
| processDir(file); | |||
| } | |||
| } | |||
| } else if (file.getName().endsWith(".jar")) { | |||
| processJar(file); | |||
| } | |||
| } | |||
| /** | |||
| * Sets up the taskpath based on the currently running operating | |||
| * system. In general, the ordering of the taskpath is: user directory, | |||
| * system directory, and then installation. This allows users or | |||
| * system admins to override or add tasks. | |||
| */ | |||
| private void setUpTaskPath() throws AntException { | |||
| // 1st, add user's home dir. | |||
| File f; | |||
| String userHome = System.getProperty("user.home"); | |||
| // generic unix | |||
| f = new File(userHome + ".ant", "tasks"); | |||
| if (f.exists() && f.isDirectory()) { | |||
| addTaskPathNode(f); | |||
| } | |||
| // macos x | |||
| f = new File(userHome + "/Library/Ant", "Tasks"); | |||
| if (f.exists() && f.isDirectory()) { | |||
| addTaskPathNode(f); | |||
| } | |||
| // windows -- todo | |||
| // 2nd, add system local dir. | |||
| // generic unix | |||
| f = new File("/usr/local/ant/tasks"); | |||
| if (f.exists() && f.isDirectory()) { | |||
| addTaskPathNode(f); | |||
| } | |||
| // macos x | |||
| f = new File("/Library/Ant/Tasks"); | |||
| if (f.exists() && f.isDirectory()) { | |||
| addTaskPathNode(f); | |||
| } | |||
| // windows -- todo | |||
| // 3rd, add installation local dir. | |||
| //System.out.println("BASE: " + this.getClass().getResource("/")); | |||
| // XXX ---- not really sure how the best way of getting this info is... | |||
| // hafta think about it. | |||
| } | |||
| } | |||
| @@ -1,307 +0,0 @@ | |||
| // ------------------------------------------------------------------------------- | |||
| // Copyright (c)2000 Apache Software Foundation | |||
| // ------------------------------------------------------------------------------- | |||
| package org.apache.ant.cli; | |||
| import java.io.*; | |||
| import java.util.*; | |||
| import org.apache.ant.*; | |||
| /** | |||
| * Front end for the Command Line Interface that gets passed to Ant so that | |||
| * it can communicate information to the CLI. | |||
| * | |||
| * @author James Duncan Davidson (duncan@apache.org) | |||
| */ | |||
| public class CLIFrontEnd extends AntFrontEnd { | |||
| // ----------------------------------------------------------------- | |||
| // PRIVATE MEMBERS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * | |||
| */ | |||
| private String[] args; | |||
| /** | |||
| * ProjectBuilder that is associated with this frontEnd. | |||
| */ | |||
| private ProjectBuilder projectBuilder; | |||
| /** | |||
| * | |||
| */ | |||
| private int msgLevelFilter = MSG_LEVEL_MED; | |||
| /** | |||
| * TaskManager instance that we can set taskpaths and such on. | |||
| */ | |||
| private TaskManager taskManager; | |||
| // ----------------------------------------------------------------- | |||
| // CONSTRUCTORS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Creates a new CLIFrontEnd that can drive an Ant build from the Command | |||
| * Line. | |||
| */ | |||
| public CLIFrontEnd() { | |||
| projectBuilder = new ProjectBuilder(this); | |||
| taskManager = projectBuilder.getTaskManager(); | |||
| } | |||
| // ----------------------------------------------------------------- | |||
| // PUBLIC METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Send notification to the FrontEnd that execution has moved into | |||
| * the scope of a particular project. The default implementation | |||
| * does nothing. | |||
| */ | |||
| public void notifyProjectStart(Project project) { | |||
| writeMessage("Project Start: " + project.getName(), MSG_LEVEL_LOW); | |||
| } | |||
| /** | |||
| * Send notification to the FrontEnd that execution has moved out | |||
| * of the scope of a particular Project. The default implementation | |||
| * does nothing. | |||
| */ | |||
| public void notifyProjectEnd(Project project) { | |||
| writeMessage("Project End: " + project.getName(), MSG_LEVEL_LOW); | |||
| } | |||
| /** | |||
| * Send notification to the FrontEnd that execution has moved into | |||
| * the scope of a particular target. The default implementation does | |||
| * nothing. | |||
| */ | |||
| public void notifyTargetStart(Target target) { | |||
| writeMessage("Target Start: " + target.getName(), MSG_LEVEL_LOW); | |||
| } | |||
| /** | |||
| * Send notification to the FrontEnd that execution has moved out of | |||
| * the scope of a particular target. The default implementation does | |||
| * nothing. | |||
| */ | |||
| public void notifyTargetEnd(Target target) { | |||
| writeMessage("Target End: " + target.getName(), MSG_LEVEL_LOW); | |||
| } | |||
| /** | |||
| * Send notification to the FrontEnd that execution has moved into the | |||
| * scope of a particular task. The default implementation does nothing. | |||
| */ | |||
| public void notifyTaskStart(Task task) { | |||
| writeMessage("Task Start: " + task.getType(), MSG_LEVEL_LOW); | |||
| } | |||
| /** | |||
| * Send notification to the FrontEnd that execution has moved out of | |||
| * the scope of a particular task. The default implementation does | |||
| * nothing. | |||
| */ | |||
| public void notifyTaskEnd(Task task) { | |||
| writeMessage("Task End: " + task.getType(), MSG_LEVEL_LOW); | |||
| } | |||
| /** | |||
| * | |||
| */ | |||
| public void run(String[] args) { | |||
| this.args = args; | |||
| String target = ""; | |||
| File buildFile = null; | |||
| writeMessage("Ant(Eater) -- Proposed Ant 2.0"); | |||
| // process through the args set | |||
| if (isArg("help")) { | |||
| printHelp(); | |||
| return; | |||
| } | |||
| if (isArg("quiet")) { | |||
| msgLevelFilter = MSG_LEVEL_HIGH; | |||
| } | |||
| if (isArg("verbose")) { | |||
| msgLevelFilter = MSG_LEVEL_LOW; | |||
| } | |||
| String argTaskpath = getArgValue("taskpath"); | |||
| if (argTaskpath != null) { | |||
| if (argTaskpath.equals("")) { | |||
| writeMessage("Must give a value for -taskpath"); | |||
| return; | |||
| } else { | |||
| // XXX need to separate on path seps so that real paths can be taken | |||
| try { | |||
| taskManager.addTaskPathNode(new File(argTaskpath)); | |||
| } catch (AntException ae) { | |||
| System.out.println(ae); | |||
| System.out.println(ae.getMessage()); | |||
| ae.printStackTrace(System.out); | |||
| return; | |||
| } | |||
| } | |||
| } | |||
| String argBuildfile = getArgValue("buildfile"); | |||
| if (argBuildfile != null) { | |||
| if (argBuildfile.equals("")) { | |||
| writeMessage("Must give a value for -buildfile"); | |||
| return; | |||
| } else { | |||
| //try { | |||
| buildFile = new File(argBuildfile); | |||
| //ant.setBuildfile(new File(argBuildfile)); | |||
| //} catch (AntException ae) { | |||
| // writeMessage("Can't set buildfile"); | |||
| // writeMessage(ae.toString()); | |||
| // return; | |||
| //} | |||
| } | |||
| } | |||
| target = getTargetArg(); | |||
| // XXX do something if we dont' have a buildfile set! | |||
| // XXX really should check to make sure that the target is set to something | |||
| // like get the default... | |||
| try { | |||
| Project project = projectBuilder.buildFromFile(buildFile); | |||
| project.setFrontEnd(this); | |||
| project.startBuild(target); | |||
| } catch (AntException ae) { | |||
| //XXX this whole write a string at a time message handling | |||
| // sucks and needs to be improved... | |||
| writeMessage("Build Stopped"); | |||
| writeMessage(" Project: " + ae.getProject().getName()); | |||
| writeMessage(" Target: " + ae.getTarget().getName()); | |||
| writeMessage(" Task Type: " + ae.getTask().getType()); | |||
| writeMessage("Details Follow"); | |||
| writeMessage(""); | |||
| writeMessage(ae.getMessage()); | |||
| ae.printStackTrace(System.out); | |||
| Throwable t = ae.getCause(); | |||
| if (t != null) { | |||
| writeMessage(""); | |||
| writeMessage("Cause Exception: " + t.toString()); | |||
| writeMessage(t.getMessage()); | |||
| t.printStackTrace(System.out); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Writes a message to the front end. | |||
| */ | |||
| public void writeMessage(String message, int level) { | |||
| if (level >= msgLevelFilter) { | |||
| System.out.println(message); | |||
| } | |||
| } | |||
| // ----------------------------------------------------------------- | |||
| // PRIVATE METHODS | |||
| // ----------------------------------------------------------------- | |||
| /** | |||
| * Returns the value for a given argument name, null if the argument | |||
| * name isn't in the argument set, or "" if the argument doesn't have | |||
| * a value. | |||
| */ | |||
| private String getArgValue(String argName) { | |||
| for (int i = 0; i < args.length; i++) { | |||
| if (args[i].equals("-" + argName)) { | |||
| if (i != args.length - 1) { | |||
| return args[i + 1]; | |||
| } else { | |||
| return ""; | |||
| } | |||
| } | |||
| } | |||
| return null; | |||
| } | |||
| /** | |||
| * Returns the target that was requested to be built, if any. If no | |||
| * target is determined, returns null. | |||
| */ | |||
| public String getTargetArg() { | |||
| String possibleTarget = getArgValue("target"); | |||
| if (possibleTarget != null) { | |||
| if (possibleTarget.equals("")) { | |||
| writeMessage("Must give a value for -target"); | |||
| } else { | |||
| return possibleTarget; | |||
| } | |||
| } | |||
| possibleTarget = args[args.length - 1]; | |||
| if (possibleTarget.startsWith("-")) { | |||
| return null; | |||
| } | |||
| if (args[args.length - 2].startsWith("-")) { | |||
| // our possible target might be an arg value instead of a target | |||
| // XXX ugh -- there has to be a better way here. We need to hold | |||
| // a list of all args that don't have values somewhere. | |||
| if (args[args.length - 2].equals("-help") || | |||
| args[args.length - 2].equals("-verbose") || | |||
| args[args.length - 2].equals("-quiet")) { | |||
| // we're ok, the arg before the possible target doesn't have a value | |||
| return possibleTarget; | |||
| } else { | |||
| return null; | |||
| } | |||
| } else { | |||
| return possibleTarget; | |||
| } | |||
| } | |||
| /** | |||
| * Indicates whether or not a given argument name exists in the argument | |||
| * set. | |||
| */ | |||
| private boolean isArg(String argName) { | |||
| for (int i = 0; i < args.length; i++) { | |||
| if (args[i].equals("-" + argName)) { | |||
| return true; | |||
| } | |||
| } | |||
| return false; | |||
| } | |||
| /** | |||
| * Prints help to System.out | |||
| */ | |||
| private void printHelp() { | |||
| // XXX resource bundle this. | |||
| String ls = System.getProperty("line.separator"); | |||
| String msg = "Usage: ant [args] [target]" + ls + | |||
| " Arguments can be any of the following:" + ls + | |||
| " -help" + ls + | |||
| " -taskpath [path]" + ls + | |||
| " -buildfile [file]" +ls + | |||
| " -verbose" + ls + | |||
| " -quiet" + ls + ls + | |||
| " Note that if no buildfile argument is given, Ant will"+ls+ | |||
| " try to find one in the current directory. If there are"+ls+ | |||
| " two or more buildfiles in the current directory, it" +ls+ | |||
| " will bail."; | |||
| writeMessage(msg); | |||
| } | |||
| } | |||