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"); | |||||
} | |||||
} |