org.apache.tools.ant.taskdefs.condition
public class: IsReachable [javadoc |
source]
java.lang.Object
org.apache.tools.ant.ProjectComponent
org.apache.tools.ant.taskdefs.condition.IsReachable
All Implemented Interfaces:
Condition, Cloneable
Test for a host being reachable using ICMP "ping" packets & echo operations.
Ping packets are very reliable for assessing reachability in a LAN or WAN,
but they do not get through any well-configured firewall. Echo (port 7) may.
This condition turns unknown host exceptions into false conditions. This is
because on a laptop, DNS is one of the first services lost when the network
goes; you are implicitly offline.
If a URL is supplied instead of a host, the hostname is extracted and used in
the test--all other parts of the URL are discarded.
The test may not work through firewalls; that is, something may be reachable
using a protocol such as HTTP, while the lower level ICMP packets get dropped
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.
Requires Java1.5+ to work properly. On Java1.4 and earlier, if a hostname
can be resolved, the destination is assumed to be reachable.
| Field Summary |
|---|
| public static final int | DEFAULT_TIMEOUT | The default timeout. |
| public static final String | ERROR_NO_HOSTNAME | Error when no hostname is defined |
| public static final String | ERROR_BAD_TIMEOUT | Error when invalid timeout value is defined |
| public static final String | ERROR_ON_NETWORK | Network error message is seen. |
| public static final String | ERROR_BOTH_TARGETS | Error message when url and host are specified. |
| public static final String | MSG_NO_REACHABLE_TEST | Error message when no reachably test avail. |
| public static final String | ERROR_BAD_URL | Error message when an invalid url is used. |
| public static final String | ERROR_NO_HOST_IN_URL | Error message when no hostname in url. |
| public static final String | METHOD_NAME | The method name to look for in InetAddress |
| Method from org.apache.tools.ant.taskdefs.condition.IsReachable Detail: |
public boolean eval() throws BuildException {
if (empty(host) && empty(url)) {
throw new BuildException(ERROR_NO_HOSTNAME);
}
if (timeout < 0) {
throw new BuildException(ERROR_BAD_TIMEOUT);
}
String target = host;
if (!empty(url)) {
if (!empty(host)) {
throw new BuildException(ERROR_BOTH_TARGETS);
}
try {
//get the host of a url
URL realURL = new URL(url);
target = realURL.getHost();
if (empty(target)) {
throw new BuildException(ERROR_NO_HOST_IN_URL + url);
}
} catch (MalformedURLException e) {
throw new BuildException(ERROR_BAD_URL + url, e);
}
}
log("Probing host " + target, Project.MSG_VERBOSE);
InetAddress address;
try {
address = InetAddress.getByName(target);
} catch (UnknownHostException e1) {
log(WARN_UNKNOWN_HOST + target);
return false;
}
log("Host address = " + address.getHostAddress(),
Project.MSG_VERBOSE);
boolean reachable;
//Java1.5: reachable = address.isReachable(timeout * 1000);
Method reachableMethod = null;
try {
reachableMethod = InetAddress.class.getMethod(METHOD_NAME,
parameterTypes);
Object[] params = new Object[1];
params[0] = new Integer(timeout * SECOND);
try {
reachable = ((Boolean) reachableMethod.invoke(address, params))
.booleanValue();
} catch (IllegalAccessException e) {
//utterly implausible, but catered for anyway
throw new BuildException("When calling " + reachableMethod);
} catch (InvocationTargetException e) {
//assume this is an IOexception about un readability
Throwable nested = e.getTargetException();
log(ERROR_ON_NETWORK + target + ": " + nested.toString());
//any kind of fault: not reachable.
reachable = false;
}
} catch (NoSuchMethodException e) {
//java1.4 or earlier
log("Not found: InetAddress." + METHOD_NAME, Project.MSG_VERBOSE);
log(MSG_NO_REACHABLE_TEST);
reachable = true;
}
log("host is" + (reachable ? "" : " not") + " reachable", Project.MSG_VERBOSE);
return reachable;
}
|
public void setHost(String host) {
this.host = host;
}
|
public void setTimeout(int timeout) {
this.timeout = timeout;
}
Set the timeout for the reachability test in seconds. |
public void setUrl(String url) {
this.url = url;
}
Set the URL from which to extract the hostname. |