| @@ -71,6 +71,8 @@ Other changes: | |||
| upgraded to 0.1.54. Jsch is the library behind the sshexec | |||
| and scp Ant tasks. | |||
| * Added a new <javaversion> condition. | |||
| Changes from Ant 1.10.0 TO Ant 1.10.1 | |||
| ===================================== | |||
| @@ -383,6 +383,9 @@ | |||
| </condition> | |||
| <property name="ignoresystemclasses" value="false"/> | |||
| <available property="jdk9+" classname="java.lang.module.ModuleDescriptor"/> | |||
| <condition property="jdk10+"> | |||
| <javaversion atleast="10"/> | |||
| </condition> | |||
| <available property="kaffe" classname="kaffe.util.NotImplemented"/> | |||
| <available property="harmony" | |||
| classname="org.apache.harmony.luni.util.Base64"/> | |||
| @@ -1095,5 +1095,44 @@ is redundant and will be ignored.</p> | |||
| <file file="${file}"/> | |||
| </resourceexists> | |||
| </pre></blockquote> | |||
| <h4><a name="javaversion">javaversion</a></h4> | |||
| <p>Tests the version of the JVM executing Ant. <em>Since Ant | |||
| 1.10.2</em></p> | |||
| <table border="1" cellpadding="2" cellspacing="0"> | |||
| <tr> | |||
| <td width="12%" valign="top"><b>Attribute</b></td> | |||
| <td width="78%" valign="top"><b>Description</b></td> | |||
| <td width="10%" valign="top"><b>Required</b></td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">atleast</td> | |||
| <td valign="top">The version that this JVM is at least. | |||
| The format is major.minor.point. Starting with Java9 really | |||
| only the major number is determined.</td> | |||
| <td valign="top" align="center">No</td> | |||
| <td valign="top" rowspan="2" align="center">One of these.</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">exactly</td> | |||
| <td valign="top">The version that this JVM is exactly. | |||
| The format is <tt>major.minor.point</tt>. Starting with Java9 really | |||
| only the major number is determined.</td> | |||
| <td valign="top" align="center">No</td> | |||
| </tr> | |||
| </table> | |||
| <p> | |||
| An example: | |||
| </p> | |||
| <blockquote><pre> | |||
| <javaversion atleast="9"/> | |||
| </pre></blockquote> | |||
| <p>will evaluate to true if the current JVM is Java9 or above.</p> | |||
| </body> | |||
| </html> | |||
| @@ -78,9 +78,10 @@ attribute are:</a></p> | |||
| <code>javac1.5</code> and | |||
| <code>javac1.6</code> and | |||
| <code>javac1.7</code> (<em>since Ant 1.8.2</em>) and | |||
| <code>javac1.8</code> (<em>since Ant 1.8.3</em>) and</li> | |||
| <code>javac1.9</code> (<em>since Ant 1.9.5</em>) and</li> | |||
| <code>javac9</code> (<em>since Ant 1.9.8</em>) can be used as aliases.</li> | |||
| <code>javac1.8</code> (<em>since Ant 1.8.3</em>) and | |||
| <code>javac1.9</code> (<em>since Ant 1.9.5</em>) and | |||
| <code>javac9</code> (<em>since Ant 1.9.8</em>) and | |||
| <code>javac10+</code> (<em>since Ant 1.10.2</em>) can be used as aliases.</li> | |||
| <li><code>jikes</code> (the <a | |||
| href="http://jikes.sourceforge.net/" target="_top">Jikes</a> | |||
| compiler).</li> | |||
| @@ -525,7 +526,7 @@ invoking the compiler.</p> | |||
| <tr> | |||
| <td valign="top">release</td> | |||
| <td valign="top"> | |||
| Specify the value for the <code>--release</code> switch.Ignored | |||
| Specify the value for the <code>--release</code> switch. Ignored | |||
| when running on JDK < 9.<br> | |||
| When set and running on JDK >= 9 the source and target | |||
| attributes as well as the bootclasspath will be ignored. | |||
| @@ -63,6 +63,8 @@ | |||
| classname="org.apache.tools.ant.taskdefs.condition.IsSigned"/> | |||
| <componentdef name="istrue" onerror="ignore" | |||
| classname="org.apache.tools.ant.taskdefs.condition.IsTrue"/> | |||
| <componentdef name="javaversion" onerror="ignore" | |||
| classname="org.apache.tools.ant.taskdefs.condition.JavaVersion"/> | |||
| <componentdef name="matches" onerror="ignore" | |||
| classname="org.apache.tools.ant.taskdefs.condition.Matches"/> | |||
| <componentdef name="not" onerror="ignore" | |||
| @@ -84,6 +84,7 @@ public class Javac extends MatchingTask { | |||
| private static final String FAIL_MSG | |||
| = "Compile failed; see the compiler error output for details."; | |||
| private static final String JAVAC10_PLUS = "javac10+"; | |||
| private static final String JAVAC9 = "javac9"; | |||
| private static final String JAVAC19 = "javac1.9"; | |||
| private static final String JAVAC18 = "javac1.8"; | |||
| @@ -173,6 +174,9 @@ public class Javac extends MatchingTask { | |||
| if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_8)) { | |||
| return JAVAC18; | |||
| } | |||
| if (JavaEnvUtils.isAtLeastJavaVersion("10")) { | |||
| return JAVAC10_PLUS; | |||
| } | |||
| if (JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_9)) { | |||
| return JAVAC9; | |||
| } | |||
| @@ -221,7 +225,7 @@ public class Javac extends MatchingTask { | |||
| * must make sure that your version of jikes supports the -source | |||
| * switch.</p> | |||
| * | |||
| * <p>Legal values are 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, and 5, 6, 7, 8 and 9 | |||
| * <p>Legal values are 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, and any integral number bigger than 4 | |||
| * - by default, no -source argument will be used at all.</p> | |||
| * | |||
| * @param v Value to assign to source. | |||
| @@ -774,7 +778,7 @@ public class Javac extends MatchingTask { | |||
| /** | |||
| * Sets the target VM that the classes will be compiled for. Valid | |||
| * values depend on the compiler, for jdk 1.4 the valid values are | |||
| * "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9", "5", "6", "7", "8", "9". | |||
| * "1.1", "1.2", "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "1.9" and any integral number bigger than 4 | |||
| * @param target the target VM | |||
| */ | |||
| public void setTarget(final String target) { | |||
| @@ -964,7 +968,8 @@ public class Javac extends MatchingTask { | |||
| } | |||
| private String getAltCompilerName(final String anImplementation) { | |||
| if (JAVAC9.equalsIgnoreCase(anImplementation) | |||
| if (JAVAC10_PLUS.equalsIgnoreCase(anImplementation) | |||
| || JAVAC9.equalsIgnoreCase(anImplementation) | |||
| || JAVAC19.equalsIgnoreCase(anImplementation) | |||
| || JAVAC18.equalsIgnoreCase(anImplementation) | |||
| || JAVAC17.equalsIgnoreCase(anImplementation) | |||
| @@ -980,7 +985,8 @@ public class Javac extends MatchingTask { | |||
| } | |||
| if (MODERN.equalsIgnoreCase(anImplementation)) { | |||
| final String nextSelected = assumedJavaVersion(); | |||
| if (JAVAC9.equalsIgnoreCase(nextSelected) | |||
| if (JAVAC10_PLUS.equalsIgnoreCase(anImplementation) | |||
| || JAVAC9.equalsIgnoreCase(nextSelected) | |||
| || JAVAC18.equalsIgnoreCase(nextSelected) | |||
| || JAVAC17.equalsIgnoreCase(nextSelected) | |||
| || JAVAC16.equalsIgnoreCase(nextSelected) | |||
| @@ -1183,7 +1189,7 @@ public class Javac extends MatchingTask { | |||
| scanDir(srcDir, destDir != null ? destDir : srcDir, files); | |||
| } | |||
| } | |||
| private void collectFileListFromModulePath() { | |||
| final FileUtils fu = FileUtils.getFileUtils(); | |||
| for (String pathElement : moduleSourcepath.list()) { | |||
| @@ -1248,11 +1254,12 @@ public class Javac extends MatchingTask { | |||
| * @param compilerImpl the name of the compiler implementation | |||
| * @return true if compilerImpl is "modern", "classic", | |||
| * "javac1.1", "javac1.2", "javac1.3", "javac1.4", "javac1.5", | |||
| * "javac1.6", "javac1.7", "javac1.8", "javac1.9" or "javac9". | |||
| * "javac1.6", "javac1.7", "javac1.8", "javac1.9", "javac9" or "javac10+". | |||
| */ | |||
| protected boolean isJdkCompiler(final String compilerImpl) { | |||
| return MODERN.equals(compilerImpl) | |||
| || CLASSIC.equals(compilerImpl) | |||
| || JAVAC10_PLUS.equals(compilerImpl) | |||
| || JAVAC9.equals(compilerImpl) | |||
| || JAVAC18.equals(compilerImpl) | |||
| || JAVAC17.equals(compilerImpl) | |||
| @@ -121,7 +121,8 @@ public final class CompilerAdapterFactory { | |||
| || "javac1.7".equalsIgnoreCase(compilerType) | |||
| || "javac1.8".equalsIgnoreCase(compilerType) | |||
| || "javac1.9".equalsIgnoreCase(compilerType) | |||
| || "javac9".equalsIgnoreCase(compilerType)) { | |||
| || "javac9".equalsIgnoreCase(compilerType) | |||
| || "javac10+".equalsIgnoreCase(compilerType)) { | |||
| // does the modern compiler exist? | |||
| if (doesModernCompilerExist()) { | |||
| return new Javac13(); | |||
| @@ -321,7 +321,7 @@ public abstract class DefaultCompilerAdapter | |||
| cmd.createArgument().setValue("-sourcepath"); | |||
| cmd.createArgument().setPath(sourcepath); | |||
| } | |||
| if (release == null || !assumeJava19()) { | |||
| if (release == null || !assumeJava9Plus()) { | |||
| if (target != null) { | |||
| cmd.createArgument().setValue("-target"); | |||
| cmd.createArgument().setValue(target); | |||
| @@ -394,7 +394,7 @@ public abstract class DefaultCompilerAdapter | |||
| if (!assumeJava13()) { // -source added with JDK 1.4 | |||
| final String t = attributes.getTarget(); | |||
| final String s = attributes.getSource(); | |||
| if (release == null || !assumeJava19()) { | |||
| if (release == null || !assumeJava9Plus()) { | |||
| if (release != null) { | |||
| attributes.log( | |||
| "Support for javac --release has been added in Java9 ignoring it"); | |||
| @@ -714,6 +714,21 @@ public abstract class DefaultCompilerAdapter | |||
| return assumeJava19(); | |||
| } | |||
| /** | |||
| * Shall we assume JDK 9+ command line switches? | |||
| * @return true if JDK 9+ | |||
| * @since Ant 1.10.2 | |||
| */ | |||
| protected boolean assumeJava9Plus() { | |||
| return "javac1.9".equals(attributes.getCompilerVersion()) | |||
| || "javac9".equals(attributes.getCompilerVersion()) | |||
| || "javac10+".equals(attributes.getCompilerVersion()) | |||
| || (JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.JAVA_9) && | |||
| ("classic".equals(attributes.getCompilerVersion()) | |||
| || "modern".equals(attributes.getCompilerVersion()) | |||
| || "extJavac".equals(attributes.getCompilerVersion()))); | |||
| } | |||
| /** | |||
| * Shall we assume command line switches for the given version of Java? | |||
| * @since Ant 1.8.3 | |||
| @@ -787,7 +802,7 @@ public abstract class DefaultCompilerAdapter | |||
| if (assumeJava18()) { | |||
| return "1.8 in JDK 1.8"; | |||
| } | |||
| if (assumeJava9()) { | |||
| if (assumeJava9Plus()) { | |||
| return "9 in JDK 9"; | |||
| } | |||
| return ""; | |||
| @@ -814,7 +829,7 @@ public abstract class DefaultCompilerAdapter | |||
| && !assumeJava15() && !assumeJava16()) | |||
| || ("7".equals(t) && !assumeJava17()) | |||
| || ("8".equals(t) && !assumeJava18()) | |||
| || ("9".equals(t) && !assumeJava9()); | |||
| || ("9".equals(t) && !assumeJava9Plus()); | |||
| } | |||
| /** | |||
| @@ -0,0 +1,115 @@ | |||
| /* | |||
| * Licensed to the Apache Software Foundation (ASF) under one or more | |||
| * contributor license agreements. See the NOTICE file distributed with | |||
| * this work for additional information regarding copyright ownership. | |||
| * The ASF licenses this file to You under the Apache License, Version 2.0 | |||
| * (the "License"); you may not use this file except in compliance with | |||
| * the License. You may obtain a copy of the License at | |||
| * | |||
| * http://www.apache.org/licenses/LICENSE-2.0 | |||
| * | |||
| * Unless required by applicable law or agreed to in writing, software | |||
| * distributed under the License is distributed on an "AS IS" BASIS, | |||
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| * See the License for the specific language governing permissions and | |||
| * limitations under the License. | |||
| * | |||
| */ | |||
| package org.apache.tools.ant.taskdefs.condition; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.util.DeweyDecimal; | |||
| import org.apache.tools.ant.util.JavaEnvUtils; | |||
| /** | |||
| * An Java version condition. | |||
| * @since Java 1.10.2 | |||
| */ | |||
| public class JavaVersion implements Condition { | |||
| private String atLeast = null; | |||
| private String exactly = null; | |||
| /** | |||
| * Evaluate the condition. | |||
| * @return true if the condition is true. | |||
| * @throws BuildException if an error occurs. | |||
| */ | |||
| public boolean eval() throws BuildException { | |||
| validate(); | |||
| DeweyDecimal actual = JavaEnvUtils.getParsedJavaVersion(); | |||
| if (null != atLeast) { | |||
| return actual.isGreaterThanOrEqual(new DeweyDecimal(atLeast)); | |||
| } | |||
| if (null != exactly) { | |||
| return actual.isEqual(new DeweyDecimal(exactly)); | |||
| } | |||
| //default | |||
| return false; | |||
| } | |||
| private void validate() throws BuildException { | |||
| if (atLeast != null && exactly != null) { | |||
| throw new BuildException("Only one of atleast or exactly may be set."); | |||
| } | |||
| if (null == atLeast && null == exactly) { | |||
| throw new BuildException("One of atleast or exactly must be set."); | |||
| } | |||
| if (atLeast != null) { | |||
| try { | |||
| // only created for side effect | |||
| new DeweyDecimal(atLeast); //NOSONAR | |||
| } catch (NumberFormatException e) { | |||
| throw new BuildException( | |||
| "The 'atleast' attribute is not a Dewey Decimal eg 1.1.0 : " | |||
| + atLeast); | |||
| } | |||
| } else { | |||
| try { | |||
| // only created for side effect | |||
| new DeweyDecimal(exactly); //NOSONAR | |||
| } catch (NumberFormatException e) { | |||
| throw new BuildException( | |||
| "The 'exactly' attribute is not a Dewey Decimal eg 1.1.0 : " | |||
| + exactly); | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Get the atleast attribute. | |||
| * @return the atleast attribute. | |||
| */ | |||
| public String getAtLeast() { | |||
| return atLeast; | |||
| } | |||
| /** | |||
| * Set the atleast attribute. | |||
| * This is of the form major.minor.point. | |||
| * For example 1.7.0. | |||
| * @param atLeast the version to check against. | |||
| */ | |||
| public void setAtLeast(String atLeast) { | |||
| this.atLeast = atLeast; | |||
| } | |||
| /** | |||
| * Get the exactly attribute. | |||
| * @return the exactly attribute. | |||
| */ | |||
| public String getExactly() { | |||
| return exactly; | |||
| } | |||
| /** | |||
| * Set the exactly attribute. | |||
| * This is of the form major.minor.point. | |||
| * For example 1.7.0. | |||
| * @param exactly the version to check against. | |||
| */ | |||
| public void setExactly(String exactly) { | |||
| this.exactly = exactly; | |||
| } | |||
| } | |||
| @@ -66,6 +66,8 @@ | |||
| classname="org.apache.tools.ant.taskdefs.condition.IsSigned"/> | |||
| <typedef name="istrue" onerror="ignore" | |||
| classname="org.apache.tools.ant.taskdefs.condition.IsTrue"/> | |||
| <typedef name="javaversion" onerror="ignore" | |||
| classname="org.apache.tools.ant.taskdefs.condition.JavaVersion"/> | |||
| <typedef name="not" onerror="ignore" | |||
| classname="org.apache.tools.ant.taskdefs.condition.Not"/> | |||
| <typedef name="matches" onerror="ignore" | |||
| @@ -29,6 +29,10 @@ import org.apache.tools.ant.taskdefs.condition.Os; | |||
| * A set of helper methods related to locating executables or checking | |||
| * conditions of a given Java installation. | |||
| * | |||
| * <p>Starting with Java 10 we've stopped adding <code>JAVA_</code> | |||
| * and <code>VERSION_</code> attributes for new major version numbers | |||
| * of the JVM.</p> | |||
| * | |||
| * @since Ant 1.5 | |||
| */ | |||
| public final class JavaEnvUtils { | |||
| @@ -181,6 +185,10 @@ public final class JavaEnvUtils { | |||
| Class.forName("java.lang.module.ModuleDescriptor"); | |||
| javaVersion = JAVA_9; | |||
| javaVersionNumber = VERSION_9; | |||
| // at least Java9 and this should properly support the purely numeric version property | |||
| String v = System.getProperty("java.specification.version"); | |||
| javaVersionNumber = Integer.parseInt(v) * 10; | |||
| javaVersion = v; | |||
| } catch (Throwable t) { | |||
| // swallow as we've hit the max class version that | |||
| // we have | |||
| @@ -448,52 +456,46 @@ public final class JavaEnvUtils { | |||
| */ | |||
| private static void buildJrePackages() { | |||
| jrePackages = new Vector<>(); | |||
| switch(javaVersionNumber) { | |||
| case VERSION_9: | |||
| case VERSION_1_8: | |||
| case VERSION_1_7: | |||
| jrePackages.addElement("jdk"); | |||
| // fall through | |||
| case VERSION_1_6: | |||
| case VERSION_1_5: | |||
| //In Java1.5, the apache stuff moved. | |||
| jrePackages.addElement("com.sun.org.apache"); | |||
| //fall through. | |||
| case VERSION_1_4: | |||
| if (javaVersionNumber == VERSION_1_4) { | |||
| jrePackages.addElement("org.apache.crimson"); | |||
| jrePackages.addElement("org.apache.xalan"); | |||
| jrePackages.addElement("org.apache.xml"); | |||
| jrePackages.addElement("org.apache.xpath"); | |||
| } | |||
| jrePackages.addElement("org.ietf.jgss"); | |||
| jrePackages.addElement("org.w3c.dom"); | |||
| jrePackages.addElement("org.xml.sax"); | |||
| // fall through | |||
| case VERSION_1_3: | |||
| jrePackages.addElement("org.omg"); | |||
| jrePackages.addElement("com.sun.corba"); | |||
| jrePackages.addElement("com.sun.jndi"); | |||
| jrePackages.addElement("com.sun.media"); | |||
| jrePackages.addElement("com.sun.naming"); | |||
| jrePackages.addElement("com.sun.org.omg"); | |||
| jrePackages.addElement("com.sun.rmi"); | |||
| jrePackages.addElement("sunw.io"); | |||
| jrePackages.addElement("sunw.util"); | |||
| // fall through | |||
| case VERSION_1_2: | |||
| jrePackages.addElement("com.sun.java"); | |||
| jrePackages.addElement("com.sun.image"); | |||
| // are there any here that we forgot? | |||
| // fall through | |||
| case VERSION_1_1: | |||
| default: | |||
| //things like sun.reflection, sun.misc, sun.net | |||
| jrePackages.addElement("sun"); | |||
| jrePackages.addElement("java"); | |||
| jrePackages.addElement("javax"); | |||
| break; | |||
| jrePackages = new Vector<String>(); | |||
| if (isAtLeastJavaVersion(JAVA_1_1)) { | |||
| //things like sun.reflection, sun.misc, sun.net | |||
| jrePackages.addElement("sun"); | |||
| jrePackages.addElement("java"); | |||
| jrePackages.addElement("javax"); | |||
| } | |||
| if (isAtLeastJavaVersion(JAVA_1_2)) { | |||
| jrePackages.addElement("com.sun.java"); | |||
| jrePackages.addElement("com.sun.image"); | |||
| // are there any here that we forgot? | |||
| } | |||
| if (isAtLeastJavaVersion(JAVA_1_3)) { | |||
| jrePackages.addElement("org.omg"); | |||
| jrePackages.addElement("com.sun.corba"); | |||
| jrePackages.addElement("com.sun.jndi"); | |||
| jrePackages.addElement("com.sun.media"); | |||
| jrePackages.addElement("com.sun.naming"); | |||
| jrePackages.addElement("com.sun.org.omg"); | |||
| jrePackages.addElement("com.sun.rmi"); | |||
| jrePackages.addElement("sunw.io"); | |||
| jrePackages.addElement("sunw.util"); | |||
| } | |||
| if (isAtLeastJavaVersion(JAVA_1_4)) { | |||
| if (javaVersionNumber == VERSION_1_4) { | |||
| jrePackages.addElement("org.apache.crimson"); | |||
| jrePackages.addElement("org.apache.xalan"); | |||
| jrePackages.addElement("org.apache.xml"); | |||
| jrePackages.addElement("org.apache.xpath"); | |||
| } | |||
| jrePackages.addElement("org.ietf.jgss"); | |||
| jrePackages.addElement("org.w3c.dom"); | |||
| jrePackages.addElement("org.xml.sax"); | |||
| } | |||
| if (isAtLeastJavaVersion(JAVA_1_5)) { | |||
| //In Java1.5, the apache stuff moved. | |||
| jrePackages.addElement("com.sun.org.apache"); | |||
| } | |||
| if (isAtLeastJavaVersion(JAVA_1_7)) { | |||
| jrePackages.addElement("jdk"); | |||
| } | |||
| } | |||
| @@ -504,52 +506,46 @@ public final class JavaEnvUtils { | |||
| public static Vector<String> getJrePackageTestCases() { | |||
| Vector<String> tests = new Vector<>(); | |||
| tests.addElement("java.lang.Object"); | |||
| switch(javaVersionNumber) { | |||
| case VERSION_9: | |||
| case VERSION_1_8: | |||
| case VERSION_1_7: | |||
| tests.addElement("jdk.net.Sockets"); | |||
| // fall through | |||
| case VERSION_1_6: | |||
| case VERSION_1_5: | |||
| tests.addElement( | |||
| "com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl "); | |||
| // Fall through | |||
| case VERSION_1_4: | |||
| tests.addElement("sun.audio.AudioPlayer"); | |||
| if (javaVersionNumber == VERSION_1_4) { | |||
| // only for 1.4, not for higher versions which fall through | |||
| tests.addElement("org.apache.crimson.parser.ContentModel"); | |||
| tests.addElement("org.apache.xalan.processor.ProcessorImport"); | |||
| tests.addElement("org.apache.xml.utils.URI"); | |||
| tests.addElement("org.apache.xpath.XPathFactory"); | |||
| } | |||
| tests.addElement("org.ietf.jgss.Oid"); | |||
| tests.addElement("org.w3c.dom.Attr"); | |||
| tests.addElement("org.xml.sax.XMLReader"); | |||
| // fall through | |||
| case VERSION_1_3: | |||
| tests.addElement("org.omg.CORBA.Any"); | |||
| tests.addElement("com.sun.corba.se.internal.corba.AnyImpl"); | |||
| tests.addElement("com.sun.jndi.ldap.LdapURL"); | |||
| tests.addElement("com.sun.media.sound.Printer"); | |||
| tests.addElement("com.sun.naming.internal.VersionHelper"); | |||
| tests.addElement("com.sun.org.omg.CORBA.Initializer"); | |||
| tests.addElement("sunw.io.Serializable"); | |||
| tests.addElement("sunw.util.EventListener"); | |||
| // fall through | |||
| case VERSION_1_2: | |||
| tests.addElement("javax.accessibility.Accessible"); | |||
| tests.addElement("sun.misc.BASE64Encoder"); | |||
| tests.addElement("com.sun.image.codec.jpeg.JPEGCodec"); | |||
| // fall through | |||
| case VERSION_1_1: | |||
| default: | |||
| //things like sun.reflection, sun.misc, sun.net | |||
| tests.addElement("sun.reflect.SerializationConstructorAccessorImpl"); | |||
| tests.addElement("sun.net.www.http.HttpClient"); | |||
| tests.addElement("sun.audio.AudioPlayer"); | |||
| break; | |||
| if (isAtLeastJavaVersion(JAVA_1_1)) { | |||
| //things like sun.reflection, sun.misc, sun.net | |||
| tests.addElement("sun.reflect.SerializationConstructorAccessorImpl"); | |||
| tests.addElement("sun.net.www.http.HttpClient"); | |||
| tests.addElement("sun.audio.AudioPlayer"); | |||
| } | |||
| if (isAtLeastJavaVersion(JAVA_1_2)) { | |||
| tests.addElement("javax.accessibility.Accessible"); | |||
| tests.addElement("sun.misc.BASE64Encoder"); | |||
| tests.addElement("com.sun.image.codec.jpeg.JPEGCodec"); | |||
| } | |||
| if (isAtLeastJavaVersion(JAVA_1_3)) { | |||
| tests.addElement("org.omg.CORBA.Any"); | |||
| tests.addElement("com.sun.corba.se.internal.corba.AnyImpl"); | |||
| tests.addElement("com.sun.jndi.ldap.LdapURL"); | |||
| tests.addElement("com.sun.media.sound.Printer"); | |||
| tests.addElement("com.sun.naming.internal.VersionHelper"); | |||
| tests.addElement("com.sun.org.omg.CORBA.Initializer"); | |||
| tests.addElement("sunw.io.Serializable"); | |||
| tests.addElement("sunw.util.EventListener"); | |||
| } | |||
| if (isAtLeastJavaVersion(JAVA_1_4)) { | |||
| tests.addElement("sun.audio.AudioPlayer"); | |||
| if (javaVersionNumber == VERSION_1_4) { | |||
| // only for 1.4, not for higher versions | |||
| tests.addElement("org.apache.crimson.parser.ContentModel"); | |||
| tests.addElement("org.apache.xalan.processor.ProcessorImport"); | |||
| tests.addElement("org.apache.xml.utils.URI"); | |||
| tests.addElement("org.apache.xpath.XPathFactory"); | |||
| } | |||
| tests.addElement("org.ietf.jgss.Oid"); | |||
| tests.addElement("org.w3c.dom.Attr"); | |||
| tests.addElement("org.xml.sax.XMLReader"); | |||
| } | |||
| if (isAtLeastJavaVersion(JAVA_1_5)) { | |||
| tests.addElement( | |||
| "com.sun.org.apache.xerces.internal.jaxp.datatype.DatatypeFactoryImpl"); | |||
| } | |||
| if (isAtLeastJavaVersion(JAVA_1_7)) { | |||
| tests.addElement("jdk.net.Sockets"); | |||
| } | |||
| return tests; | |||
| } | |||
| @@ -36,7 +36,7 @@ import java.util.BitSet; | |||
| * <pre> | |||
| * CompressCommons | |||
| * Commons Compress | |||
| * CompressCommons | |||
| * CompressCommons | |||
| * essCommons Compr | |||
| * mmons CompressCo | |||
| * mons CompressCom | |||
| @@ -251,7 +251,7 @@ class BlockSort { | |||
| * bucket 'ra' with sort index 5. The fully sorted order then becomes. | |||
| * | |||
| * fmap = { 5, 3, 0, 4, 1, 2 } | |||
| * | |||
| * | |||
| */ | |||
| /** | |||
| @@ -261,12 +261,12 @@ class BlockSort { | |||
| * @param eclass points from the index of a character inside the | |||
| * block to the first index in fmap that contains the | |||
| * bucket of its suffix that is sorted in this step. | |||
| * @param lo lower boundary of the fmap-interval to be sorted | |||
| * @param hi upper boundary of the fmap-interval to be sorted | |||
| * @param lo lower boundary of the fmap-interval to be sorted | |||
| * @param hi upper boundary of the fmap-interval to be sorted | |||
| */ | |||
| private void fallbackSimpleSort(int[] fmap, | |||
| int[] eclass, | |||
| int lo, | |||
| private void fallbackSimpleSort(int[] fmap, | |||
| int[] eclass, | |||
| int lo, | |||
| int hi) { | |||
| if (lo == hi) { | |||
| return; | |||
| @@ -336,12 +336,12 @@ class BlockSort { | |||
| * @param eclass points from the index of a character inside the | |||
| * block to the first index in fmap that contains the | |||
| * bucket of its suffix that is sorted in this step. | |||
| * @param loSt lower boundary of the fmap-interval to be sorted | |||
| * @param hiSt upper boundary of the fmap-interval to be sorted | |||
| * @param loSt lower boundary of the fmap-interval to be sorted | |||
| * @param hiSt upper boundary of the fmap-interval to be sorted | |||
| */ | |||
| private void fallbackQSort3(int[] fmap, | |||
| int[] eclass, | |||
| int loSt, | |||
| private void fallbackQSort3(int[] fmap, | |||
| int[] eclass, | |||
| int loSt, | |||
| int hiSt) { | |||
| int lo, unLo, ltLo, hi, unHi, gtHi, n; | |||
| @@ -359,16 +359,16 @@ class BlockSort { | |||
| } | |||
| /* LBZ2: Random partitioning. Median of 3 sometimes fails to | |||
| avoid bad cases. Median of 9 seems to help but | |||
| avoid bad cases. Median of 9 seems to help but | |||
| looks rather expensive. This too seems to work but | |||
| is cheaper. Guidance for the magic constants | |||
| is cheaper. Guidance for the magic constants | |||
| 7621 and 32768 is taken from Sedgewick's algorithms | |||
| book, chapter 35. | |||
| */ | |||
| r = ((r * 7621) + 1) % 32768; | |||
| long r3 = r % 3, med; | |||
| if (r3 == 0) { | |||
| med = eclass[fmap[lo]]; | |||
| med = eclass[fmap[lo]]; | |||
| } else if (r3 == 1) { | |||
| med = eclass[fmap[(lo + hi) >>> 1]]; | |||
| } else { | |||
| @@ -386,10 +386,10 @@ class BlockSort { | |||
| break; | |||
| } | |||
| n = eclass[fmap[unLo]] - (int) med; | |||
| if (n == 0) { | |||
| fswap(fmap, unLo, ltLo); | |||
| ltLo++; unLo++; | |||
| continue; | |||
| if (n == 0) { | |||
| fswap(fmap, unLo, ltLo); | |||
| ltLo++; unLo++; | |||
| continue; | |||
| } | |||
| if (n > 0) { | |||
| break; | |||
| @@ -402,9 +402,9 @@ class BlockSort { | |||
| } | |||
| n = eclass[fmap[unHi]] - (int) med; | |||
| if (n == 0) { | |||
| fswap(fmap, unHi, gtHi); | |||
| gtHi--; unHi--; | |||
| continue; | |||
| fswap(fmap, unHi, gtHi); | |||
| gtHi--; unHi--; | |||
| continue; | |||
| } | |||
| if (n < 0) { | |||
| break; | |||
| @@ -510,7 +510,7 @@ class BlockSort { | |||
| --*/ | |||
| /*-- LBZ2: set sentinel bits for block-end detection --*/ | |||
| for (i = 0; i < 32; i++) { | |||
| for (i = 0; i < 32; i++) { | |||
| bhtab.set(nblock + 2 * i); | |||
| bhtab.clear(nblock + 2 * i + 1); | |||
| } | |||
| @@ -40,7 +40,7 @@ import java.io.InputStream; | |||
| * source stream via the single byte {@link java.io.InputStream#read() | |||
| * read()} method exclusively. Thus you should consider to use a | |||
| * buffered source stream.</p> | |||
| * | |||
| * | |||
| * <p>Instances of this class are not threadsafe.</p> | |||
| */ | |||
| public class CBZip2InputStream extends InputStream implements BZip2Constants { | |||
| @@ -173,7 +173,7 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { | |||
| /* | |||
| * (non-Javadoc) | |||
| * | |||
| * | |||
| * @see java.io.InputStream#read(byte[], int, int) | |||
| */ | |||
| @Override | |||
| @@ -261,7 +261,7 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { | |||
| if (null == in) { | |||
| throw new IOException("No InputStream"); | |||
| } | |||
| if (isFirstStream) { | |||
| if (in.available() == 0) { | |||
| throw new IOException("Empty InputStream"); | |||
| @@ -1059,4 +1059,3 @@ public class CBZip2InputStream extends InputStream implements BZip2Constants { | |||
| } | |||
| } | |||
| @@ -27,6 +27,9 @@ | |||
| <property name="test3.jar" location="${antunit.tmpdir}/test3.jar"/> | |||
| <property name="test4.jar" location="${antunit.tmpdir}/test4.jar"/> | |||
| <property name="test5.jar" location="${antunit.tmpdir}/test5.jar"/> | |||
| <condition property="jdk10+"> | |||
| <javaversion atleast="10"/> | |||
| </condition> | |||
| <available property="jdk9+" classname="java.lang.module.ModuleDescriptor"/> | |||
| <condition property="build.sysclasspath.only"> | |||
| <equals arg1="${build.sysclasspath}" arg2="only"/> | |||
| @@ -0,0 +1,40 @@ | |||
| <?xml version="1.0"?> | |||
| <!-- | |||
| Licensed to the Apache Software Foundation (ASF) under one or more | |||
| contributor license agreements. See the NOTICE file distributed with | |||
| this work for additional information regarding copyright ownership. | |||
| The ASF licenses this file to You under the Apache License, Version 2.0 | |||
| (the "License"); you may not use this file except in compliance with | |||
| the License. You may obtain a copy of the License at | |||
| http://www.apache.org/licenses/LICENSE-2.0 | |||
| Unless required by applicable law or agreed to in writing, software | |||
| distributed under the License is distributed on an "AS IS" BASIS, | |||
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
| See the License for the specific language governing permissions and | |||
| limitations under the License. | |||
| --> | |||
| <project name="javaversion-test" default="antunit" xmlns:au="antlib:org.apache.ant.antunit"> | |||
| <import file="../../antunit-base.xml" /> | |||
| <target name="test-atleast"> | |||
| <au:assertTrue message="Expected javaversion of ${ant.version} to be at least 1.7.0"> | |||
| <!-- Ant 1.9.x requires Java5 at runtime - so this must be true --> | |||
| <javaversion atleast="1.5" /> | |||
| </au:assertTrue> | |||
| </target> | |||
| <target name="test-exactly"> | |||
| <au:assertTrue message="Expected javaversion of ${ant.java.version}"> | |||
| <javaversion exactly="${ant.java.version}" /> | |||
| </au:assertTrue> | |||
| </target> | |||
| <target name="test-atleast-fail"> | |||
| <au:assertFalse> | |||
| <javaversion atleast="1000.0" /> | |||
| </au:assertFalse> | |||
| </target> | |||
| </project> | |||
| @@ -265,7 +265,14 @@ public class Adapter implements CompilerAdapter { | |||
| <delete dir="${javac-dir}/classes"/> | |||
| <mkdir dir="${javac-dir}/classes"/> | |||
| </sequential> | |||
| </target> | |||
| <sequential if:set="jdk10+"> | |||
| <echo>JDK 10+</echo> | |||
| <testJavac source="10" target="10"/> | |||
| <delete dir="${javac-dir}/classes"/> | |||
| <mkdir dir="${javac-dir}/classes"/> | |||
| </sequential> | |||
| </target> | |||
| <target name="testJavacWithNativeHeaderGeneration" depends="setup"> | |||
| <mkdir dir="${javac-dir}/src/org/example" /> | |||
| @@ -101,7 +101,7 @@ public class AntClassLoaderDelegationTest { | |||
| Arrays.asList(new URL[] {urlFromPath}), | |||
| enum2List(acl.getResources(TEST_RESOURCE))); | |||
| } | |||
| private static List enum2List(Enumeration e) { | |||
| return Collections.list(e); | |||
| } | |||
| @@ -111,7 +111,7 @@ public class AntClassLoaderDelegationTest { | |||
| public ParentLoader() { | |||
| } | |||
| protected Enumeration findResources(String name) throws IOException { | |||
| if (name.equals(TEST_RESOURCE)) { | |||
| return Collections.enumeration( | |||
| @@ -45,7 +45,7 @@ import static org.junit.Assert.fail; | |||
| /** | |||
| */ | |||
| public class AntTest { | |||
| @Rule | |||
| public BuildFileRule buildRule = new BuildFileRule(); | |||
| @@ -89,7 +89,7 @@ public class AntlibTest { | |||
| Assume.assumeTrue("Test requires shared JVM", isSharedJVM()); | |||
| buildRule.executeTarget("antlib_uri_auto2"); | |||
| } | |||
| public static class MyTask extends Task { | |||
| public void execute() { | |||
| log("MyTask called"); | |||
| @@ -103,4 +103,3 @@ public class AntlibTest { | |||
| } | |||
| } | |||
| @@ -34,10 +34,10 @@ import static org.junit.Assert.fail; | |||
| */ | |||
| public class AvailableTest { | |||
| @Rule | |||
| public BuildFileRule buildRule = new BuildFileRule(); | |||
| @Before | |||
| public void setUp() { | |||
| buildRule.configureProject("src/etc/testcases/taskdefs/available.xml"); | |||
| @@ -44,7 +44,7 @@ public class CVSPassTest { | |||
| ":pserver:anoncvs@xml.apache.org:/home/cvspublic Ay=0=h<Z"; | |||
| private static final String TIGRIS_URL = | |||
| ":pserver:guest@cvs.tigris.org:/cvs AIbdZ,"; | |||
| @Rule | |||
| public final BuildFileRule buildRule = new BuildFileRule(); | |||
| @@ -30,7 +30,7 @@ public class ChecksumTest { | |||
| @Rule | |||
| public BuildFileRule buildRule = new BuildFileRule(); | |||
| @Before | |||
| public void setUp() { | |||
| buildRule.configureProject("src/etc/testcases/taskdefs/checksum.xml"); | |||
| @@ -82,7 +82,7 @@ public class EchoTest { | |||
| private class EchoTestLogger extends DefaultLogger { | |||
| String lastLoggedMessage; | |||
| /** | |||
| * Create a new EchoTestLogger. | |||
| */ | |||
| @@ -99,6 +99,6 @@ public class EchoTest { | |||
| protected void log(String message) { | |||
| this.lastLoggedMessage = message; | |||
| } | |||
| } | |||
| } | |||
| @@ -58,11 +58,11 @@ public class ManifestTest { | |||
| "OfCourseTheAnswerIsThatIsWhatTheSpecRequiresAndIfAnythingHas" + | |||
| "AProblemWithThatItIsNotABugInAnt"; | |||
| public static final String LONG_70_NAME | |||
| public static final String LONG_70_NAME | |||
| = "ThisNameIsJustSeventyCharactersWhichIsAllowedAccordingToTheSpecsFiller"; | |||
| public static final String LONG_68_NAME | |||
| public static final String LONG_68_NAME | |||
| = "ThisNameIsJustSixtyEightCharactersWhichIsAllowedAccordingToTheSpecsX"; | |||
| public static final String NOT_LONG_NAME | |||
| public static final String NOT_LONG_NAME | |||
| = "NameIsJustUnderSeventyCharactersWhichIsAllowedAccordingTheSpec"; | |||
| public static final String VALUE = "NOT_LONG"; | |||
| @@ -35,7 +35,7 @@ import static org.junit.Assert.assertTrue; | |||
| * | |||
| */ | |||
| public class MoveTest { | |||
| @Rule | |||
| public final BuildFileRule buildRule = new BuildFileRule(); | |||
| @@ -28,7 +28,7 @@ import org.junit.Test; | |||
| /** | |||
| */ | |||
| public class MultiMapTest { | |||
| @Rule | |||
| public final BuildFileRule buildRule = new BuildFileRule(); | |||
| @@ -36,7 +36,7 @@ public class PathConvertTest { | |||
| private static final String BUILD_PATH = "src/etc/testcases/taskdefs/"; | |||
| private static final String BUILD_FILENAME = "pathconvert.xml"; | |||
| private static final String BUILD_FILE = BUILD_PATH + BUILD_FILENAME; | |||
| @Before | |||
| public void setUp() { | |||
| buildRule.configureProject(BUILD_FILE); | |||
| @@ -32,7 +32,7 @@ import static org.junit.Assert.assertTrue; | |||
| /** | |||
| */ | |||
| public class RecorderTest { | |||
| @Rule | |||
| public final BuildFileRule buildRule = new BuildFileRule(); | |||
| @@ -84,7 +84,7 @@ public class SubAntTest { | |||
| }); | |||
| } | |||
| @Test | |||
| public void testMultipleTargets() { | |||
| buildRule.executeTarget("multipleTargets"); | |||
| @@ -93,13 +93,13 @@ public class SubAntTest { | |||
| assertContains("test2-one", buildRule.getLog()); | |||
| assertContains("test2-two", buildRule.getLog()); | |||
| } | |||
| @Test | |||
| public void testMultipleTargetsOneDoesntExist_FOEfalse() { | |||
| buildRule.executeTarget("multipleTargetsOneDoesntExist_FOEfalse"); | |||
| assertContains("Target \"three\" does not exist in the project \"subant\"", buildRule.getLog()); | |||
| } | |||
| @Test | |||
| public void testMultipleTargetsOneDoesntExist_FOEtrue() { | |||
| try { | |||
| @@ -33,7 +33,7 @@ import static org.junit.Assert.assertTrue; | |||
| import static org.junit.Assert.fail; | |||
| public class TouchTest { | |||
| @Rule | |||
| public final BuildFileRule buildRule = new BuildFileRule(); | |||
| @@ -29,7 +29,7 @@ import static org.junit.Assert.assertEquals; | |||
| import static org.junit.Assert.fail; | |||
| /** | |||
| */ | |||
| public class ParserSupportsTest { | |||