Submitted By: "James Cook" <jimcook@iname.com> git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268364 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -0,0 +1,55 @@ | |||
| @echo off | |||
| rem -------------------------------------------------------------------------- | |||
| rem build.bat - Build Script for Frantic (lifted from Tomcat...thx guys) | |||
| rem | |||
| rem Environment Variable Prerequisites: | |||
| rem | |||
| rem JAVA_HOME Must point at your Java Development Kit [REQUIRED] | |||
| rem | |||
| rem --------------------------------------------------------------------------- | |||
| rem ----- Save Environment Variables ------------------------------------------ | |||
| set _CLASSPATH=%CLASSPATH% | |||
| set _CLASSES=%CLASSES% | |||
| rem ----- Verify and Set Required Environment Variables ----------------------- | |||
| if not "%JAVA_HOME%" == "" goto gotJavaHome | |||
| echo You must set JAVA_HOME to point at your Java Development Kit installation | |||
| goto cleanup | |||
| :gotJavaHome | |||
| rem ----- Set Up The Runtime Classpath ---------------------------------------- | |||
| if not "%CLASSPATH%" == "" set CLASSPATH=%CLASSPATH%; | |||
| set CLASSPATH=%CLASSPATH%;./src | |||
| rem ----- Execute The Requested Build ----------------------------------------- | |||
| if not exist dist mkdir dist | |||
| if not exist dist\lib mkdir dist\lib | |||
| if not exist dist\lib\classes mkdir dist\lib\classes | |||
| if not exist dist\doc mkdir dist\doc | |||
| if not exist dist\doc\api mkdir dist\doc\api | |||
| set CLASSES=dist\lib\classes | |||
| %JAVA_HOME%\bin\javac -d %CLASSES% src/org/apache/ant/test/*.java | |||
| %JAVA_HOME%\bin\jar cvf dist\lib\frantic.jar -C dist\lib\classes . | |||
| xcopy website\*.html dist\doc /s /y | |||
| xcopy website\*.gif dist\doc /s /y | |||
| %JAVA_HOME%\bin\javadoc -protected -sourcepath src -d dist\doc\api -author org.apache.ant org.apache.ant.engine org.apache.ant.tasks org.apache.ant.tasks.build org.apache.ant.tasks.util | |||
| rem ----- Restore Environment Variables --------------------------------------- | |||
| :cleanup | |||
| set CLASSPATH=%_CLASSPATH% | |||
| set CLASSES=%_CLASSES% | |||
| set _CLASSPATH= | |||
| set _CLASSES= | |||
| :finish | |||
| @@ -0,0 +1,65 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.ant; | |||
| public class AntException extends Exception { | |||
| public AntException() { | |||
| super(); | |||
| } | |||
| public AntException(String message) { | |||
| super(message); | |||
| } | |||
| } | |||
| @@ -0,0 +1,72 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.ant.engine; | |||
| import java.util.*; | |||
| import org.apache.ant.AntException; | |||
| import org.apache.ant.tasks.Task; | |||
| public interface AntEngineListener extends EventListener { | |||
| void engineStart(AntEvent e); | |||
| void engineFinish(AntEvent e); | |||
| void taskStart(AntEvent e); | |||
| void taskExecute(AntEvent e); | |||
| void taskFinish(AntEvent e); | |||
| void taskMessage(AntEvent e, String message); | |||
| void taskException(AntEvent e, AntException exception); | |||
| } | |||
| @@ -0,0 +1,80 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.ant.engine; | |||
| import java.util.EventObject; | |||
| import org.apache.ant.tasks.Task; | |||
| public class AntEvent extends EventObject { | |||
| Task task; | |||
| public AntEvent(Object source) { | |||
| this(source, null); | |||
| } | |||
| public AntEvent(Object source, Task task) { | |||
| super(source); | |||
| this.task = task; | |||
| } | |||
| public Task getTask() { | |||
| return task; | |||
| } | |||
| public void setTask(Task task) { | |||
| this.task = task; | |||
| } | |||
| } | |||
| @@ -0,0 +1,166 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.ant.engine; | |||
| import java.io.*; | |||
| import java.text.*; | |||
| import java.util.*; | |||
| import org.apache.ant.AntException; | |||
| import org.apache.ant.tasks.Task; | |||
| public class DefaultEngineListener implements AntEngineListener { | |||
| protected PrintStream outputStream; | |||
| protected long startTime; | |||
| protected StringBuffer sb = new StringBuffer(); | |||
| protected int indentSpaces = 4; | |||
| protected boolean indent = true; | |||
| protected int curIndent = 0; | |||
| protected SimpleDateFormat timestamp = new SimpleDateFormat("HH:mm:ss:SSS"); | |||
| public DefaultEngineListener() { | |||
| this(System.out); | |||
| } | |||
| public DefaultEngineListener(PrintStream outputStream) { | |||
| this.outputStream = outputStream; | |||
| } | |||
| public void setIndentSpaces(int spaces) { | |||
| this.indentSpaces = spaces; | |||
| } | |||
| public int getIndentSpaces() { | |||
| return indentSpaces; | |||
| } | |||
| public void setIndent(boolean on) { | |||
| this.indent = on; | |||
| } | |||
| public boolean isIndent() { | |||
| return indent; | |||
| } | |||
| protected String padLeft(String s, int length) { | |||
| sb.setLength(0); | |||
| sb.append(s); | |||
| while (sb.length() < length) { | |||
| sb.insert(0, ' '); | |||
| } | |||
| return sb.toString(); | |||
| } | |||
| protected void output(String message) { | |||
| if (!indent) { | |||
| outputStream.println(message); | |||
| return; | |||
| } | |||
| // shouldn't happen, but let's be on the safe side | |||
| if (curIndent < 0) { | |||
| curIndent = 0; | |||
| } | |||
| outputStream.println( | |||
| padLeft(message, message.length() + (indentSpaces * curIndent))); | |||
| } | |||
| //////////////////////////////////////////////////////////////////////////// | |||
| // AntEngineListener Implementation // | |||
| //////////////////////////////////////////////////////////////////////////// | |||
| public void engineStart(AntEvent e) { | |||
| Date now = new Date(); | |||
| output("Engine Started: " + timestamp.format(now)); | |||
| startTime = now.getTime(); | |||
| } | |||
| public void engineFinish(AntEvent e) { | |||
| Date now = new Date(); | |||
| long elapsed = System.currentTimeMillis() - startTime; | |||
| output("Engine Finished: " + timestamp.format(now)); | |||
| output("Elapsed Time: " + (elapsed / 1000F) + " seconds"); | |||
| } | |||
| public void taskStart(AntEvent e) { | |||
| output("Task Started: " + e.getTask().getFullyQualifiedName()); | |||
| curIndent++; | |||
| } | |||
| public void taskExecute(AntEvent e){ | |||
| output("Task Execution: " + e.getTask().getFullyQualifiedName()); | |||
| } | |||
| public void taskFinish(AntEvent e){ | |||
| curIndent--; | |||
| output("Task Finished: " + e.getTask().getFullyQualifiedName()); | |||
| } | |||
| public void taskMessage(AntEvent e, String message){ | |||
| curIndent++; | |||
| output("Task Message: " + e.getTask().getFullyQualifiedName() + ": " + | |||
| message); | |||
| curIndent--; | |||
| } | |||
| public void taskException(AntEvent e, AntException exception){ | |||
| output("Task Exception: " + e.getTask().getFullyQualifiedName() + ": " + | |||
| exception.getMessage()); | |||
| } | |||
| } | |||
| @@ -0,0 +1,62 @@ | |||
| package org.apache.ant.engine; | |||
| import java.util.*; | |||
| public class HierarchicalHashtable extends Hashtable { | |||
| private HierarchicalHashtable parent; | |||
| public HierarchicalHashtable() { | |||
| this(null); | |||
| } | |||
| public HierarchicalHashtable(HierarchicalHashtable parent) { | |||
| super(); | |||
| this.parent = parent; | |||
| } | |||
| public HierarchicalHashtable getParent() { | |||
| return parent; | |||
| } | |||
| public void setParent(HierarchicalHashtable parent) { | |||
| this.parent = parent; | |||
| } | |||
| public List getPropertyNames() { | |||
| ArrayList list = new ArrayList(); | |||
| Enumeration e = keys(); | |||
| while (e.hasMoreElements()) { | |||
| list.add(e.nextElement()); | |||
| } | |||
| if (getParent() != null) { | |||
| list.addAll(getParent().getPropertyNames()); | |||
| } | |||
| return list; | |||
| } | |||
| public Object getPropertyValue(String name) { | |||
| Object value = get(name); | |||
| if (value == null && getParent() != null) { | |||
| return getParent().getPropertyValue(name); | |||
| } | |||
| return value; | |||
| } | |||
| public void setPropertyValue(String name, Object value) { | |||
| put(name, value); | |||
| } | |||
| public void removePropertyValue(String name) { | |||
| Object value = get(name); | |||
| if (value == null && getParent() != null) { | |||
| getParent().removePropertyValue(name); | |||
| } | |||
| if (value != null) { | |||
| remove(name); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,124 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.ant.engine; | |||
| import java.util.*; | |||
| import org.apache.ant.AntException; | |||
| import org.apache.ant.tasks.Task; | |||
| /** | |||
| * The TaskEngine interface defines the methods that a TaskEngine are required | |||
| * to implement. This interface is also passed to each Task in order for them to | |||
| * get access to some utility functions like inserting a new Task during a run, | |||
| * or forcing the execution path of Tasks to be modified. | |||
| */ | |||
| public interface TaskEngine { | |||
| void addAntEngineListener(AntEngineListener listener); | |||
| void removeAntEngineListener(AntEngineListener listener); | |||
| void execute(Task task) throws AntException; | |||
| void execute(Task root, Task task) throws AntException; | |||
| void message(Task task, String message); | |||
| Task getNextExecuteTask(); | |||
| /** | |||
| * Returns a list of all property names that the current task stack is aware | |||
| * of. This is a recursive list of all property names. | |||
| */ | |||
| List getPropertyNames(); | |||
| /** | |||
| * May be called to obtain property values that have been defined. Property | |||
| * values are maintained in a hierarchical manner as each task is executed. | |||
| * When a property is requested, if the current execution level does not | |||
| * contain the property, the execution parent is then queried. This | |||
| * continues until there is no where else to go! | |||
| * <p></p> | |||
| * Maybe this should be a Hashtable implementation and be able to return | |||
| * Object? Is that a little overkill considering these values will usually | |||
| * be Strings? Perhaps someone will have a farfetched idea of storing a | |||
| * Task in a property? | |||
| */ | |||
| Object getPropertyValue(String name); | |||
| /** | |||
| * Adds the name-value pair to this execution stack property list. If the | |||
| * property is declared in parent tasks, I don't really see a reason for not | |||
| * adding it again to this execution list. This would achieve a nice scoped | |||
| * parameter list that is dictated by nesting levels. | |||
| * <p></p> | |||
| * This is against the current Ant (1.2) specification, but I'm not sure why | |||
| * that restriction was there. It would be simple to implement here if it | |||
| * again required. | |||
| */ | |||
| void setPropertyValue(String name, Object value); | |||
| /** | |||
| * Removes the given property from the property list. I haven't thought too | |||
| * much about the rules behind this method. My current thinking is that the | |||
| * property is removed no matter what level of the execution stack the | |||
| * property was defined in. I think this should be good in most cases. If it | |||
| * ever surfaces that the property should just be unavailable for this stack | |||
| * level (and other's below it), then the implementation can be modified to | |||
| * keep a list of these "unavailable" properties. | |||
| */ | |||
| void removePropertyValue(String name); | |||
| } | |||
| @@ -0,0 +1,397 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.ant.engine; | |||
| import java.util.*; | |||
| import org.apache.ant.AntException; | |||
| import org.apache.ant.tasks.Task; | |||
| /** | |||
| * The engine that actually invokes each Task. In addition to specifying a Task | |||
| * to execute, it may be desirable to specify the root Task that will define | |||
| * an execution cycle. | |||
| */ | |||
| public class TaskEngineImpl implements TaskEngine { | |||
| /** | |||
| * Analagous to a call stack, but with Tasks. | |||
| */ | |||
| protected Stack taskStack = new Stack();; | |||
| /** | |||
| * As the task stack is built, a mirror representation will also be | |||
| * contructed that will hold property values. | |||
| */ | |||
| protected Stack propertyStack = new Stack(); | |||
| /** | |||
| * Keeps track of AntEngineListeners. We don't have to use Vector because we | |||
| * take care of synchronization on the add, remove, and iteration operations. | |||
| */ | |||
| protected ArrayList listenerList = new ArrayList(); | |||
| private int engineLevel = 0; | |||
| /** | |||
| * Constructor is private so it cannot be instantiated. Users of this class | |||
| * will get an instance by using the getTaskEngine() method. This will allow | |||
| * us to have a simple Factory implementation. We may use a Singleton | |||
| * implementation, or a collection pool. The choice is up to us. | |||
| */ | |||
| private TaskEngineImpl() { | |||
| super(); | |||
| } | |||
| /** | |||
| * Return a usable instance of a TaskEngine to the requestor. Nothing | |||
| * sophisticated yet, simple doles out a new instance each time. | |||
| */ | |||
| public static TaskEngine getTaskEngine() { | |||
| return new TaskEngineImpl(); | |||
| } | |||
| /** | |||
| * Walk the list of Tasks backwards until the root is reached. Keep track of | |||
| * the Tasks along the way in a Stack. Return null if the root Task is not a | |||
| * parent of the provided Task. | |||
| */ | |||
| protected Stack getTaskStack(Task root, Task task) { | |||
| Stack stack = new Stack(); | |||
| while (task != null) { | |||
| stack.push(task); | |||
| if (task == root) { | |||
| return stack; | |||
| } | |||
| task = task.getParent(); | |||
| } | |||
| return null; | |||
| } | |||
| /** | |||
| * Returns the next Task to be executed from the taskStack. The task is not | |||
| * removed from the Stack. | |||
| */ | |||
| public Task getNextExecuteTask() { | |||
| try { | |||
| return (Task)taskStack.peek(); | |||
| } catch (EmptyStackException esx) { | |||
| return null; | |||
| } | |||
| } | |||
| /** | |||
| * If no root is specified, we will assume that the user wants to execute | |||
| * the Task with no root. This is accomplished by using the Task parameter | |||
| * as its own root. | |||
| */ | |||
| public void execute(Task task) throws AntException { | |||
| execute(task, task); | |||
| } | |||
| /** | |||
| * This is the workhorse, however it has been made to be very simple. Given | |||
| * the ability to specify a path between root and the target Task, we build | |||
| * a trail of Tasks to connect the two. Next we execute each Task on the way | |||
| * between the two Tasks. Once we arrive at the Task to execute, we execute | |||
| * all of its chlidren. | |||
| */ | |||
| public void execute(Task root, Task task) throws AntException { | |||
| fireEngineStart(); | |||
| try { | |||
| taskStack = getTaskStack(root, task);; | |||
| if (taskStack == null) { | |||
| throw new AntException( | |||
| "The execution root Task is not an ancestor of the execution Task."); | |||
| } | |||
| // Pop thru the stack and execute each Task we come across. | |||
| while (!taskStack.isEmpty()) { | |||
| executeTask(taskStack); | |||
| } | |||
| } finally { | |||
| fireEngineFinish(); | |||
| } | |||
| } | |||
| /** | |||
| * A recursive routine that allows all Tasks in the stack to be executed. At | |||
| * the same time, the stack may grow to include new Tasks. | |||
| */ | |||
| protected void executeTask(Stack taskStack) throws AntException { | |||
| Task task = (Task)taskStack.pop(); | |||
| fireTaskStart(task); | |||
| try { | |||
| // Add a new property holder for this task to the property stack. Note | |||
| // that the parent of the new holder is the current stack head. | |||
| if (task.isPropertyContainer()) { | |||
| if (propertyStack.isEmpty()) { | |||
| propertyStack.push(new HierarchicalHashtable()); | |||
| } else { | |||
| propertyStack.push(new HierarchicalHashtable( | |||
| (HierarchicalHashtable)propertyStack.peek())); | |||
| } | |||
| } | |||
| // Allow Task to do whatever it may need to do before touching its | |||
| // children. | |||
| task.init(this); | |||
| // Iterate the Task's children and execute any priority Tasks. | |||
| Task[] tasks = task.getChildren(); | |||
| for (int i = 0, c = tasks.length; i < c; i++) { | |||
| if (tasks[i].getExecutionMode() == Task.EXECUTION_MODE_PRIORITY) { | |||
| taskStack.push(tasks[i]); | |||
| executeTask(taskStack); | |||
| } | |||
| } | |||
| // Allow the Task to validate. | |||
| task.validate(); | |||
| // Finally, execute the Task. | |||
| fireTaskExecute(task); | |||
| task.execute(this); | |||
| // We can discard the no londer needed property holder. | |||
| if (task.isPropertyContainer()) { | |||
| propertyStack.pop(); | |||
| } | |||
| } catch (AntException ax) { | |||
| fireTaskException(task, ax); | |||
| } finally { | |||
| fireTaskFinish(task); | |||
| } | |||
| } | |||
| /** | |||
| * Causes an AntEvent to be generated and fired to all listeners. | |||
| */ | |||
| public void message(Task task, String message) { | |||
| fireTaskMessage(task, message); | |||
| } | |||
| //////////////////////////////////////////////////////////////////////////// | |||
| // Listener Support // | |||
| //////////////////////////////////////////////////////////////////////////// | |||
| public synchronized void addAntEngineListener(AntEngineListener listener) { | |||
| if (!listenerList.contains(listener)) { | |||
| listenerList.add(listener); | |||
| } | |||
| } | |||
| public synchronized void removeAntEngineListener(AntEngineListener listener) { | |||
| if (listenerList.contains(listener)) { | |||
| listenerList.remove(listener); | |||
| } | |||
| } | |||
| protected synchronized void fireEngineStart() { | |||
| if (engineLevel++ > 0) return; | |||
| AntEvent e = new AntEvent(this); | |||
| for (int i = 0; i < listenerList.size(); i++) { | |||
| ((AntEngineListener)listenerList.get(i)).engineStart(e); | |||
| } | |||
| } | |||
| protected synchronized void fireEngineFinish() { | |||
| if (--engineLevel > 0) return; | |||
| AntEvent e = new AntEvent(this); | |||
| for (int i = 0; i < listenerList.size(); i++) { | |||
| ((AntEngineListener)listenerList.get(i)).engineFinish(e); | |||
| } | |||
| } | |||
| protected synchronized void fireTaskStart(Task task) { | |||
| AntEvent e = new AntEvent(this, task); | |||
| for (int i = 0; i < listenerList.size(); i++) { | |||
| ((AntEngineListener)listenerList.get(i)).taskStart(e); | |||
| } | |||
| } | |||
| protected synchronized void fireTaskExecute(Task task) { | |||
| AntEvent e = new AntEvent(this, task); | |||
| for (int i = 0; i < listenerList.size(); i++) { | |||
| ((AntEngineListener)listenerList.get(i)).taskExecute(e); | |||
| } | |||
| } | |||
| protected synchronized void fireTaskFinish(Task task) { | |||
| AntEvent e = new AntEvent(this, task); | |||
| for (int i = 0; i < listenerList.size(); i++) { | |||
| ((AntEngineListener)listenerList.get(i)).taskFinish(e); | |||
| } | |||
| } | |||
| protected synchronized void fireTaskMessage(Task task, String message) { | |||
| AntEvent e = new AntEvent(this, task); | |||
| for (int i = 0; i < listenerList.size(); i++) { | |||
| ((AntEngineListener)listenerList.get(i)).taskMessage(e, message); | |||
| } | |||
| } | |||
| protected synchronized void fireTaskException(Task task, AntException exception) { | |||
| AntEvent e = new AntEvent(this, task); | |||
| for (int i = 0; i < listenerList.size(); i++) { | |||
| ((AntEngineListener)listenerList.get(i)).taskException(e, exception); | |||
| } | |||
| } | |||
| //////////////////////////////////////////////////////////////////////////// | |||
| // Property Support Methods // | |||
| //////////////////////////////////////////////////////////////////////////// | |||
| /** | |||
| * This is the routine that will perform key substitution. Phrase will come | |||
| * in as "src/${someparam}" and be converted to the appropriate "normalized" | |||
| * string. I suppose while I'm doing this we should support phrases with | |||
| * nested keys, such as "src/${build${token}}". Also, we should properly | |||
| * handle cases where ${someparam} will evaluate to ${anotherparam}. | |||
| * <p></p> | |||
| * One thing that will be different from the Ant 1.2 mechanismoccurs when a | |||
| * parameter value is not found. The substitution routine inserts it back in | |||
| * the phrase unchanged. I have opted to insert a zero-length string | |||
| * instead. | |||
| * <p></p> | |||
| * I should add a switch to the engine that will give the user the ability | |||
| * to throw an exception if a key is not found. Pretty easy, except this | |||
| * method is a strange place for an AntException to be thrown. Perhaps I | |||
| * should use a RuntimeException instead... | |||
| * <p></p> | |||
| * A brief rundown on the logic here: | |||
| * I check for the first instances of a key prefix. | |||
| * If none found we return the phrase as is. | |||
| * If key prefix is found get location of next key prefix and suffix. | |||
| * If suffix is found first, we have found a key. | |||
| * If there is no suffix, we return the phrase. | |||
| */ | |||
| static final String KEY_PREFIX = "${"; | |||
| static final String KEY_SUFFIX = "}"; | |||
| protected String substitute(String phrase) { | |||
| StringBuffer sb = new StringBuffer(phrase); | |||
| int startPoint = 0; | |||
| while (startPoint >= 0 && startPoint < phrase.length()) { | |||
| int pre1 = startPoint + phrase.substring(startPoint).indexOf(KEY_PREFIX); | |||
| if (pre1 < 0) break; | |||
| int suf1 = phrase.substring(pre1 + KEY_PREFIX.length()).indexOf(KEY_SUFFIX); | |||
| if (suf1 < 0) break; | |||
| suf1 = suf1 + pre1 + KEY_PREFIX.length(); | |||
| int pre2 = phrase.substring(pre1 + KEY_PREFIX.length()).indexOf(KEY_PREFIX); | |||
| if (pre2 < 0) { | |||
| pre2 = phrase.length() + 1; | |||
| } else { | |||
| pre2 = pre2 + pre1 + KEY_PREFIX.length(); | |||
| } | |||
| if (suf1 < pre2) { | |||
| // we have found a token | |||
| String key = sb.substring(pre1 + KEY_PREFIX.length(), suf1); | |||
| sb.delete(pre1, suf1 + 1); | |||
| Object value = getPropertyValueNoSubstitution(key); | |||
| if (value != null) { | |||
| sb.insert(pre1, value.toString()); | |||
| } | |||
| return substitute(sb.toString()); | |||
| } | |||
| startPoint = pre2; | |||
| } | |||
| return sb.toString(); | |||
| } | |||
| public List getPropertyNames() { | |||
| if (propertyStack.isEmpty()) return new ArrayList(); | |||
| HierarchicalHashtable hash = (HierarchicalHashtable)propertyStack.peek(); | |||
| return hash.getPropertyNames(); | |||
| } | |||
| public Object getPropertyValue(String name) { | |||
| if (propertyStack.isEmpty()) return null; | |||
| HierarchicalHashtable hash = (HierarchicalHashtable)propertyStack.peek(); | |||
| Object result = hash.getPropertyValue(name); | |||
| if (result instanceof String) { | |||
| return substitute((String)result); | |||
| } else { | |||
| return result; | |||
| } | |||
| } | |||
| protected Object getPropertyValueNoSubstitution(String name) { | |||
| if (propertyStack.isEmpty()) return null; | |||
| HierarchicalHashtable hash = (HierarchicalHashtable)propertyStack.peek(); | |||
| return hash.getPropertyValue(name); | |||
| } | |||
| public void setPropertyValue(String name, Object value) { | |||
| if (propertyStack.isEmpty()) return; | |||
| HierarchicalHashtable hash = (HierarchicalHashtable)propertyStack.peek(); | |||
| hash.setPropertyValue(name, value); | |||
| } | |||
| public void removePropertyValue(String name) { | |||
| if (propertyStack.isEmpty()) return; | |||
| HierarchicalHashtable hash = (HierarchicalHashtable)propertyStack.peek(); | |||
| hash.remove(name); | |||
| } | |||
| } | |||
| @@ -0,0 +1,189 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.ant.tasks; | |||
| import java.util.*; | |||
| import org.apache.ant.AntException; | |||
| import org.apache.ant.engine.TaskEngine; | |||
| import org.apache.ant.tasks.Task; | |||
| public abstract class BaseTask implements Task { | |||
| protected Task parent; | |||
| protected ArrayList children = new ArrayList(); | |||
| protected String taskName; | |||
| protected Properties properties = new Properties(); | |||
| public BaseTask() { | |||
| super(); | |||
| } | |||
| public void init(TaskEngine engine) throws AntException { | |||
| } | |||
| public void execute(TaskEngine engine) throws AntException { | |||
| } | |||
| // abstract public String getTaskTag(); | |||
| public void validate() throws AntException {} | |||
| public String getFullyQualifiedName() { | |||
| if (getParent() == null) return Task.NAME_SEPARATOR + taskName; | |||
| return getParent().getFullyQualifiedName() + Task.NAME_SEPARATOR + taskName; | |||
| } | |||
| public int hashCode() { | |||
| return getFullyQualifiedName().hashCode(); | |||
| } | |||
| public String getTaskName() { | |||
| return taskName; | |||
| } | |||
| public void setTaskName(String taskName) { | |||
| this.taskName = taskName; | |||
| } | |||
| public int getExecutionMode() { | |||
| return Task.EXECUTION_MODE_PRIORITY; | |||
| } | |||
| public String getAttributeValue(String name) { | |||
| /**@todo: Implement this org.apache.ant.Task method*/ | |||
| throw new java.lang.UnsupportedOperationException("Method getAttributeValue() not yet implemented."); | |||
| } | |||
| public Task getParent() { | |||
| return parent; | |||
| } | |||
| /** | |||
| * We have to trust the developers to not screw up the hierarchy by changing | |||
| * the parent of a Task when it is a child of another. | |||
| */ | |||
| public void setParent(Task parent) { | |||
| this.parent = parent; | |||
| } | |||
| public Task[] getChildren() { | |||
| return (Task[])children.toArray(new Task[children.size()]); | |||
| } | |||
| public void addChild(Task task) { | |||
| children.add(task); | |||
| task.setParent(this); | |||
| } | |||
| public void removeChild(Task task) { | |||
| children.remove(task); | |||
| } | |||
| public Task getRootTask() { | |||
| if (getParent() != null) { | |||
| return getParent().getRootTask(); | |||
| } | |||
| return this; | |||
| } | |||
| protected Task getTaskByName(String taskName) { | |||
| Task[] tasks = getChildren(); | |||
| for (int i = 0, c = tasks.length; i < c; i++) { | |||
| if (tasks[i].getTaskName().equals(taskName)) { | |||
| return tasks[i]; | |||
| } | |||
| } | |||
| return null; | |||
| } | |||
| public Task getTask(String taskPath) { | |||
| taskPath = taskPath.trim(); | |||
| int slashPos = taskPath.indexOf("/"); | |||
| // starts with '/' | |||
| if (slashPos == 0) { | |||
| return getRootTask().getTask(taskPath.substring(slashPos + 1)); | |||
| } else | |||
| // starts with '../' | |||
| if (taskPath.startsWith("../") || taskPath.equals("..")) { | |||
| return getParent().getTask(taskPath.substring(3)); | |||
| } else | |||
| // starts with './' | |||
| if (taskPath.startsWith("./") || taskPath.equals(".")) { | |||
| return getTask(taskPath.substring(2)); | |||
| } else | |||
| // starts with 'some_level/' | |||
| if (slashPos > 0) { | |||
| String levelName = taskPath.substring(0, slashPos); | |||
| return getTaskByName(levelName).getTask(taskPath.substring(slashPos + 1)); | |||
| } | |||
| // there are no more directories; what remains is the name of the task | |||
| if (slashPos < 0) { | |||
| if (taskPath.length() == 0) return this; | |||
| return getTaskByName(taskPath); | |||
| } | |||
| return null; | |||
| } | |||
| public boolean isPropertyContainer() { | |||
| return false; | |||
| } | |||
| } | |||
| @@ -0,0 +1,179 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.ant.tasks; | |||
| import java.util.*; | |||
| import org.apache.ant.AntException; | |||
| import org.apache.ant.engine.TaskEngine; | |||
| /** | |||
| * Task is the core interface for all structures that will be processed by the | |||
| * TaskEngine. | |||
| */ | |||
| public interface Task { | |||
| public static final int EXECUTION_MODE_IMPLICIT = 0; | |||
| public static final int EXECUTION_MODE_EXPLICIT = 1; | |||
| public static final int EXECUTION_MODE_PRIORITY = 2; | |||
| public static final char NAME_SEPARATOR = '/'; | |||
| /** | |||
| * Causes the existing Task implementation to execute. | |||
| */ | |||
| void execute(TaskEngine engine) throws AntException; | |||
| /** | |||
| * Called when the Task first gets "noticed" by the TaskEngine. | |||
| */ | |||
| void init(TaskEngine engine) throws AntException; | |||
| /** | |||
| * Each Task should have the ability to validate its state. This would be | |||
| * invoked by the TaskEngine prior to commencing an execution cycle. | |||
| */ | |||
| void validate() throws AntException; | |||
| /** | |||
| * Just a simple name used to identify a Task. This name is only sufficient | |||
| * for simple debugging and GUI output. It does not uniquely identify a | |||
| * Task. | |||
| * | |||
| * @see #getFullyQualifiedName | |||
| */ | |||
| String getTaskName(); | |||
| /** | |||
| * Although this method seems to tie the concept of XML "tags", it is not | |||
| * necessarily so. The tag name will serve as a general description of the | |||
| * type of tag represented by this class instance. It is primarily used by | |||
| * Tasks with sub-Tasks that are not assigned to a specific class | |||
| * implementation. | |||
| * | |||
| * @see org.apache.ant.tasks.UnknownTask | |||
| */ | |||
| // String getTaskTag(); | |||
| /** | |||
| * A mechanism for locating a task relative to the current task. This | |||
| * navigation sceme will mimic a typical OS system. '..' will move back | |||
| * a level in the Task tree. If taskPath begins with '/' then the root node | |||
| * will be used as a starting point. | |||
| * <p></p> | |||
| * Returns null of no task is found at this location. | |||
| */ | |||
| Task getTask(String taskPath); | |||
| /** | |||
| * Proceed backwards through the nodes until we come across the first Task | |||
| * in the tree. This is the root Task. | |||
| */ | |||
| Task getRootTask(); | |||
| /** | |||
| * The "fully-qualified" name of a Task is the Task's name, prepended by its | |||
| * parent's name, prepended by its parent's name, etc. This method may be | |||
| * used by the Task's hashCode() method to calculate a hash that will | |||
| * uniquely identify a Task. | |||
| */ | |||
| String getFullyQualifiedName(); | |||
| /** | |||
| * Determines whether this Task is executed whenever its parent is executed, | |||
| * or if its execution must be specifically requested. | |||
| * <p></p> | |||
| * <dl><dt>EXECUTION_MODE_EXPLICIT</dt> | |||
| * <dd>Requires interaction by the TaskEngine in order to execute.</dd> | |||
| * <dt>EXECUTION_MODE_IMPLICIT</dt> | |||
| * <dd>This Task is automatically executed when its parent is | |||
| * executed.</dd> | |||
| * <dt>EXECUTION_MODE_PRIORITY</dt> | |||
| * <dd>These Tasks are executed prior to its parent's execution</dd></dl> | |||
| * <p></p> | |||
| * The default mode should probably be EXECUTION_MODE_IMPLICIT. In the | |||
| * build domain of Ant, every Task below a Task will normally be executed. | |||
| * The major exception to this is the Target. When a Project Task is | |||
| * executed, all Target Tasks do <i>not</i> automatically fire, however all | |||
| * Property Tasks <i>do</i> execute. | |||
| */ | |||
| int getExecutionMode(); | |||
| /** | |||
| * Determines whether a Task is suitable for holding property values. | |||
| */ | |||
| boolean isPropertyContainer(); | |||
| /** | |||
| * Each Task will hold its attributes in some manner. This method will allow | |||
| * the Task implementation to return the value of its attribute. | |||
| */ | |||
| String getAttributeValue(String name); | |||
| /** | |||
| * Returns this Task's parent Task. If this Task is the root Task, then this | |||
| * method will return null. | |||
| */ | |||
| Task getParent(); | |||
| /** | |||
| * Sets the Task's parent. | |||
| */ | |||
| void setParent(Task parent); | |||
| /** | |||
| * Returns the an array of Task objects that are subordinate to this Task. | |||
| */ | |||
| Task[] getChildren(); | |||
| } | |||
| @@ -0,0 +1,113 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.ant.tasks.build; | |||
| import org.apache.ant.AntException; | |||
| import org.apache.ant.engine.TaskEngine; | |||
| import org.apache.ant.tasks.BaseTask; | |||
| import org.apache.ant.tasks.Task; | |||
| public class Project extends BaseTask { | |||
| private String def; | |||
| private String basedir; | |||
| public Project() { | |||
| super(); | |||
| } | |||
| public String getDefault() { | |||
| return def; | |||
| } | |||
| public void setDefault(String newDefault) { | |||
| def = newDefault; | |||
| } | |||
| public void setBasedir(String newBasedir) { | |||
| basedir = newBasedir; | |||
| } | |||
| public String getBasedir() { | |||
| return basedir; | |||
| } | |||
| //////////////////////////////////////////////////////////////////////////// | |||
| // BaseTask Implementation // | |||
| //////////////////////////////////////////////////////////////////////////// | |||
| public void init(TaskEngine engine) throws AntException { | |||
| } | |||
| /** | |||
| * Here is where we check and see if there are any Targets specified. We do | |||
| * this by peeking into the known taskStack and checking to see if a Target | |||
| * is next to be executed. If not, we add our default Target to the list. | |||
| */ | |||
| public void execute(TaskEngine engine) throws AntException { | |||
| // see if it is necessary to invoke the default task | |||
| Task task = engine.getNextExecuteTask(); | |||
| if (task == null && getDefault() != null) { | |||
| Task defaultTask = getTask(getDefault()); | |||
| if (defaultTask != null) { | |||
| engine.execute(defaultTask); | |||
| } | |||
| } | |||
| } | |||
| public boolean isPropertyContainer() { | |||
| return true; | |||
| } | |||
| } | |||
| @@ -0,0 +1,123 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.ant.tasks.build; | |||
| import org.apache.ant.AntException; | |||
| import org.apache.ant.engine.TaskEngine; | |||
| import org.apache.ant.tasks.BaseTask; | |||
| import org.apache.ant.tasks.Task; | |||
| public class Target extends BaseTask { | |||
| private String depends; | |||
| private String ifCond; | |||
| private String unlessCond; | |||
| public Target() { | |||
| super(); | |||
| } | |||
| public String getIf() { | |||
| return ifCond; | |||
| } | |||
| public void setIf(String condition) { | |||
| this.ifCond = condition; | |||
| } | |||
| public String getUnless() { | |||
| return unlessCond; | |||
| } | |||
| public void setUnless(String condition) { | |||
| this.unlessCond = condition; | |||
| } | |||
| public void setDepends(String newDepends) { | |||
| this.depends = newDepends; | |||
| } | |||
| public String getDepends() { | |||
| return depends; | |||
| } | |||
| //////////////////////////////////////////////////////////////////////////// | |||
| // BaseTask Implementation // | |||
| //////////////////////////////////////////////////////////////////////////// | |||
| public int getExecutionMode() { | |||
| return Task.EXECUTION_MODE_EXPLICIT; | |||
| } | |||
| /** | |||
| * Note that dependencies are executed before the task at hand. | |||
| */ | |||
| public void execute(TaskEngine engine) throws AntException { | |||
| if (getDepends() != null && getDepends().length() > 0) { | |||
| Task dependencyTask = getTask(getDepends()); | |||
| if (dependencyTask == null) { | |||
| throw new AntException( | |||
| "Cannot find dependency, " + getDepends() + " from Task."); | |||
| } | |||
| engine.execute(dependencyTask); | |||
| } | |||
| } | |||
| public boolean isPropertyContainer() { | |||
| return true; | |||
| } | |||
| } | |||
| @@ -0,0 +1,97 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.ant.tasks.util; | |||
| import org.apache.ant.AntException; | |||
| import org.apache.ant.engine.TaskEngine; | |||
| import org.apache.ant.tasks.BaseTask; | |||
| public class Property extends BaseTask { | |||
| private String value; | |||
| private String name; | |||
| public Property() { | |||
| super(); | |||
| } | |||
| public String getValue() { | |||
| return value; | |||
| } | |||
| public void setValue(String value) { | |||
| this.value = value; | |||
| } | |||
| public void setName(String name) { | |||
| this.name = name; | |||
| } | |||
| public String getName() { | |||
| return name; | |||
| } | |||
| //////////////////////////////////////////////////////////////////////////// | |||
| // BaseTask Implementation // | |||
| //////////////////////////////////////////////////////////////////////////// | |||
| public void execute(TaskEngine engine) throws AntException { | |||
| if (getParent() == null) { | |||
| throw new AntException("A Property Task must have a parent Task."); | |||
| } | |||
| engine.setPropertyValue(getName(), getValue()); | |||
| } | |||
| } | |||
| @@ -0,0 +1,81 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.ant.tasks.util; | |||
| import java.util.*; | |||
| import org.apache.ant.AntException; | |||
| import org.apache.ant.engine.TaskEngine; | |||
| import org.apache.ant.tasks.BaseTask; | |||
| public class PropertyDump extends BaseTask { | |||
| public PropertyDump() { | |||
| super(); | |||
| } | |||
| //////////////////////////////////////////////////////////////////////////// | |||
| // BaseTask Implementation // | |||
| //////////////////////////////////////////////////////////////////////////// | |||
| public void execute(TaskEngine engine) throws AntException { | |||
| List propNames = engine.getPropertyNames(); | |||
| for (Iterator i = propNames.iterator(); i.hasNext();) { | |||
| String name = (String)i.next(); | |||
| String value = engine.getPropertyValue(name).toString(); | |||
| engine.message(this, name + " = " + value); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,146 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 1999, 2000 The Apache Software Foundation. All rights | |||
| * reserved. | |||
| * | |||
| * Redistribution and use in source and binary forms, with or without | |||
| * modification, are permitted provided that the following conditions | |||
| * are met: | |||
| * | |||
| * 1. Redistributions of source code must retain the above copyright | |||
| * notice, this list of conditions and the following disclaimer. | |||
| * | |||
| * 2. Redistributions in binary form must reproduce the above copyright | |||
| * notice, this list of conditions and the following disclaimer in | |||
| * the documentation and/or other materials provided with the | |||
| * distribution. | |||
| * | |||
| * 3. The end-user documentation included with the redistribution, if | |||
| * any, must include the following acknowlegement: | |||
| * "This product includes software developed by the | |||
| * Apache Software Foundation (http://www.apache.org/)." | |||
| * Alternately, this acknowlegement may appear in the software itself, | |||
| * if and wherever such third-party acknowlegements normally appear. | |||
| * | |||
| * 4. The names "The Jakarta Project", "Tomcat", and "Apache Software | |||
| * Foundation" must not be used to endorse or promote products derived | |||
| * from this software without prior written permission. For written | |||
| * permission, please contact apache@apache.org. | |||
| * | |||
| * 5. Products derived from this software may not be called "Apache" | |||
| * nor may "Apache" appear in their names without prior written | |||
| * permission of the Apache Group. | |||
| * | |||
| * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
| * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
| * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
| * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
| * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
| * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
| * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
| * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
| * SUCH DAMAGE. | |||
| * ==================================================================== | |||
| * | |||
| * This software consists of voluntary contributions made by many | |||
| * individuals on behalf of the Apache Software Foundation. For more | |||
| * information on the Apache Software Foundation, please see | |||
| * <http://www.apache.org/>. | |||
| */ | |||
| package org.apache.ant.test; | |||
| import org.apache.ant.AntException; | |||
| import org.apache.ant.engine.DefaultEngineListener; | |||
| import org.apache.ant.engine.TaskEngine; | |||
| import org.apache.ant.engine.TaskEngineImpl; | |||
| import org.apache.ant.tasks.Task; | |||
| import org.apache.ant.tasks.build.Project; | |||
| import org.apache.ant.tasks.build.Target; | |||
| import org.apache.ant.tasks.util.Property; | |||
| import org.apache.ant.tasks.util.PropertyDump; | |||
| public class SimpleTest { | |||
| Task target; | |||
| public SimpleTest() { | |||
| try { | |||
| Task rootTask = buildProject(); | |||
| TaskEngine engine = TaskEngineImpl.getTaskEngine(); | |||
| engine.addAntEngineListener(new DefaultEngineListener()); | |||
| engine.execute(rootTask, target); | |||
| } catch (AntException ax) { | |||
| ax.printStackTrace(System.err); | |||
| } | |||
| } | |||
| protected Task buildProject() { | |||
| Project project = new Project(); | |||
| project.setTaskName("project"); | |||
| project.setBasedir("somedir"); | |||
| project.setDefault("build"); | |||
| Property property1 = new Property(); | |||
| property1.setTaskName("prop1"); | |||
| property1.setName("basedir"); | |||
| property1.setValue("/org/apache"); | |||
| project.addChild(property1); | |||
| Property property2 = new Property(); | |||
| property2.setTaskName("prop2"); | |||
| property2.setName("dir1"); | |||
| property2.setValue("${basedir}/ant"); | |||
| project.addChild(property2); | |||
| Target target1 = new Target(); | |||
| target1.setTaskName("clean"); | |||
| project.addChild(target1); | |||
| PropertyDump pd = new PropertyDump(); | |||
| pd.setTaskName("dump"); | |||
| target1.addChild(pd); | |||
| Target target2 = new Target(); | |||
| target2.setTaskName("prepare"); | |||
| target2.setDepends("../clean"); | |||
| project.addChild(target2); | |||
| Property property3 = new Property(); | |||
| property3.setTaskName("prop3"); | |||
| property3.setName("dir2"); | |||
| property3.setValue("${dir1}/tasks"); | |||
| target2.addChild(property3); | |||
| Target target3 = new Target(); | |||
| target3.setTaskName("build"); | |||
| target3.setDepends("../prepare"); | |||
| project.addChild(target3); | |||
| Property property4 = new Property(); | |||
| property4.setTaskName("prop4"); | |||
| property4.setName("dir3"); | |||
| property4.setValue("r2}"); | |||
| target3.addChild(property4); | |||
| Property property5 = new Property(); | |||
| property5.setTaskName("prop5"); | |||
| property5.setName("dir4"); | |||
| property5.setValue("${di${dir3}"); | |||
| target3.addChild(property5); | |||
| target = target2; | |||
| return project; | |||
| } | |||
| public static void main(String[] args) { | |||
| SimpleTest simpleTest1 = new SimpleTest(); | |||
| } | |||
| } | |||