Most of the changes here are actually adding tests, which was surprisingly hard work. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276755 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -37,6 +37,7 @@ attribute. <a name="compilervalues">There are three choices</a>:</p> | |||||
| <li>sun (the standard compiler of the JDK)</li> | <li>sun (the standard compiler of the JDK)</li> | ||||
| <li>kaffe (the standard compiler of <a href="http://www.kaffe.org" target="_top">Kaffe</a>)</li> | <li>kaffe (the standard compiler of <a href="http://www.kaffe.org" target="_top">Kaffe</a>)</li> | ||||
| <li>weblogic</li> | <li>weblogic</li> | ||||
| <li>forking - the sun compiler forked into a separate process</li> | |||||
| </ul> | </ul> | ||||
| <p>The <a href="http://dione.zcu.cz/~toman40/miniRMI/">miniRMI</a> | <p>The <a href="http://dione.zcu.cz/~toman40/miniRMI/">miniRMI</a> | ||||
| @@ -0,0 +1,89 @@ | |||||
| <?xml version="1.0"?> | |||||
| <project name="rmic" default="teardown" basedir="."> | |||||
| <property name="rmic.dir" location="." /> | |||||
| <property name="src.dir" location="${rmic.dir}/src"/> | |||||
| <property name="build.dir" location="${rmic.dir}/build"/> | |||||
| <target name="teardown"> | |||||
| <delete dir="${build.dir}"/> | |||||
| </target> | |||||
| <!-- init builds the java source --> | |||||
| <target name="init" depends="probe-rmic"> | |||||
| <mkdir dir="${build.dir}"/> | |||||
| <javac | |||||
| destdir="${build.dir}" | |||||
| srcdir="${src.dir}" > | |||||
| </javac> | |||||
| <presetdef name="base-rmic"> | |||||
| <rmic | |||||
| base="${build.dir}" | |||||
| verify="true" | |||||
| includes="**/*.class"/> | |||||
| </presetdef> | |||||
| </target> | |||||
| <target name="probe-rmic"> | |||||
| <available property="kaffe.present" classname="jkaffe.rmi.rmic.RMIC"/> | |||||
| <available property="rmic.present" classname="sun.rmi.rmic.Main"/> | |||||
| <available property="wlrmic.present" classname="weblogic.rmic"/> | |||||
| </target> | |||||
| <target name="testRmic" if="rmic.present" depends="init"> | |||||
| <base-rmic /> | |||||
| </target> | |||||
| <target name="testKaffe" if="kaffe.present" depends="init"> | |||||
| <base-rmic | |||||
| compiler="kaffe" | |||||
| /> | |||||
| </target> | |||||
| <target name="testWlrmic" if="wlrmic.present" depends="init"> | |||||
| <base-rmic | |||||
| compiler="wlrmic" | |||||
| /> | |||||
| </target> | |||||
| <target name="testForking" if="rmic.present" depends="init"> | |||||
| <base-rmic | |||||
| compiler="forking" | |||||
| /> | |||||
| </target> | |||||
| <target name="testBadName" if="rmic.present" depends="init"> | |||||
| <base-rmic | |||||
| compiler="no-such-compiler" | |||||
| /> | |||||
| </target> | |||||
| <target name="testWrongClass" if="rmic.present" depends="init"> | |||||
| <base-rmic | |||||
| compiler="org.apache.tools.ant.BuildException" | |||||
| /> | |||||
| </target> | |||||
| <target name="testNoBase" depends="init"> | |||||
| <rmic | |||||
| verify="true" | |||||
| includes="**/*.class"/> | |||||
| </target> | |||||
| <target name="testBaseDoesntExist" depends="init"> | |||||
| <rmic | |||||
| base="${build.dir}/classes" | |||||
| verify="true" | |||||
| includes="**/*.class"/> | |||||
| </target> | |||||
| <target name="testBaseIsntDir" depends="init"> | |||||
| <rmic | |||||
| base="${ant.file}" | |||||
| verify="true" | |||||
| includes="**/*.class"/> | |||||
| </target> | |||||
| </project> | |||||
| @@ -0,0 +1,10 @@ | |||||
| import java.rmi.Remote; | |||||
| import java.rmi.RemoteException; | |||||
| /** | |||||
| * this is the interface we remote | |||||
| */ | |||||
| public interface RemoteTimestamp extends Remote { | |||||
| long when() throws RemoteException ; | |||||
| } | |||||
| @@ -0,0 +1,12 @@ | |||||
| import java.rmi.Remote; | |||||
| import java.rmi.RemoteException; | |||||
| /** | |||||
| * this is the implementation | |||||
| */ | |||||
| public class RemoteTimestampImpl implements RemoteTimestamp { | |||||
| public long when() throws RemoteException { | |||||
| return System.currentTimeMillis(); | |||||
| } | |||||
| } | |||||
| @@ -26,6 +26,7 @@ import org.apache.tools.ant.DirectoryScanner; | |||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.taskdefs.rmic.RmicAdapter; | import org.apache.tools.ant.taskdefs.rmic.RmicAdapter; | ||||
| import org.apache.tools.ant.taskdefs.rmic.RmicAdapterFactory; | import org.apache.tools.ant.taskdefs.rmic.RmicAdapterFactory; | ||||
| import org.apache.tools.ant.taskdefs.rmic.KaffeRmic; | |||||
| import org.apache.tools.ant.types.FilterSetCollection; | import org.apache.tools.ant.types.FilterSetCollection; | ||||
| import org.apache.tools.ant.types.Path; | import org.apache.tools.ant.types.Path; | ||||
| import org.apache.tools.ant.types.Reference; | import org.apache.tools.ant.types.Reference; | ||||
| @@ -106,14 +107,17 @@ public class Rmic extends MatchingTask { | |||||
| private FileUtils fileUtils = FileUtils.newFileUtils(); | private FileUtils fileUtils = FileUtils.newFileUtils(); | ||||
| private FacadeTaskHelper facade; | private FacadeTaskHelper facade; | ||||
| public static final String ERROR_UNABLE_TO_VERIFY_CLASS = "Unable to verify class "; | |||||
| public static final String ERROR_NOT_FOUND = ". It could not be found."; | |||||
| public static final String ERROR_NOT_DEFINED = ". It is not defined."; | |||||
| public static final String ERROR_LOADING_CAUSED_EXCEPTION = ". Loading caused Exception: "; | |||||
| public static final String ERROR_NO_BASE_EXISTS = "base does not exist: "; | |||||
| public static final String ERROR_NOT_A_DIR = "base is not a directory:"; | |||||
| public static final String ERROR_BASE_NOT_SET = "base attribute must be set!"; | |||||
| public Rmic() { | public Rmic() { | ||||
| try { | |||||
| Class.forName("kaffe.rmi.rmic.RMIC"); | |||||
| facade = new FacadeTaskHelper("kaffe"); | |||||
| } catch (ClassNotFoundException cnfe) { | |||||
| facade = new FacadeTaskHelper("sun"); | |||||
| } | |||||
| String facadeName=KaffeRmic.isAvailable()?"kaffe":"sun"; | |||||
| facade = new FacadeTaskHelper(facadeName); | |||||
| } | } | ||||
| /** | /** | ||||
| @@ -433,12 +437,14 @@ public class Rmic extends MatchingTask { | |||||
| */ | */ | ||||
| public void execute() throws BuildException { | public void execute() throws BuildException { | ||||
| if (baseDir == null) { | if (baseDir == null) { | ||||
| throw new BuildException("base attribute must be set!", getLocation()); | |||||
| throw new BuildException(ERROR_BASE_NOT_SET, getLocation()); | |||||
| } | } | ||||
| if (!baseDir.exists()) { | if (!baseDir.exists()) { | ||||
| throw new BuildException("base does not exist!", getLocation()); | |||||
| throw new BuildException(ERROR_NO_BASE_EXISTS+baseDir, getLocation()); | |||||
| } | |||||
| if ( !baseDir.isDirectory() ) { | |||||
| throw new BuildException(ERROR_NOT_A_DIR+baseDir, getLocation()); | |||||
| } | } | ||||
| if (verify) { | if (verify) { | ||||
| log("Verify has been turned on.", Project.MSG_VERBOSE); | log("Verify has been turned on.", Project.MSG_VERBOSE); | ||||
| } | } | ||||
| @@ -595,14 +601,14 @@ public class Rmic extends MatchingTask { | |||||
| } | } | ||||
| return isValidRmiRemote(testClass); | return isValidRmiRemote(testClass); | ||||
| } catch (ClassNotFoundException e) { | } catch (ClassNotFoundException e) { | ||||
| log("Unable to verify class " + classname | |||||
| + ". It could not be found.", Project.MSG_WARN); | |||||
| log(ERROR_UNABLE_TO_VERIFY_CLASS + classname | |||||
| + ERROR_NOT_FOUND, Project.MSG_WARN); | |||||
| } catch (NoClassDefFoundError e) { | } catch (NoClassDefFoundError e) { | ||||
| log("Unable to verify class " + classname | |||||
| + ". It is not defined.", Project.MSG_WARN); | |||||
| log(ERROR_UNABLE_TO_VERIFY_CLASS + classname | |||||
| + ERROR_NOT_DEFINED, Project.MSG_WARN); | |||||
| } catch (Throwable t) { | } catch (Throwable t) { | ||||
| log("Unable to verify class " + classname | |||||
| + ". Loading caused Exception: " | |||||
| log(ERROR_UNABLE_TO_VERIFY_CLASS + classname | |||||
| + ERROR_LOADING_CAUSED_EXCEPTION | |||||
| + t.getMessage(), Project.MSG_WARN); | + t.getMessage(), Project.MSG_WARN); | ||||
| } | } | ||||
| // we only get here if an exception has been thrown | // we only get here if an exception has been thrown | ||||
| @@ -0,0 +1,74 @@ | |||||
| /** (C) Copyright 2004 Hewlett-Packard Development Company, LP | |||||
| This library is free software; you can redistribute it and/or | |||||
| modify it under the terms of the GNU Lesser General Public | |||||
| License as published by the Free Software Foundation; either | |||||
| version 2.1 of the License, or (at your option) any later version. | |||||
| This library is distributed in the hope that it will be useful, | |||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| Lesser General Public License for more details. | |||||
| You should have received a copy of the GNU Lesser General Public | |||||
| License along with this library; if not, write to the Free Software | |||||
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||||
| For more information: www.smartfrog.org | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs.rmic; | |||||
| import org.apache.tools.ant.BuildException; | |||||
| import org.apache.tools.ant.Project; | |||||
| import org.apache.tools.ant.taskdefs.Rmic; | |||||
| import org.apache.tools.ant.taskdefs.Java; | |||||
| import org.apache.tools.ant.taskdefs.Execute; | |||||
| import org.apache.tools.ant.taskdefs.LogStreamHandler; | |||||
| import org.apache.tools.ant.types.Commandline; | |||||
| import java.io.IOException; | |||||
| /** | |||||
| * This is an extension of the sun rmic compiler, which forks rather than | |||||
| * executes it inline. Why so? Because rmic is dog slow, but if you fork the | |||||
| * compiler you can have multiple copies compiling different bits of your project | |||||
| * at the same time. Which, on a multi-cpu system results in significant speedups. | |||||
| * | |||||
| * @since ant1.7 | |||||
| */ | |||||
| public class ForkingSunRmic extends DefaultRmicAdapter { | |||||
| /** | |||||
| * exec by creating a new command | |||||
| * @return | |||||
| * @throws BuildException | |||||
| */ | |||||
| public boolean execute() throws BuildException { | |||||
| Rmic owner=getRmic(); | |||||
| Commandline cmd = setupRmicCommand(); | |||||
| Project project=owner.getProject(); | |||||
| //rely on RMIC being on the path | |||||
| cmd.setExecutable(SunRmic.RMIC_EXECUTABLE); | |||||
| //set up the args | |||||
| String[] args=cmd.getCommandline(); | |||||
| try { | |||||
| Execute exe = new Execute(new LogStreamHandler(owner, | |||||
| Project.MSG_INFO, | |||||
| Project.MSG_WARN)); | |||||
| exe.setAntRun(project); | |||||
| exe.setWorkingDirectory(project.getBaseDir()); | |||||
| exe.setCommandline(args); | |||||
| exe.execute(); | |||||
| return exe.getExitValue()==0; | |||||
| } catch (IOException exception) { | |||||
| throw new BuildException("Error running "+ SunRmic.RMIC_EXECUTABLE | |||||
| +" -maybe it is not on the path" , | |||||
| exception); | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -21,6 +21,7 @@ import java.lang.reflect.Constructor; | |||||
| import java.lang.reflect.Method; | import java.lang.reflect.Method; | ||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import org.apache.tools.ant.util.facade.FacadeTaskHelper; | |||||
| import org.apache.tools.ant.types.Commandline; | import org.apache.tools.ant.types.Commandline; | ||||
| /** | /** | ||||
| @@ -29,6 +30,7 @@ import org.apache.tools.ant.types.Commandline; | |||||
| * @since Ant 1.4 | * @since Ant 1.4 | ||||
| */ | */ | ||||
| public class KaffeRmic extends DefaultRmicAdapter { | public class KaffeRmic extends DefaultRmicAdapter { | ||||
| public static final String RMIC_CLASSNAME = "kaffe.rmi.rmic.RMIC"; | |||||
| public boolean execute() throws BuildException { | public boolean execute() throws BuildException { | ||||
| getRmic().log("Using Kaffe rmic", Project.MSG_VERBOSE); | getRmic().log("Using Kaffe rmic", Project.MSG_VERBOSE); | ||||
| @@ -36,7 +38,7 @@ public class KaffeRmic extends DefaultRmicAdapter { | |||||
| try { | try { | ||||
| Class c = Class.forName("kaffe.rmi.rmic.RMIC"); | |||||
| Class c = Class.forName(RMIC_CLASSNAME); | |||||
| Constructor cons = c.getConstructor(new Class[] {String[].class}); | Constructor cons = c.getConstructor(new Class[] {String[].class}); | ||||
| Object rmic = cons.newInstance(new Object[] {cmd.getArguments()}); | Object rmic = cons.newInstance(new Object[] {cmd.getArguments()}); | ||||
| Method doRmic = c.getMethod("run", null); | Method doRmic = c.getMethod("run", null); | ||||
| @@ -58,4 +60,17 @@ public class KaffeRmic extends DefaultRmicAdapter { | |||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * test for kaffe being on the system | |||||
| * @return | |||||
| */ | |||||
| public static boolean isAvailable() { | |||||
| try { | |||||
| Class.forName(RMIC_CLASSNAME); | |||||
| return true; | |||||
| } catch (ClassNotFoundException cnfe) { | |||||
| return false; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -23,7 +23,7 @@ import org.apache.tools.ant.types.Path; | |||||
| import org.apache.tools.ant.util.FileNameMapper; | import org.apache.tools.ant.util.FileNameMapper; | ||||
| /** | /** | ||||
| * The interface that all rmic adapters must adher to. | |||||
| * The interface that all rmic adapters must adhere to. | |||||
| * | * | ||||
| * <p>A rmic adapter is an adapter that interprets the rmic's | * <p>A rmic adapter is an adapter that interprets the rmic's | ||||
| * parameters in preperation to be passed off to the compiler this | * parameters in preperation to be passed off to the compiler this | ||||
| @@ -27,6 +27,8 @@ import org.apache.tools.ant.Task; | |||||
| * @since 1.4 | * @since 1.4 | ||||
| */ | */ | ||||
| public class RmicAdapterFactory { | public class RmicAdapterFactory { | ||||
| public static final String ERROR_UNKNOWN_COMPILER = "Cannot find the compiler or class: "; | |||||
| public static final String ERROR_NOT_RMIC_ADAPTER = "Not an rmic adapter: "; | |||||
| /** This is a singleton -- can't create instances!! */ | /** This is a singleton -- can't create instances!! */ | ||||
| private RmicAdapterFactory() { | private RmicAdapterFactory() { | ||||
| @@ -41,6 +43,8 @@ public class RmicAdapterFactory { | |||||
| * <li>kaffe = Kaffe's rmic | * <li>kaffe = Kaffe's rmic | ||||
| * <li><i>a fully quallified classname</i> = the name of a rmic | * <li><i>a fully quallified classname</i> = the name of a rmic | ||||
| * adapter | * adapter | ||||
| * <li>weblogic = weblogic compiler | |||||
| * <li>forking = Sun's RMIC by forking a new JVM | |||||
| * </ul> | * </ul> | ||||
| * | * | ||||
| * @param rmicType either the name of the desired rmic, or the | * @param rmicType either the name of the desired rmic, or the | ||||
| @@ -57,6 +61,8 @@ public class RmicAdapterFactory { | |||||
| return new KaffeRmic(); | return new KaffeRmic(); | ||||
| } else if (rmicType.equalsIgnoreCase("weblogic")) { | } else if (rmicType.equalsIgnoreCase("weblogic")) { | ||||
| return new WLRmic(); | return new WLRmic(); | ||||
| } else if (rmicType.equalsIgnoreCase("forking")) { | |||||
| return new ForkingSunRmic(); | |||||
| } | } | ||||
| return resolveClassName(rmicType); | return resolveClassName(rmicType); | ||||
| } | } | ||||
| @@ -76,10 +82,11 @@ public class RmicAdapterFactory { | |||||
| Object o = c.newInstance(); | Object o = c.newInstance(); | ||||
| return (RmicAdapter) o; | return (RmicAdapter) o; | ||||
| } catch (ClassNotFoundException cnfe) { | } catch (ClassNotFoundException cnfe) { | ||||
| throw new BuildException(className + " can\'t be found.", cnfe); | |||||
| throw new BuildException(ERROR_UNKNOWN_COMPILER+className, | |||||
| cnfe); | |||||
| } catch (ClassCastException cce) { | } catch (ClassCastException cce) { | ||||
| throw new BuildException(className + " isn\'t the classname of " | |||||
| + "a rmic adapter.", cce); | |||||
| throw new BuildException(ERROR_NOT_RMIC_ADAPTER+className, | |||||
| cce); | |||||
| } catch (Throwable t) { | } catch (Throwable t) { | ||||
| // for all other possibilities | // for all other possibilities | ||||
| throw new BuildException(className + " caused an interesting " | throw new BuildException(className + " caused an interesting " | ||||
| @@ -33,6 +33,21 @@ import org.apache.tools.ant.types.Commandline; | |||||
| */ | */ | ||||
| public class SunRmic extends DefaultRmicAdapter { | public class SunRmic extends DefaultRmicAdapter { | ||||
| /** | |||||
| * name of the class | |||||
| */ | |||||
| public static final String RMIC_CLASSNAME = "sun.rmi.rmic.Main"; | |||||
| /** | |||||
| * name of the executable | |||||
| */ | |||||
| public static final String RMIC_EXECUTABLE = "rmic"; | |||||
| public static final String ERROR_NO_RMIC_ON_CLASSPATH = "Cannot use SUN rmic, as it is not " | |||||
| + "available. A common solution is to " | |||||
| + "set the environment variable " | |||||
| + "JAVA_HOME or CLASSPATH."; | |||||
| public static final String ERROR_RMIC_FAILED = "Error starting SUN rmic: "; | |||||
| public boolean execute() throws BuildException { | public boolean execute() throws BuildException { | ||||
| getRmic().log("Using SUN rmic compiler", Project.MSG_VERBOSE); | getRmic().log("Using SUN rmic compiler", Project.MSG_VERBOSE); | ||||
| Commandline cmd = setupRmicCommand(); | Commandline cmd = setupRmicCommand(); | ||||
| @@ -43,7 +58,7 @@ public class SunRmic extends DefaultRmicAdapter { | |||||
| Project.MSG_WARN); | Project.MSG_WARN); | ||||
| try { | try { | ||||
| Class c = Class.forName("sun.rmi.rmic.Main"); | |||||
| Class c = Class.forName(RMIC_CLASSNAME); | |||||
| Constructor cons | Constructor cons | ||||
| = c.getConstructor(new Class[] {OutputStream.class, String.class}); | = c.getConstructor(new Class[] {OutputStream.class, String.class}); | ||||
| Object rmic = cons.newInstance(new Object[] {logstr, "rmic"}); | Object rmic = cons.newInstance(new Object[] {logstr, "rmic"}); | ||||
| @@ -55,16 +70,13 @@ public class SunRmic extends DefaultRmicAdapter { | |||||
| (new Object[] {cmd.getArguments()})); | (new Object[] {cmd.getArguments()})); | ||||
| return ok.booleanValue(); | return ok.booleanValue(); | ||||
| } catch (ClassNotFoundException ex) { | } catch (ClassNotFoundException ex) { | ||||
| throw new BuildException("Cannot use SUN rmic, as it is not " | |||||
| + "available. A common solution is to " | |||||
| + "set the environment variable " | |||||
| + "JAVA_HOME or CLASSPATH.", | |||||
| throw new BuildException(ERROR_NO_RMIC_ON_CLASSPATH, | |||||
| getRmic().getLocation()); | getRmic().getLocation()); | ||||
| } catch (Exception ex) { | } catch (Exception ex) { | ||||
| if (ex instanceof BuildException) { | if (ex instanceof BuildException) { | ||||
| throw (BuildException) ex; | throw (BuildException) ex; | ||||
| } else { | } else { | ||||
| throw new BuildException("Error starting SUN rmic: ", | |||||
| throw new BuildException(ERROR_RMIC_FAILED, | |||||
| ex, getRmic().getLocation()); | ex, getRmic().getLocation()); | ||||
| } | } | ||||
| } finally { | } finally { | ||||
| @@ -29,6 +29,12 @@ import org.apache.tools.ant.types.Commandline; | |||||
| * @since Ant 1.4 | * @since Ant 1.4 | ||||
| */ | */ | ||||
| public class WLRmic extends DefaultRmicAdapter { | public class WLRmic extends DefaultRmicAdapter { | ||||
| public static final String WLRMIC_CLASSNAME = "weblogic.rmic"; | |||||
| public static final String ERROR_NO_WLRMIC_ON_CLASSPATH = "Cannot use WebLogic rmic, as it is not " | |||||
| + "available. A common solution is to " | |||||
| + "set the environment variable " | |||||
| + "CLASSPATH."; | |||||
| public static final String ERROR_WLRMIC_FAILED = "Error starting WebLogic rmic: "; | |||||
| public boolean execute() throws BuildException { | public boolean execute() throws BuildException { | ||||
| getRmic().log("Using WebLogic rmic", Project.MSG_VERBOSE); | getRmic().log("Using WebLogic rmic", Project.MSG_VERBOSE); | ||||
| @@ -39,26 +45,23 @@ public class WLRmic extends DefaultRmicAdapter { | |||||
| // Create an instance of the rmic | // Create an instance of the rmic | ||||
| Class c = null; | Class c = null; | ||||
| if (getRmic().getClasspath() == null) { | if (getRmic().getClasspath() == null) { | ||||
| c = Class.forName("weblogic.rmic"); | |||||
| c = Class.forName(WLRMIC_CLASSNAME); | |||||
| } else { | } else { | ||||
| loader | loader | ||||
| = getRmic().getProject().createClassLoader(getRmic().getClasspath()); | = getRmic().getProject().createClassLoader(getRmic().getClasspath()); | ||||
| c = Class.forName("weblogic.rmic", true, loader); | |||||
| c = Class.forName(WLRMIC_CLASSNAME, true, loader); | |||||
| } | } | ||||
| Method doRmic = c.getMethod("main", | Method doRmic = c.getMethod("main", | ||||
| new Class [] {String[].class}); | new Class [] {String[].class}); | ||||
| doRmic.invoke(null, new Object[] {cmd.getArguments()}); | doRmic.invoke(null, new Object[] {cmd.getArguments()}); | ||||
| return true; | return true; | ||||
| } catch (ClassNotFoundException ex) { | } catch (ClassNotFoundException ex) { | ||||
| throw new BuildException("Cannot use WebLogic rmic, as it is not " | |||||
| + "available. A common solution is to " | |||||
| + "set the environment variable " | |||||
| + "CLASSPATH.", getRmic().getLocation()); | |||||
| throw new BuildException(ERROR_NO_WLRMIC_ON_CLASSPATH, getRmic().getLocation()); | |||||
| } catch (Exception ex) { | } catch (Exception ex) { | ||||
| if (ex instanceof BuildException) { | if (ex instanceof BuildException) { | ||||
| throw (BuildException) ex; | throw (BuildException) ex; | ||||
| } else { | } else { | ||||
| throw new BuildException("Error starting WebLogic rmic: ", ex, | |||||
| throw new BuildException(ERROR_WLRMIC_FAILED, ex, | |||||
| getRmic().getLocation()); | getRmic().getLocation()); | ||||
| } | } | ||||
| } finally { | } finally { | ||||
| @@ -0,0 +1,98 @@ | |||||
| /** (C) Copyright 2004 Hewlett-Packard Development Company, LP | |||||
| This library is free software; you can redistribute it and/or | |||||
| modify it under the terms of the GNU Lesser General Public | |||||
| License as published by the Free Software Foundation; either | |||||
| version 2.1 of the License, or (at your option) any later version. | |||||
| This library is distributed in the hope that it will be useful, | |||||
| but WITHOUT ANY WARRANTY; without even the implied warranty of | |||||
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |||||
| Lesser General Public License for more details. | |||||
| You should have received a copy of the GNU Lesser General Public | |||||
| License along with this library; if not, write to the Free Software | |||||
| Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||||
| For more information: www.smartfrog.org | |||||
| */ | |||||
| package org.apache.tools.ant.taskdefs; | |||||
| import org.apache.tools.ant.BuildFileTest; | |||||
| import org.apache.tools.ant.taskdefs.rmic.RmicAdapterFactory; | |||||
| /** | |||||
| * Date: 04-Aug-2004 | |||||
| * Time: 22:15:46 | |||||
| */ | |||||
| public class RmicAdvancedTest extends BuildFileTest { | |||||
| public RmicAdvancedTest(String name) { | |||||
| super(name); | |||||
| } | |||||
| private final static String TASKDEFS_DIR = "src/etc/testcases/taskdefs/rmic/"; | |||||
| /** | |||||
| * The JUnit setup method | |||||
| */ | |||||
| public void setUp() { | |||||
| configureProject(TASKDEFS_DIR + "rmic.xml"); | |||||
| } | |||||
| /** | |||||
| * The teardown method for JUnit | |||||
| */ | |||||
| public void tearDown() { | |||||
| executeTarget("teardown"); | |||||
| } | |||||
| /** | |||||
| * A unit test for JUnit | |||||
| */ | |||||
| public void testRmic() throws Exception { | |||||
| executeTarget("testRmic"); | |||||
| } | |||||
| /** | |||||
| * A unit test for JUnit | |||||
| */ | |||||
| public void testKaffe() throws Exception { | |||||
| executeTarget("testKaffe"); | |||||
| } | |||||
| /** | |||||
| * A unit test for JUnit | |||||
| */ | |||||
| public void testWlrmic() throws Exception { | |||||
| executeTarget("testWlrmic"); | |||||
| } | |||||
| /** | |||||
| * A unit test for JUnit | |||||
| */ | |||||
| public void testForking() throws Exception { | |||||
| executeTarget("testForking"); | |||||
| } | |||||
| /** | |||||
| * A unit test for JUnit | |||||
| */ | |||||
| public void testBadName() throws Exception { | |||||
| expectBuildExceptionContaining("testBadName", | |||||
| "compiler not known", | |||||
| RmicAdapterFactory.ERROR_UNKNOWN_COMPILER); | |||||
| } | |||||
| /** | |||||
| * A unit test for JUnit | |||||
| */ | |||||
| public void testWrongClass() throws Exception { | |||||
| expectBuildExceptionContaining("testWrongClass", | |||||
| "class not an RMIC adapter", | |||||
| RmicAdapterFactory.ERROR_NOT_RMIC_ADAPTER); | |||||
| } | |||||
| } | |||||
| @@ -18,9 +18,9 @@ | |||||
| package org.apache.tools.ant.taskdefs; | package org.apache.tools.ant.taskdefs; | ||||
| import org.apache.tools.ant.Project; | import org.apache.tools.ant.Project; | ||||
| import junit.framework.TestCase; | import junit.framework.TestCase; | ||||
| /** | /** | ||||
| * Testcase for <rmic>. | * Testcase for <rmic>. | ||||
| * | * | ||||
| @@ -43,6 +43,19 @@ public class RmicTest extends TestCase { | |||||
| rmic.setProject(project); | rmic.setProject(project); | ||||
| } | } | ||||
| /** | |||||
| * test for a compiler class existing | |||||
| * @param compilerClass | |||||
| * @return | |||||
| */ | |||||
| private boolean hasCompiler(String compilerClass) { | |||||
| try { | |||||
| Class.forName(compilerClass); | |||||
| return true; | |||||
| } catch (ClassNotFoundException cnfe) { | |||||
| return false; | |||||
| } | |||||
| } | |||||
| /** | /** | ||||
| * Test nested compiler args. | * Test nested compiler args. | ||||
| */ | */ | ||||
| @@ -99,5 +112,4 @@ public class RmicTest extends TestCase { | |||||
| assertNotNull(compiler); | assertNotNull(compiler); | ||||
| assertEquals("kaffe", compiler); | assertEquals("kaffe", compiler); | ||||
| } | } | ||||
| } | } | ||||