FileDocCategorySizeDatePackage
IsReachable.javaAPI DocApache Ant 1.707469Wed Dec 13 06:16:24 GMT 2006org.apache.tools.ant.taskdefs.condition

IsReachable

public class IsReachable extends org.apache.tools.ant.ProjectComponent implements Condition
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.

since
Ant 1.7

Fields Summary
private static final int
SECOND
private String
host
private String
url
public static final int
DEFAULT_TIMEOUT
The default timeout.
private int
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
private static final String
WARN_UNKNOWN_HOST
Unknown host message is seen.
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
private static Class[]
parameterTypes
Constructors Summary
Methods Summary
private booleanempty(java.lang.String string)
emptyness test

param
string param to check
return
true if it is empty

        return string == null || string.length() == 0;
    
public booleaneval()
Evaluate the condition.

return
true if the condition is true.
throws
org.apache.tools.ant.BuildException if an error occurs


                                  
         
        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 voidsetHost(java.lang.String host)
Set the host to ping.

param
host the host to ping.


                    
        
        this.host = host;
    
public voidsetTimeout(int timeout)
Set the timeout for the reachability test in seconds.

param
timeout the timeout in seconds.

        this.timeout = timeout;
    
public voidsetUrl(java.lang.String url)
Set the URL from which to extract the hostname.

param
url a URL object.

        this.url = url;