Fixed by writing a new adapter, xnew, that extends the forking adapter and sets the -Xnew argument. Tests supplied, though the old test, the one that would fail on java1.6, is still there. Also made the name matching code of rmic locale-independent. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@434029 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -71,6 +71,8 @@ Changes that could break older environments: | |||||
| IE (Windows) or Gnome2 (Unix/Linux) proxy settings. This may break any build | IE (Windows) or Gnome2 (Unix/Linux) proxy settings. This may break any build | ||||
| file that somehow relied on content outside the firewall being unreachable: | file that somehow relied on content outside the firewall being unreachable: | ||||
| use the -noproxy command-line option to disable this new feature. | use the -noproxy command-line option to disable this new feature. | ||||
| Note that the Java1.5 proxy configuration system still does not appear to work | |||||
| reliably on Windows or Linux. | |||||
| * A bug in SQLExec would prevent the execution of trailing, | * A bug in SQLExec would prevent the execution of trailing, | ||||
| non-semicolon-delimited statements. Bugzilla Report 37764. | non-semicolon-delimited statements. Bugzilla Report 37764. | ||||
| @@ -97,7 +99,7 @@ Changes that could break older environments: | |||||
| * Ant launcher program prints errors to stderr, and exits with a 2 exit code | * Ant launcher program prints errors to stderr, and exits with a 2 exit code | ||||
| value if, for any reason, it cannot actually start Ant proper. This will only | value if, for any reason, it cannot actually start Ant proper. This will only | ||||
| affect programs/scripts that called the launcher and which did not want to | affect programs/scripts that called the launcher and which did not want to | ||||
| receive an error if ant itself would not start | |||||
| receive an error if Ant itself would not start | |||||
| Fixed bugs: | Fixed bugs: | ||||
| ----------- | ----------- | ||||
| @@ -264,6 +266,9 @@ Fixed bugs: | |||||
| * The <zip> API allowed creation of directories in file-only archives; a | * The <zip> API allowed creation of directories in file-only archives; a | ||||
| habitual offender was the subclassed <jar>, which included META-INF/ in | habitual offender was the subclassed <jar>, which included META-INF/ in | ||||
| the destination file regardless of whether filesonly was set to true. | the destination file regardless of whether filesonly was set to true. | ||||
| * <rmic> has a new adapter, xnew, to use the -XNew back end on java1.5+. | |||||
| By forking rmic, this works on java1.6+. Bugzilla report 38732. | |||||
| Other changes: | Other changes: | ||||
| -------------- | -------------- | ||||
| @@ -271,7 +276,7 @@ Other changes: | |||||
| * InputHandler implementations may now call InputRequest.getDefaultValue() | * InputHandler implementations may now call InputRequest.getDefaultValue() | ||||
| if they wish. The default handler uses this also. Bugzilla report 28621. | if they wish. The default handler uses this also. Bugzilla report 28621. | ||||
| * Took in bugzilla report 39320. | |||||
| * Took in bugzilla report 39320, "Simple code cleanups" | |||||
| * Improve compatibility with GNU Classpath and java versions prior to 1.5. Bugzilla 39027. | * Improve compatibility with GNU Classpath and java versions prior to 1.5. Bugzilla 39027. | ||||
| @@ -40,8 +40,11 @@ attribute. | |||||
| <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> | |||||
| <li> "" (empty string). This has the same behaviour as not setting the compiler attribute. | |||||
| <li>forking - the sun compiler forked into a separate process (since Ant 1.7)</li> | |||||
| <li>xnew - the sun compiler forked into a separate process, | |||||
| with the -Xnew option (since Ant 1.7). | |||||
| This is the most reliable way to use -Xnew</li> | |||||
| <li> "" (empty string). This has the same behaviour as not setting the compiler attribute. | |||||
| First the value of <tt>build.rmic</tt> is used if defined, and if not, the default | First the value of <tt>build.rmic</tt> is used if defined, and if not, the default | ||||
| for the platform is chosen. If build.rmic is set to this, you get the default. | for the platform is chosen. If build.rmic is set to this, you get the default. | ||||
| @@ -83,7 +86,9 @@ please consult miniRMI's documentation to learn how to use it.</p> | |||||
| <td valign="top">stubversion</td> | <td valign="top">stubversion</td> | ||||
| <td valign="top">Specify the JDK version for the generated stub code. | <td valign="top">Specify the JDK version for the generated stub code. | ||||
| Specify "1.1" to pass the "-v1.1" option to rmic, | Specify "1.1" to pass the "-v1.1" option to rmic, | ||||
| "1.2" for -v12, compat for -vcompat. | |||||
| "1.2" for -v12, compat for -vcompat. <br> | |||||
| Since Ant1.7, if you do not specify a version, and do not ask | |||||
| for iiop or idl files, "compat" is selected. | |||||
| </td> | </td> | ||||
| <td align="center" valign="top">No, default="compat"</td> | <td align="center" valign="top">No, default="compat"</td> | ||||
| @@ -245,7 +250,7 @@ files below <code>${build}/classes</code> whose classname starts with | |||||
| <code>${build}/classes</code>.</p> | <code>${build}/classes</code>.</p> | ||||
| <hr> | <hr> | ||||
| <p align="center">Copyright © 2000-2005 The Apache Software Foundation. All rights | |||||
| <p align="center">Copyright © 2000-2006 The Apache Software Foundation. All rights | |||||
| Reserved.</p> | Reserved.</p> | ||||
| </body> | </body> | ||||
| @@ -108,6 +108,12 @@ | |||||
| <available property="kaffe.present" classname="jkaffe.rmi.rmic.RMIC"/> | <available property="kaffe.present" classname="jkaffe.rmi.rmic.RMIC"/> | ||||
| <available property="rmic.present" classname="sun.rmi.rmic.Main"/> | <available property="rmic.present" classname="sun.rmi.rmic.Main"/> | ||||
| <available property="wlrmic.present" classname="weblogic.rmic"/> | <available property="wlrmic.present" classname="weblogic.rmic"/> | ||||
| <condition property="rmic5.present"> | |||||
| <and> | |||||
| <isset property="rmic.present"/> | |||||
| <available classname="java.net.Proxy"/> | |||||
| </and> | |||||
| </condition> | |||||
| <condition property="rmic6.present"> | <condition property="rmic6.present"> | ||||
| <and> | <and> | ||||
| <isset property="rmic.present"/> | <isset property="rmic.present"/> | ||||
| @@ -173,6 +179,13 @@ | |||||
| /> | /> | ||||
| </target> | </target> | ||||
| <target name="testExplicitClass" if="rmic.present" depends="init"> | |||||
| <base-rmic | |||||
| compiler="org.apache.tools.ant.taskdefs.rmic.SunRmic" | |||||
| /> | |||||
| <assertBaseCompiled/> | |||||
| </target> | |||||
| <target name="testWrongClass" if="rmic.present" depends="init"> | <target name="testWrongClass" if="rmic.present" depends="init"> | ||||
| <base-rmic | <base-rmic | ||||
| compiler="org.apache.tools.ant.BuildException" | compiler="org.apache.tools.ant.BuildException" | ||||
| @@ -249,20 +262,26 @@ | |||||
| <assertBaseCompiled/> | <assertBaseCompiled/> | ||||
| </target> | </target> | ||||
| <target name="testXnew" if="rmic6.present" depends="init"> | |||||
| <target name="testXnew" if="rmic5.present" depends="init"> | |||||
| <base-rmic compiler="sun"> | <base-rmic compiler="sun"> | ||||
| <compilerarg value="-Xnew"/> | <compilerarg value="-Xnew"/> | ||||
| </base-rmic> | </base-rmic> | ||||
| <assertBaseCompiled/> | <assertBaseCompiled/> | ||||
| </target> | </target> | ||||
| <target name="testXnewForked" if="rmic6.present" depends="init"> | |||||
| <target name="testXnewForked" if="rmic5.present" depends="init"> | |||||
| <base-rmic compiler="forking"> | <base-rmic compiler="forking"> | ||||
| <compilerarg value="-Xnew"/> | <compilerarg value="-Xnew"/> | ||||
| </base-rmic> | </base-rmic> | ||||
| <assertBaseCompiled/> | <assertBaseCompiled/> | ||||
| </target> | </target> | ||||
| <target name="testXnewCompiler" if="rmic5.present" depends="init"> | |||||
| <base-rmic compiler="xnew"> | |||||
| </base-rmic> | |||||
| <assertBaseCompiled/> | |||||
| </target> | |||||
| <target name="testIDL" depends="init"> | <target name="testIDL" depends="init"> | ||||
| <base-rmic compiler="default" idl="true"/> | <base-rmic compiler="default" idl="true"/> | ||||
| <assertFileCreated file="RemoteTimestamp.idl"/> | <assertFileCreated file="RemoteTimestamp.idl"/> | ||||
| @@ -34,6 +34,7 @@ import java.io.IOException; | |||||
| * compiler you can have multiple copies compiling different bits of your project | * 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. | * at the same time. Which, on a multi-cpu system results in significant speedups. | ||||
| * | * | ||||
| * Also, Java1.6 behaves oddly with -XNew, so we switch it on here if needed. | |||||
| * @since ant1.7 | * @since ant1.7 | ||||
| */ | */ | ||||
| public class ForkingSunRmic extends DefaultRmicAdapter { | public class ForkingSunRmic extends DefaultRmicAdapter { | ||||
| @@ -53,7 +54,7 @@ public class ForkingSunRmic extends DefaultRmicAdapter { | |||||
| Commandline cmd = setupRmicCommand(); | Commandline cmd = setupRmicCommand(); | ||||
| Project project = owner.getProject(); | Project project = owner.getProject(); | ||||
| //rely on RMIC being on the path | //rely on RMIC being on the path | ||||
| cmd.setExecutable(JavaEnvUtils.getJdkExecutable(SunRmic.RMIC_EXECUTABLE)); | |||||
| cmd.setExecutable(JavaEnvUtils.getJdkExecutable(getExecutableName())); | |||||
| //set up the args | //set up the args | ||||
| String[] args = cmd.getCommandline(); | String[] args = cmd.getCommandline(); | ||||
| @@ -68,8 +69,16 @@ public class ForkingSunRmic extends DefaultRmicAdapter { | |||||
| exe.execute(); | exe.execute(); | ||||
| return !exe.isFailure(); | return !exe.isFailure(); | ||||
| } catch (IOException exception) { | } catch (IOException exception) { | ||||
| throw new BuildException("Error running " + SunRmic.RMIC_EXECUTABLE | |||||
| throw new BuildException("Error running " + getExecutableName() | |||||
| + " -maybe it is not on the path", exception); | + " -maybe it is not on the path", exception); | ||||
| } | } | ||||
| } | } | ||||
| /** | |||||
| * Override point. | |||||
| * @return | |||||
| */ | |||||
| protected String getExecutableName() { | |||||
| return SunRmic.RMIC_EXECUTABLE; | |||||
| } | |||||
| } | } | ||||
| @@ -19,7 +19,11 @@ package org.apache.tools.ant.taskdefs.rmic; | |||||
| import org.apache.tools.ant.BuildException; | import org.apache.tools.ant.BuildException; | ||||
| import org.apache.tools.ant.Task; | import org.apache.tools.ant.Task; | ||||
| import org.apache.tools.ant.taskdefs.Rmic; | |||||
| import org.apache.tools.ant.util.ClasspathUtils; | import org.apache.tools.ant.util.ClasspathUtils; | ||||
| import org.apache.tools.ant.util.JavaEnvUtils; | |||||
| import java.util.Locale; | |||||
| /** | /** | ||||
| @@ -63,24 +67,27 @@ public final class RmicAdapterFactory { | |||||
| */ | */ | ||||
| public static RmicAdapter getRmic(String rmicType, Task task) | public static RmicAdapter getRmic(String rmicType, Task task) | ||||
| throws BuildException { | throws BuildException { | ||||
| //convert to lower case in the English locale, | |||||
| String compiler = rmicType.toLowerCase(Locale.ENGLISH); | |||||
| //handle default specially. | |||||
| if (DEFAULT_COMPILER.equalsIgnoreCase(rmicType) || rmicType.length() == 0) { | |||||
| String adapter = KaffeRmic.isAvailable() | |||||
| //handle default specially by choosing the sun or kaffe compiler | |||||
| if (DEFAULT_COMPILER.equals(compiler) || compiler.length() == 0) { | |||||
| compiler = KaffeRmic.isAvailable() | |||||
| ? KaffeRmic.COMPILER_NAME | ? KaffeRmic.COMPILER_NAME | ||||
| : SunRmic.COMPILER_NAME; | : SunRmic.COMPILER_NAME; | ||||
| return getRmic(adapter, task); | |||||
| } | } | ||||
| if (SunRmic.COMPILER_NAME.equalsIgnoreCase(rmicType)) { | |||||
| if (SunRmic.COMPILER_NAME.equals(compiler)) { | |||||
| return new SunRmic(); | return new SunRmic(); | ||||
| } else if (KaffeRmic.COMPILER_NAME.equalsIgnoreCase(rmicType)) { | |||||
| } else if (KaffeRmic.COMPILER_NAME.equals(compiler)) { | |||||
| return new KaffeRmic(); | return new KaffeRmic(); | ||||
| } else if (WLRmic.COMPILER_NAME.equalsIgnoreCase(rmicType)) { | |||||
| } else if (WLRmic.COMPILER_NAME.equals(compiler)) { | |||||
| return new WLRmic(); | return new WLRmic(); | ||||
| } else if (ForkingSunRmic.COMPILER_NAME.equalsIgnoreCase(rmicType)) { | |||||
| } else if (ForkingSunRmic.COMPILER_NAME.equals(compiler)) { | |||||
| return new ForkingSunRmic(); | return new ForkingSunRmic(); | ||||
| } else if (XNewRmic.COMPILER_NAME.equals(compiler)) { | |||||
| return new XNewRmic(); | |||||
| } | } | ||||
| //no match? ask for the non-lower-cased type | |||||
| return resolveClassName(rmicType); | return resolveClassName(rmicType); | ||||
| } | } | ||||
| @@ -93,8 +100,8 @@ public final class RmicAdapterFactory { | |||||
| * isn't an instance of RmicAdapter. | * isn't an instance of RmicAdapter. | ||||
| */ | */ | ||||
| private static RmicAdapter resolveClassName(String className) | private static RmicAdapter resolveClassName(String className) | ||||
| throws BuildException { | |||||
| return (RmicAdapter) ClasspathUtils.newInstance(className, | |||||
| RmicAdapterFactory.class.getClassLoader(), RmicAdapter.class); | |||||
| throws BuildException { | |||||
| return (RmicAdapter) ClasspathUtils.newInstance(className, | |||||
| RmicAdapterFactory.class.getClassLoader(), RmicAdapter.class); | |||||
| } | } | ||||
| } | } | ||||
| @@ -38,7 +38,8 @@ public class RmicAdvancedTest extends BuildFileTest { | |||||
| /** | /** | ||||
| * The JUnit setup method | * The JUnit setup method | ||||
| */ | */ | ||||
| public void setUp() { | |||||
| public void setUp() throws Exception { | |||||
| super.setUp(); | |||||
| configureProject(TASKDEFS_DIR + "rmic.xml"); | configureProject(TASKDEFS_DIR + "rmic.xml"); | ||||
| } | } | ||||
| @@ -112,6 +113,13 @@ public class RmicAdvancedTest extends BuildFileTest { | |||||
| RmicAdapterFactory.ERROR_UNKNOWN_COMPILER); | RmicAdapterFactory.ERROR_UNKNOWN_COMPILER); | ||||
| } | } | ||||
| /** | |||||
| * load an adapter by name | |||||
| */ | |||||
| public void testExplicitClass() throws Exception { | |||||
| executeTarget("testExplicitClass"); | |||||
| } | |||||
| /** | /** | ||||
| * A unit test for JUnit | * A unit test for JUnit | ||||
| */ | */ | ||||
| @@ -212,6 +220,15 @@ public class RmicAdvancedTest extends BuildFileTest { | |||||
| executeTarget("testXnewForked"); | executeTarget("testXnewForked"); | ||||
| } | } | ||||
| /** | |||||
| * test that runs the new xnew compiler adapter. | |||||
| * | |||||
| * @throws Exception | |||||
| */ | |||||
| public void testXnewCompiler() throws Exception { | |||||
| executeTarget("testXnewCompiler"); | |||||
| } | |||||
| /** | /** | ||||
| * test that verifies that IDL compiles. | * test that verifies that IDL compiles. | ||||
| * | * | ||||