Browse Source

Call InetAddress.isReachable instead of using reflection, now that we require Java 5 runtime for Ant

master
Jaikiran Pai 6 years ago
parent
commit
f04cc8bb19
2 changed files with 11 additions and 35 deletions
  1. +1
    -4
      manual/Tasks/conditions.html
  2. +10
    -31
      src/main/org/apache/tools/ant/taskdefs/condition/IsReachable.java

+ 1
- 4
manual/Tasks/conditions.html View File

@@ -642,10 +642,7 @@ Check for Xerces-specific definition of the location of the no namespace schema.
<p>Uses Java1.5+ networking APIs to probe for a (remote) system being <p>Uses Java1.5+ networking APIs to probe for a (remote) system being
reachable. Exactly what probe mechanisms are used is an implementation reachable. Exactly what probe mechanisms are used is an implementation
feature of the JVM. They may include ICMP "ping" packets, UDP or TCP connections feature of the JVM. They may include ICMP "ping" packets, UDP or TCP connections
to port 7 "echo service" or other means. On Java1.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.
to port 7 "echo service" or other means.


</p> </p>
<p> <p>


+ 10
- 31
src/main/org/apache/tools/ant/taskdefs/condition/IsReachable.java View File

@@ -18,6 +18,7 @@


package org.apache.tools.ant.taskdefs.condition; package org.apache.tools.ant.taskdefs.condition;


import java.io.IOException;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.net.InetAddress; import java.net.InetAddress;
@@ -46,9 +47,6 @@ import org.apache.tools.ant.ProjectComponent;
* on the floor. Similarly, a host may be detected as reachable with ICMP, but not * on the floor. Similarly, a host may be detected as reachable with ICMP, but not
* reachable on other ports (i.e. port 80), because of firewalls.</p> * reachable on other ports (i.e. port 80), because of firewalls.</p>
* *
* <p>Requires Java 5+ to work properly. On Java 1.4, if a hostname
* can be resolved, the destination is assumed to be reachable.</p>
*
* @since Ant 1.7 * @since Ant 1.7
*/ */
public class IsReachable extends ProjectComponent implements Condition { public class IsReachable extends ProjectComponent implements Condition {
@@ -88,7 +86,11 @@ public class IsReachable extends ProjectComponent implements Condition {
public static final String ERROR_BAD_URL = "Bad URL "; public static final String ERROR_BAD_URL = "Bad URL ";
/** Error message when no hostname in url. */ /** Error message when no hostname in url. */
public static final String ERROR_NO_HOST_IN_URL = "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.9.14
*/
@Deprecated
public static final String METHOD_NAME = "isReachable"; public static final String METHOD_NAME = "isReachable";


/** /**
@@ -129,8 +131,6 @@ public class IsReachable extends ProjectComponent implements Condition {
return string == null || string.length() == 0; return string == null || string.length() == 0;
} }


private static Class[] parameterTypes = {Integer.TYPE};

/** /**
* Evaluate the condition. * Evaluate the condition.
* *
@@ -173,32 +173,11 @@ public class IsReachable extends ProjectComponent implements Condition {
log("Host address = " + address.getHostAddress(), log("Host address = " + address.getHostAddress(),
Project.MSG_VERBOSE); Project.MSG_VERBOSE);
boolean reachable; boolean reachable;
//Java1.5: reachable = address.isReachable(timeout * 1000);
Method reachableMethod = null;
try { try {
reachableMethod = InetAddress.class.getMethod(METHOD_NAME,
parameterTypes);
final Object[] params = new Object[1];
params[0] = new Integer(timeout * SECOND);
try {
reachable = ((Boolean) reachableMethod.invoke(address, params))
.booleanValue();
} 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); log("host is" + (reachable ? "" : " not") + " reachable", Project.MSG_VERBOSE);


Loading…
Cancel
Save