Submitted by: Erik Meade <emeade@geekfarm.org> git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268151 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -4,7 +4,7 @@ Changes from Ant 1.2 to the current sources | |||||
| Other changes: | Other changes: | ||||
| -------------- | -------------- | ||||
| * New tasks: propertyfile, depend | |||||
| * New tasks: propertyfile, depend, antlr | |||||
| * Added output attribute to <java>. | * Added output attribute to <java>. | ||||
| @@ -70,6 +70,7 @@ | |||||
| <available property="junit.present" classname="junit.framework.TestCase" /> | <available property="junit.present" classname="junit.framework.TestCase" /> | ||||
| <available property="ftp.present" classname="com.oroinc.net.ftp.FTPClient" /> | <available property="ftp.present" classname="com.oroinc.net.ftp.FTPClient" /> | ||||
| <available property="starteam.present" classname="com.starbase.util.Platform" /> | <available property="starteam.present" classname="com.starbase.util.Platform" /> | ||||
| <available property="antlr.present" classname="antlr.Tool" /> | |||||
| </target> | </target> | ||||
| <!-- =================================================================== --> | <!-- =================================================================== --> | ||||
| @@ -106,6 +107,7 @@ | |||||
| <exclude name="**/junit/*" unless="junit.present" /> | <exclude name="**/junit/*" unless="junit.present" /> | ||||
| <exclude name="**/FTP*.java" unless="ftp.present" /> | <exclude name="**/FTP*.java" unless="ftp.present" /> | ||||
| <exclude name="**/AntStarTeam*.java" unless="starteam.present" /> | <exclude name="**/AntStarTeam*.java" unless="starteam.present" /> | ||||
| <exclude name="**/ANTLR.java" unless="antlr.present" /> | |||||
| </javac> | </javac> | ||||
| <copy todir="${build.classes}"> | <copy todir="${build.classes}"> | ||||
| @@ -324,6 +326,7 @@ | |||||
| <pathelement location="${lib.dir}/${name}.jar" /> | <pathelement location="${lib.dir}/${name}.jar" /> | ||||
| <path refid="classpath" /> | <path refid="classpath" /> | ||||
| </classpath> | </classpath> | ||||
| <exclude name="org/apache/tools/ant/taskdefs/optional/ANTLRTest.java" unless="antlr.present" /> | |||||
| </javac> | </javac> | ||||
| </target> | </target> | ||||
| @@ -332,6 +335,7 @@ | |||||
| <!-- =================================================================== --> | <!-- =================================================================== --> | ||||
| <target name="runtests" depends="compiletests" if="junit.present"> | <target name="runtests" depends="compiletests" if="junit.present"> | ||||
| <junit printsummary="no" haltonfailure="yes" fork="${junit.fork}"> | <junit printsummary="no" haltonfailure="yes" fork="${junit.fork}"> | ||||
| <jvmarg value="-classic"/> | |||||
| <classpath> | <classpath> | ||||
| <pathelement location="${lib.dir}/${name}.jar" /> | <pathelement location="${lib.dir}/${name}.jar" /> | ||||
| <pathelement location="${build.tests}" /> | <pathelement location="${build.tests}" /> | ||||
| @@ -350,6 +354,9 @@ | |||||
| <!-- these depend on order --> | <!-- these depend on order --> | ||||
| <exclude name="org/apache/tools/ant/taskdefs/GUnzipTest.java" /> | <exclude name="org/apache/tools/ant/taskdefs/GUnzipTest.java" /> | ||||
| <exclude name="org/apache/tools/ant/taskdefs/GzipTest.java" /> | <exclude name="org/apache/tools/ant/taskdefs/GzipTest.java" /> | ||||
| <!-- only run this test if ANTLR is installed --> | |||||
| <exclude name="org/apache/tools/ant/taskdefs/optional/ANTLRTest.java" unless="antlr.present" /> | |||||
| </fileset> | </fileset> | ||||
| </batchtest> | </batchtest> | ||||
| @@ -358,12 +365,14 @@ | |||||
| </junit> | </junit> | ||||
| <!-- clean up again --> | <!-- clean up again --> | ||||
| <delete dir="src/etc/testcases/taskdefs/optional/antlr/antlr.tmp" /> | |||||
| <delete dir="src/etc/testcases/taskdefs/taskdefs.tmp" /> | <delete dir="src/etc/testcases/taskdefs/taskdefs.tmp" /> | ||||
| <delete dir="src/etc/testcases/taskdefs.tmp" /> | <delete dir="src/etc/testcases/taskdefs.tmp" /> | ||||
| </target> | </target> | ||||
| <target name="run.single.test" if="testcase" depends="compiletests"> | <target name="run.single.test" if="testcase" depends="compiletests"> | ||||
| <junit printsummary="no" haltonfailure="yes" fork="${junit.fork}"> | <junit printsummary="no" haltonfailure="yes" fork="${junit.fork}"> | ||||
| <jvmarg value="-classic"/> | |||||
| <classpath> | <classpath> | ||||
| <pathelement location="${lib.dir}/${name}.jar" /> | <pathelement location="${lib.dir}/${name}.jar" /> | ||||
| <pathelement location="${build.tests}" /> | <pathelement location="${build.tests}" /> | ||||
| @@ -0,0 +1,60 @@ | |||||
| class CalcParser extends Parser; | |||||
| options { | |||||
| buildAST = true; // uses CommonAST by default | |||||
| } | |||||
| expr | |||||
| : mexpr (PLUS^ mexpr)* SEMI! | |||||
| ; | |||||
| mexpr | |||||
| : atom (STAR^ atom)* | |||||
| ; | |||||
| atom: INT | |||||
| ; | |||||
| class CalcLexer extends Lexer; | |||||
| WS : (' ' | |||||
| | '\t' | |||||
| | '\n' | |||||
| | '\r') | |||||
| { _ttype = Token.SKIP; } | |||||
| ; | |||||
| LPAREN: '(' | |||||
| ; | |||||
| RPAREN: ')' | |||||
| ; | |||||
| STAR: '*' | |||||
| ; | |||||
| PLUS: '+' | |||||
| ; | |||||
| SEMI: ';' | |||||
| ; | |||||
| protected | |||||
| DIGIT | |||||
| : '0'..'9' | |||||
| ; | |||||
| INT : (DIGIT)+ | |||||
| ; | |||||
| class CalcTreeWalker extends TreeParser; | |||||
| expr returns [float r] | |||||
| { | |||||
| float a,b; | |||||
| r=0; | |||||
| } | |||||
| : #(PLUS a=expr b=expr) {r = a+b;} | |||||
| | #(STAR a=expr b=expr) {r = a*b;} | |||||
| | i:INT {r = (float)Integer.parseInt(i.getText());} | |||||
| ; | |||||
| @@ -0,0 +1,51 @@ | |||||
| <?xml version="1.0"?> | |||||
| <project name="antlr-test" basedir="."> | |||||
| <property name="tmp.dir" value="antlr.tmp"/> | |||||
| <target name="test1"> | |||||
| <antlr/> | |||||
| </target> | |||||
| <target name="test2"> | |||||
| <!-- delete the tmp directory, it may exists if a previous ANTLR test | |||||
| failed. This in turn will cause this test to fail, as it tests | |||||
| the build exception when the outputdirectory is invalid. --> | |||||
| <deltree dir="${tmp.dir}"/> | |||||
| <antlr target="antlr.g" outputdirectory="${tmp.dir}"/> | |||||
| </target> | |||||
| <target name="test3"> | |||||
| <mkdir dir="${tmp.dir}"/> | |||||
| <antlr target="antlr.g" outputdirectory="${tmp.dir}"/> | |||||
| </target> | |||||
| <target name="test4"> | |||||
| <deltree dir="${tmp.dir}"/> | |||||
| <mkdir dir="${tmp.dir}"/> | |||||
| <antlr target="java.g" outputdirectory="${tmp.dir}"/> | |||||
| <antlr target="java.tree.g" outputdirectory="${tmp.dir}"/> | |||||
| </target> | |||||
| <target name="test5"> | |||||
| <antlr target="java.tree.g" outputdirectory="${tmp.dir}" fork="yes"/> | |||||
| </target> | |||||
| <target name="test6"> | |||||
| <deltree dir="${tmp.dir}"/> | |||||
| <!-- This tmp.dir needs to be deleted by the build file which executes this test. --> | |||||
| <mkdir dir="${tmp.dir}"/> | |||||
| <antlr target="java.g" outputdirectory="${tmp.dir}" /> | |||||
| <antlr dir="${tmp.dir}" | |||||
| target="java.tree.g" | |||||
| outputdirectory="${tmp.dir}" | |||||
| fork="yes"/> | |||||
| </target> | |||||
| <target name="test7"> | |||||
| <antlr target="antlr.xml"/> | |||||
| </target> | |||||
| </project> | |||||
| @@ -0,0 +1,314 @@ | |||||
| /** Java 1.2 AST Recognizer Grammar | |||||
| * | |||||
| * Author: | |||||
| * Terence Parr parrt@jguru.com | |||||
| * | |||||
| * Version tracking now done with following ID: | |||||
| * | |||||
| * $Id$ | |||||
| * | |||||
| * This grammar is in the PUBLIC DOMAIN | |||||
| * | |||||
| * BUGS | |||||
| */ | |||||
| class JavaTreeParser extends TreeParser; | |||||
| options { | |||||
| importVocab = Java; | |||||
| } | |||||
| compilationUnit | |||||
| : (packageDefinition)? | |||||
| (importDefinition)* | |||||
| (typeDefinition)* | |||||
| ; | |||||
| packageDefinition | |||||
| : #( PACKAGE_DEF identifier ) | |||||
| ; | |||||
| importDefinition | |||||
| : #( IMPORT identifierStar ) | |||||
| ; | |||||
| typeDefinition | |||||
| : #(CLASS_DEF modifiers IDENT extendsClause implementsClause objBlock ) | |||||
| | #(INTERFACE_DEF modifiers IDENT extendsClause interfaceBlock ) | |||||
| ; | |||||
| typeSpec | |||||
| : #(TYPE typeSpecArray) | |||||
| ; | |||||
| typeSpecArray | |||||
| : #( ARRAY_DECLARATOR typeSpecArray ) | |||||
| | type | |||||
| ; | |||||
| type: identifier | |||||
| | builtInType | |||||
| ; | |||||
| builtInType | |||||
| : "void" | |||||
| | "boolean" | |||||
| | "byte" | |||||
| | "char" | |||||
| | "short" | |||||
| | "int" | |||||
| | "float" | |||||
| | "long" | |||||
| | "double" | |||||
| ; | |||||
| modifiers | |||||
| : #( MODIFIERS (modifier)* ) | |||||
| ; | |||||
| modifier | |||||
| : "private" | |||||
| | "public" | |||||
| | "protected" | |||||
| | "static" | |||||
| | "transient" | |||||
| | "final" | |||||
| | "abstract" | |||||
| | "native" | |||||
| | "threadsafe" | |||||
| | "synchronized" | |||||
| | "const" | |||||
| | "volatile" | |||||
| ; | |||||
| extendsClause | |||||
| : #(EXTENDS_CLAUSE (identifier)* ) | |||||
| ; | |||||
| implementsClause | |||||
| : #(IMPLEMENTS_CLAUSE (identifier)* ) | |||||
| ; | |||||
| interfaceBlock | |||||
| : #( OBJBLOCK | |||||
| ( methodDecl | |||||
| | variableDef | |||||
| )* | |||||
| ) | |||||
| ; | |||||
| objBlock | |||||
| : #( OBJBLOCK | |||||
| ( ctorDef | |||||
| | methodDef | |||||
| | variableDef | |||||
| | typeDefinition | |||||
| | #(STATIC_INIT slist) | |||||
| | #(INSTANCE_INIT slist) | |||||
| )* | |||||
| ) | |||||
| ; | |||||
| ctorDef | |||||
| : #(CTOR_DEF modifiers methodHead slist) | |||||
| ; | |||||
| methodDecl | |||||
| : #(METHOD_DEF modifiers typeSpec methodHead) | |||||
| ; | |||||
| methodDef | |||||
| : #(METHOD_DEF modifiers typeSpec methodHead (slist)?) | |||||
| ; | |||||
| variableDef | |||||
| : #(VARIABLE_DEF modifiers typeSpec variableDeclarator varInitializer) | |||||
| ; | |||||
| parameterDef | |||||
| : #(PARAMETER_DEF modifiers typeSpec IDENT ) | |||||
| ; | |||||
| objectinitializer | |||||
| : #(INSTANCE_INIT slist) | |||||
| ; | |||||
| variableDeclarator | |||||
| : IDENT | |||||
| | LBRACK variableDeclarator | |||||
| ; | |||||
| varInitializer | |||||
| : #(ASSIGN initializer) | |||||
| | | |||||
| ; | |||||
| initializer | |||||
| : expression | |||||
| | arrayInitializer | |||||
| ; | |||||
| arrayInitializer | |||||
| : #(ARRAY_INIT (initializer)*) | |||||
| ; | |||||
| methodHead | |||||
| : IDENT #( PARAMETERS (parameterDef)* ) (throwsClause)? | |||||
| ; | |||||
| throwsClause | |||||
| : #( "throws" (identifier)* ) | |||||
| ; | |||||
| identifier | |||||
| : IDENT | |||||
| | #( DOT identifier IDENT ) | |||||
| ; | |||||
| identifierStar | |||||
| : IDENT | |||||
| | #( DOT identifier (STAR|IDENT) ) | |||||
| ; | |||||
| slist | |||||
| : #( SLIST (stat)* ) | |||||
| ; | |||||
| stat: typeDefinition | |||||
| | variableDef | |||||
| | expression | |||||
| | #(LABELED_STAT IDENT stat) | |||||
| | #("if" expression stat (stat)? ) | |||||
| | #( "for" | |||||
| #(FOR_INIT (variableDef | elist)?) | |||||
| #(FOR_CONDITION (expression)?) | |||||
| #(FOR_ITERATOR (elist)?) | |||||
| stat | |||||
| ) | |||||
| | #("while" expression stat) | |||||
| | #("do" stat expression) | |||||
| | #("break" (IDENT)? ) | |||||
| | #("continue" (IDENT)? ) | |||||
| | #("return" (expression)? ) | |||||
| | #("switch" expression (caseGroup)*) | |||||
| | #("throw" expression) | |||||
| | #("synchronized" expression stat) | |||||
| | tryBlock | |||||
| | slist // nested SLIST | |||||
| | EMPTY_STAT | |||||
| ; | |||||
| caseGroup | |||||
| : #(CASE_GROUP (#("case" expression) | "default")+ slist) | |||||
| ; | |||||
| tryBlock | |||||
| : #( "try" slist (handler)* (#("finally" slist))? ) | |||||
| ; | |||||
| handler | |||||
| : #( "catch" parameterDef slist ) | |||||
| ; | |||||
| elist | |||||
| : #( ELIST (expression)* ) | |||||
| ; | |||||
| expression | |||||
| : #(EXPR expr) | |||||
| ; | |||||
| expr: #(QUESTION expr expr expr) // trinary operator | |||||
| | #(ASSIGN expr expr) // binary operators... | |||||
| | #(PLUS_ASSIGN expr expr) | |||||
| | #(MINUS_ASSIGN expr expr) | |||||
| | #(STAR_ASSIGN expr expr) | |||||
| | #(DIV_ASSIGN expr expr) | |||||
| | #(MOD_ASSIGN expr expr) | |||||
| | #(SR_ASSIGN expr expr) | |||||
| | #(BSR_ASSIGN expr expr) | |||||
| | #(SL_ASSIGN expr expr) | |||||
| | #(BAND_ASSIGN expr expr) | |||||
| | #(BXOR_ASSIGN expr expr) | |||||
| | #(BOR_ASSIGN expr expr) | |||||
| | #(LOR expr expr) | |||||
| | #(LAND expr expr) | |||||
| | #(BOR expr expr) | |||||
| | #(BXOR expr expr) | |||||
| | #(BAND expr expr) | |||||
| | #(NOT_EQUAL expr expr) | |||||
| | #(EQUAL expr expr) | |||||
| | #(LT expr expr) | |||||
| | #(GT expr expr) | |||||
| | #(LE expr expr) | |||||
| | #(GE expr expr) | |||||
| | #(SL expr expr) | |||||
| | #(SR expr expr) | |||||
| | #(BSR expr expr) | |||||
| | #(PLUS expr expr) | |||||
| | #(MINUS expr expr) | |||||
| | #(DIV expr expr) | |||||
| | #(MOD expr expr) | |||||
| | #(STAR expr expr) | |||||
| | #(INC expr) | |||||
| | #(DEC expr) | |||||
| | #(POST_INC expr) | |||||
| | #(POST_DEC expr) | |||||
| | #(BNOT expr) | |||||
| | #(LNOT expr) | |||||
| | #("instanceof" expr expr) | |||||
| | #(UNARY_MINUS expr) | |||||
| | #(UNARY_PLUS expr) | |||||
| | primaryExpression | |||||
| ; | |||||
| primaryExpression | |||||
| : IDENT | |||||
| | #( DOT | |||||
| ( expr | |||||
| ( IDENT | |||||
| | arrayIndex | |||||
| | "this" | |||||
| | "class" | |||||
| | #( "new" IDENT elist ) | |||||
| ) | |||||
| | #(ARRAY_DECLARATOR type) | |||||
| | builtInType ("class")? | |||||
| ) | |||||
| ) | |||||
| | arrayIndex | |||||
| | #(METHOD_CALL primaryExpression elist) | |||||
| | #(TYPECAST typeSpec expr) | |||||
| | newExpression | |||||
| | constant | |||||
| | "super" | |||||
| | "true" | |||||
| | "false" | |||||
| | "this" | |||||
| | "null" | |||||
| | typeSpec // type name used with instanceof | |||||
| ; | |||||
| arrayIndex | |||||
| : #(INDEX_OP primaryExpression expression) | |||||
| ; | |||||
| constant | |||||
| : NUM_INT | |||||
| | CHAR_LITERAL | |||||
| | STRING_LITERAL | |||||
| | NUM_FLOAT | |||||
| ; | |||||
| newExpression | |||||
| : #( "new" type | |||||
| ( newArrayDeclarator (arrayInitializer)? | |||||
| | elist | |||||
| ) | |||||
| ) | |||||
| ; | |||||
| newArrayDeclarator | |||||
| : #( ARRAY_DECLARATOR (newArrayDeclarator)? (expression)? ) | |||||
| ; | |||||
| @@ -66,6 +66,7 @@ native2ascii=org.apache.tools.ant.taskdefs.optional.Native2Ascii | |||||
| perforce=org.apache.tools.ant.taskdefs.optional.perforce.P4sync | perforce=org.apache.tools.ant.taskdefs.optional.perforce.P4sync | ||||
| propertyfile=org.apache.tools.ant.taskdefs.optional.PropertyFile | propertyfile=org.apache.tools.ant.taskdefs.optional.PropertyFile | ||||
| depend=org.apache.tools.ant.taskdefs.optional.depend.Depend | depend=org.apache.tools.ant.taskdefs.optional.depend.Depend | ||||
| antlr=org.apache.tools.ant.taskdefs.optional.ANTLR | |||||
| # deprecated ant tasks (kept for back compatibility) | # deprecated ant tasks (kept for back compatibility) | ||||
| javadoc2=org.apache.tools.ant.taskdefs.Javadoc | javadoc2=org.apache.tools.ant.taskdefs.Javadoc | ||||
| @@ -0,0 +1,173 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 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.tools.ant.taskdefs.optional; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.*; | |||||
| import org.apache.tools.ant.taskdefs.*; | |||||
| import org.apache.tools.ant.types.*; | |||||
| /** | |||||
| * @author Erik Meade, emeade@geekfarm.org | |||||
| */ | |||||
| public class ANTLR extends Task { | |||||
| private CommandlineJava commandline = new CommandlineJava(); | |||||
| private File target; | |||||
| private File outputDirectory; | |||||
| private boolean fork = false; | |||||
| private File dir; | |||||
| public ANTLR() { | |||||
| commandline.setVm("java"); | |||||
| commandline.setClassname("antlr.Tool"); | |||||
| } | |||||
| public void setTarget(File target) { | |||||
| log("Setting target to: " + target.toString(), Project.MSG_VERBOSE); | |||||
| this.target = target; | |||||
| } | |||||
| public void setOutputdirectory(File outputDirectory) { | |||||
| log("Setting output directory to: " + outputDirectory.toString(), Project.MSG_VERBOSE); | |||||
| this.outputDirectory = outputDirectory; | |||||
| } | |||||
| public void setFork(boolean s) { | |||||
| this.fork = s; | |||||
| } | |||||
| /** | |||||
| * The working directory of the process | |||||
| */ | |||||
| public void setDir(File d) { | |||||
| this.dir = d; | |||||
| } | |||||
| public void execute() throws BuildException { | |||||
| validateAttributes(); | |||||
| //TODO: use ANTLR to parse the grammer file to do this. | |||||
| if (target.lastModified() > getGeneratedFile().lastModified()) { | |||||
| commandline.createArgument().setValue("-o"); | |||||
| commandline.createArgument().setValue(outputDirectory.toString()); | |||||
| commandline.createArgument().setValue(target.toString()); | |||||
| if (fork) { | |||||
| log("Forking " + commandline.toString(), Project.MSG_VERBOSE); | |||||
| int err = run(commandline.getCommandline()); | |||||
| if (err == 1) { | |||||
| throw new BuildException("ANTLR returned: "+err, location); | |||||
| } | |||||
| } | |||||
| else { | |||||
| Execute.runCommand(this, commandline.getCommandline()); | |||||
| } | |||||
| } | |||||
| } | |||||
| private void validateAttributes() throws BuildException{ | |||||
| if (target == null || !target.isFile()) { | |||||
| throw new BuildException("Invalid target: " + target); | |||||
| } | |||||
| // if no output directory is specified, used the target's directory | |||||
| if (outputDirectory == null) { | |||||
| String fileName = target.toString(); | |||||
| setOutputdirectory(new File(target.getParent())); | |||||
| } | |||||
| if (!outputDirectory.isDirectory()) { | |||||
| throw new BuildException("Invalid output directory: " + outputDirectory); | |||||
| } | |||||
| if (fork && (dir == null || !dir.isDirectory())) { | |||||
| throw new BuildException("Invalid working directory: " + dir); | |||||
| } | |||||
| } | |||||
| private File getGeneratedFile() throws BuildException { | |||||
| String generatedFileName = null; | |||||
| try { | |||||
| BufferedReader in = new BufferedReader(new FileReader(target)); | |||||
| String line; | |||||
| while ((line = in.readLine()) != null) { | |||||
| int extendsIndex = line.indexOf(" extends "); | |||||
| if (line.startsWith("class ") && extendsIndex > -1) { | |||||
| generatedFileName = line.substring(6, extendsIndex).trim(); | |||||
| break; | |||||
| } | |||||
| } | |||||
| in.close(); | |||||
| } catch (Exception e) { | |||||
| throw new BuildException("Unable to determine generated class"); | |||||
| } | |||||
| if (generatedFileName == null) { | |||||
| throw new BuildException("Unable to determine generated class"); | |||||
| } | |||||
| return new File(outputDirectory, generatedFileName + ".java"); | |||||
| } | |||||
| private int run(String[] command) throws BuildException { | |||||
| Execute exe = new Execute(new LogStreamHandler(this, Project.MSG_INFO, | |||||
| Project.MSG_WARN), null); | |||||
| exe.setAntRun(project); | |||||
| exe.setWorkingDirectory(dir); | |||||
| exe.setCommandline(command); | |||||
| try { | |||||
| return exe.execute(); | |||||
| } catch (IOException e) { | |||||
| throw new BuildException(e, location); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,110 @@ | |||||
| /* | |||||
| * The Apache Software License, Version 1.1 | |||||
| * | |||||
| * Copyright (c) 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.tools.ant.taskdefs.optional; | |||||
| import java.io.*; | |||||
| import org.apache.tools.ant.taskdefs.TaskdefsTest; | |||||
| /** | |||||
| * @author Erik Meade <emeade@geekfarm.org> | |||||
| */ | |||||
| public class ANTLRTest extends TaskdefsTest { | |||||
| private final static String TASKDEFS_DIR = "src/etc/testcases/taskdefs/optional/antlr/"; | |||||
| public ANTLRTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| public void setUp() { | |||||
| configureProject(TASKDEFS_DIR + "antlr.xml"); | |||||
| } | |||||
| public void test1() { | |||||
| expectBuildException("test1", "required argument, target, missing"); | |||||
| } | |||||
| public void test2() { | |||||
| expectBuildException("test2", "Invalid output directory"); | |||||
| } | |||||
| public void test3() { | |||||
| executeTarget("test3"); | |||||
| File outputDirectory = new File(TASKDEFS_DIR + "antlr.tmp"); | |||||
| String[] calcFiles = outputDirectory.list(new CalcFileFilter()); | |||||
| assert(5 == calcFiles.length); | |||||
| } | |||||
| public void test4() { | |||||
| expectBuildException("test4", "ANTLR exited with an error code of 1 ( try forking )"); | |||||
| } | |||||
| public void test5() { | |||||
| expectBuildException("test5", "Invalid working directory"); | |||||
| } | |||||
| public void test6() { | |||||
| executeTarget("test6"); | |||||
| } | |||||
| public void test7() { | |||||
| expectBuildException("test7", "Unable to determine generated class"); | |||||
| } | |||||
| } | |||||
| class CalcFileFilter implements FilenameFilter { | |||||
| public boolean accept(File dir, String name) { | |||||
| return name.startsWith("Calc"); | |||||
| } | |||||
| } | |||||