content: package net.gcdc.plugtestcms4.ping;
  
  import java.beans.PropertyChangeListener;
  import java.beans.PropertyChangeSupport;
  import java.util.HashMap;
  import java.util.Map;
  
  public class PingSettings
  {
    
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //
    // PROPERTY CHANGE SUPPORT
    //
    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    
    protected final PropertyChangeSupport pcs = new PropertyChangeSupport (this);
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //
  // PROPERTY active
  //
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  private boolean active = false;
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //
  // PROPERTY pingStatusThread
  //
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  private Thread pingStatusThread = null;
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //
  // PROPERTY pollInterval_ms
  //
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  private int pollInterval_ms = 10000;
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //
  // PROPERTY timeout_ms
  //
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  private int timeout_ms = 50;
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //
  // PROPERTY useExternalPing
  //
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  private boolean useExternalPing = false;
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //
  // PROPERTY hostAddressesToMonitor
  //
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  private String[] hostAddressesToMonitor = new String[] { };
  
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  //
  // PROPERTY hostStatus
  //
  // METHOD setHostAddressStatus
  //
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  
  private final Map<String, Boolean> hostAddressStatus = new HashMap<> ();
  
    public void addPropertyChangeListener (PropertyChangeListener listener)
    {
      this.pcs.addPropertyChangeListener (listener);
    }
  
    public void removePropertyChangeListener (PropertyChangeListener listener)
    {
      this.pcs.removePropertyChangeListener (listener);
    }
  
    
    
    public final synchronized boolean getActive ()
    {
      return this.active;
    }
    
    public final /* synchronized */ void setActive (boolean active)
    {
      boolean fireEvent = false;
      synchronized (this)
      {
        if (active != this.active)
        {
          fireEvent = true;
          if (this.pingStatusThread != null)
          {
            this.pingStatusThread.interrupt ();
            this.pingStatusThread = null;
          }
          this.active = active;
          if (this.active)
          {
            this.pingStatusThread = new PingStatusThread (this);
            this.pingStatusThread.start ();
          }
        }
      }
      if (fireEvent)
        this.pcs.firePropertyChange ("active", ! this.active, this.active);
    }
    
    public final synchronized Thread getPingStatusThread ()
    {
      return this.pingStatusThread;
    }
  
    
    public final synchronized int getPollInterval_ms ()
    {
      return this.pollInterval_ms;
    }
    
    public final synchronized void setPollInterval_ms (int pollInterval_ms)
    {
      if (pollInterval_ms < 0)
        throw new IllegalArgumentException ();
      if (pollInterval_ms != this.pollInterval_ms)
      {
        final int oldPollInterval_ms = this.pollInterval_ms;
        this.pollInterval_ms = pollInterval_ms;
        this.pcs.firePropertyChange ("pollInterval_ms", oldPollInterval_ms, this.pollInterval_ms);
      }
    }
    
    
    public final synchronized int getTimeout_ms ()
    {
      return this.timeout_ms;
    }
    
    public final synchronized void setTimeout_ms (int timeout_ms)
    {
      if (timeout_ms < 0)
        throw new IllegalArgumentException ();
      if (timeout_ms != this.timeout_ms)
      {
        final int oldTimeout_ms = this.timeout_ms;
        this.timeout_ms = timeout_ms;
        this.pcs.firePropertyChange ("timeout_ms", oldTimeout_ms, this.timeout_ms);
      }
    }
  
    
    public final boolean getUseExternalPing ()
    {
      return this.useExternalPing;
    }
    
    public final void setUseExternalPing (boolean useExternalPing)
    {
      if (useExternalPing != this.useExternalPing)
      {
        this.useExternalPing = useExternalPing;
        this.pcs.firePropertyChange ("useExternalPing", ! this.useExternalPing, this.useExternalPing);
      }
    }
    
  
    public final synchronized String[] getHostAddressesToMonitor ()
    {
      return this.hostAddressesToMonitor;
    }
  
    public final synchronized void setHostAddressesToMonitor (String[] hostAddressesToMonitor)
    {
      if (hostAddressesToMonitor == null)
        throw new IllegalArgumentException ();
      for (String hostAddressToMonitor : hostAddressesToMonitor)
        if (hostAddressToMonitor == null)
          throw new IllegalArgumentException ();
      if (hostAddressesToMonitor != this.hostAddressesToMonitor)
      {
        final String[] oldHostAddressesToMonitor = this.hostAddressesToMonitor;
        this.hostAddressesToMonitor = hostAddressesToMonitor;
        this.pcs.firePropertyChange ("hostAddressesToMonitor", oldHostAddressesToMonitor, this.hostAddressesToMonitor);
      }
    }
    
    public final synchronized PingStatus[] getHostStatus ()
    {
      final PingStatus[] hostStatus = new PingStatus[this.hostAddressesToMonitor.length];
      for (int i = 0; i < this.hostAddressesToMonitor.length; i++)
        if (! this.hostAddressStatus.containsKey (this.hostAddressesToMonitor[i]))
          hostStatus[i] = PingStatus.UNKNOWN;
        else if (this.hostAddressStatus.get (this.hostAddressesToMonitor[i]))
          hostStatus[i] = PingStatus.READY;
        else
          hostStatus[i] = PingStatus.NOT_READY;
      return hostStatus;
    }
    
    protected final /* synchronized */ void setHostAddressStatus (String hostAddress, boolean status)
    {
      if (hostAddress == null)
        return;
      boolean fireEvent;
      synchronized (this)
      {
        if (this.hostAddressStatus.containsKey (hostAddress) && this.hostAddressStatus.get (hostAddress) == status)
          return;
        fireEvent = true;
        this.hostAddressStatus.put (hostAddress, status);
      }
      if (fireEvent)
        this.pcs.firePropertyChange ("hostStatus", null, null);
    }
    
  }
  