content: package net.gcdc.plugtestcms4.ping;
  
  
  import java.io.IOException;
  import java.net.InetAddress;
  import java.util.logging.Level;
  
  public class PingStatusThread
    extends Thread
  {
  
    private final PingSettings pingSettings;
    
    public PingStatusThread (PingSettings pingSettings)
    {
      if (pingSettings == null)
        throw new IllegalArgumentException ();
      this.pingSettings = pingSettings;
    }
  
    @Override
    public void run ()
    {
      Log.LOGGER.log (Level.INFO, "PingStatusThread started: {0}.", this);
      try
      {
        boolean interrupted = false;
        while (! interrupted)
        {
          final String[] hostAddresses;
          hostAddresses = this.pingSettings.getHostAddressesToMonitor ();
          Log.LOGGER.log (Level.FINER, "PingStatusThread running: {0}, checking addresses: {1}.", new Object[] {this, hostAddresses});
          if (hostAddresses != null)
            for (String hostAddress : hostAddresses)
              if (hostAddress != null)
              {
                try
                {
                  final boolean status;
                  final int timeOut_ms = this.pingSettings.getTimeout_ms ();
                  if (this.pingSettings.getUseExternalPing ())
                  {
                    final int timeOut_s = Math.max (1, Math.round (timeOut_ms / 1000.0f));
                    final String pingCommandLine = "ping -c 1 -w " + timeOut_s + " -W " + timeOut_s + " " + hostAddress;
                    Log.LOGGER.log (Level.FINER, "Spawning ping: {0}.", pingCommandLine);
                    final Process pingProcess = Runtime.getRuntime ().exec (pingCommandLine);
                    final int pingReturnValue = pingProcess.waitFor ();
                    status = (pingReturnValue == 0);
                    Log.LOGGER.log (Level.FINER, "Ping return: {0}.", pingReturnValue);
                  }
                  else
                  {
                    final InetAddress inetAddress = InetAddress.getByName (hostAddress);
                    status = inetAddress.isReachable (timeOut_ms);
                  }
                  Log.LOGGER.log (Level.FINER, "Status {0}: {1}.", new Object[] {hostAddress, status});
                  this.pingSettings.setHostAddressStatus (hostAddress, status);
                }
                catch (IOException ioe)
                {
                  Log.LOGGER.log (Level.FINE, "IOException for host {0}.", hostAddress);
                  this.pingSettings.setHostAddressStatus (hostAddress, false);
                }
              }
          interrupted = isInterrupted ();
          if (! interrupted)
          {
            final long threadSleepTime_ms;
            if (this.pingSettings != null)
              threadSleepTime_ms = this.pingSettings.getPollInterval_ms ();
            else
              threadSleepTime_ms = 60000;
            Thread.sleep (threadSleepTime_ms);
          }
          else
            Log.LOGGER.log (Level.INFO, "PingStatusThread interrupted status set: {0}.", this); 
        }
      }
      catch (InterruptedException ie)
      {
        Log.LOGGER.log (Level.INFO, "PingStatusThread interrupted: {0}.", this);
      }
      Log.LOGGER.log (Level.INFO, "PingStatusThread stopped: {0}.", this);
    }
  
  }
  