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. | ||||
* | * | ||||