You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by ja...@apache.org on 2019/02/26 03:25:22 UTC

[ant] 01/02: Call InetAddress.isReachable instead of using reflection, now that we require Java 5 runtime for Ant

This is an automated email from the ASF dual-hosted git repository.

jaikiran pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ant.git

commit fe1ed7725d8ba7e62f9fb203659d22be2e54d3a0
Author: Jaikiran Pai <ja...@apache.org>
AuthorDate: Tue Feb 26 08:52:02 2019 +0530

    Call InetAddress.isReachable instead of using reflection, now that we require Java 5 runtime for Ant
---
 WHATSNEW                                           |  5 ++++
 manual/Tasks/conditions.html                       |  5 +---
 .../tools/ant/taskdefs/condition/IsReachable.java  | 32 +++++++---------------
 3 files changed, 16 insertions(+), 26 deletions(-)

diff --git a/WHATSNEW b/WHATSNEW
index 0ec0b51..166dcd4 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -52,6 +52,11 @@ Fixed bugs:
    if failOnError was set to false.
    Bugzilla Report 63071
 
+ * The isreachable condition could in some cases return true even if the
+   actual address could potentially be unreachable. This is now fixed
+   and the resolved address is actually checked for reachability.
+
+
 Other changes:
 --------------
  * generatekey task now supports SubjectAlternativeName during key
diff --git a/manual/Tasks/conditions.html b/manual/Tasks/conditions.html
index d1d2e45..97264f1 100644
--- a/manual/Tasks/conditions.html
+++ b/manual/Tasks/conditions.html
@@ -576,10 +576,7 @@ specifications, by attempting to set the appropriate property/feature</p>
 
 <p>Uses Java 5+ networking APIs to probe for a (remote) system being reachable. Exactly what probe
 mechanisms are used is an implementation feature of the JVM. They may include ICMP "ping" packets,
-UDP or TCP connections to port 7 "echo service" or other means. On Java 1.4 and earlier, being able
-to resolve the hostname is considered success. This means that if DNS is not working or a
-URL/hostname is bad, the test will fail, but otherwise succeed even if the remote host is actually
-absent.</p>
+UDP or TCP connections to port 7 "echo service" or other means.</p>
 <p>This condition turns unknown host exceptions into false conditions. This is because on a laptop,
 DNS is one of the first services when the network goes; you are implicitly offline.</p>
 <p>If a URL is supplied instead of a <var>host</var>, the hostname is extracted and used in the
diff --git a/src/main/org/apache/tools/ant/taskdefs/condition/IsReachable.java b/src/main/org/apache/tools/ant/taskdefs/condition/IsReachable.java
index e78d94b..e508a1c 100644
--- a/src/main/org/apache/tools/ant/taskdefs/condition/IsReachable.java
+++ b/src/main/org/apache/tools/ant/taskdefs/condition/IsReachable.java
@@ -18,6 +18,7 @@
 
 package org.apache.tools.ant.taskdefs.condition;
 
+import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.net.InetAddress;
@@ -85,7 +86,11 @@ public class IsReachable extends ProjectComponent implements Condition {
     public static final String ERROR_BAD_URL = "Bad URL ";
     /** Error message when no hostname in url. */
     public static final String ERROR_NO_HOST_IN_URL = "No hostname in URL ";
-    /** The method name to look for in InetAddress */
+    /**
+     * The method name to look for in InetAddress
+     * @deprecated Since 1.10.6
+     */
+    @Deprecated
     public static final String METHOD_NAME = "isReachable";
 
     private String host;
@@ -174,28 +179,11 @@ public class IsReachable extends ProjectComponent implements Condition {
         log("Host address = " + address.getHostAddress(),
                 Project.MSG_VERBOSE);
         boolean reachable;
-        //Java1.5: reachable = address.isReachable(timeout * 1000);
         try {
-            Method reachableMethod =
-                InetAddress.class.getMethod(METHOD_NAME, Integer.class);
-            try {
-                reachable = (Boolean) reachableMethod.invoke(address,
-                        timeout * SECOND);
-            } catch (final IllegalAccessException e) {
-                //utterly implausible, but catered for anyway
-                throw new BuildException("When calling " + reachableMethod);
-            } catch (final InvocationTargetException e) {
-                //assume this is an IOException about un readability
-                final Throwable nested = e.getTargetException();
-                log(ERROR_ON_NETWORK + target + ": " + nested.toString());
-                //any kind of fault: not reachable.
-                reachable = false;
-            }
-        } catch (final NoSuchMethodException e) {
-            //java1.4
-            log("Not found: InetAddress." + METHOD_NAME, Project.MSG_VERBOSE);
-            log(MSG_NO_REACHABLE_TEST);
-            reachable = true;
+            reachable = address.isReachable(timeout * SECOND);
+        } catch (final IOException ioe) {
+            reachable = false;
+            log(ERROR_ON_NETWORK + target + ": " + ioe.toString());
         }
 
         log("host is" + (reachable ? "" : " not") + " reachable", Project.MSG_VERBOSE);