Package com.uwyn.drone.core

Source Code of com.uwyn.drone.core.BotsRunner

/*
* Copyright 2002-2005 Uwyn bvba/sprl <info[remove] at uwyn dot com>
* Distributed under the terms of the GNU Lesser General Public
* License, v2.1 or later
*
* $Id: BotsRunner.java 1953 2005-05-25 09:45:32Z gbevin $
*/
package com.uwyn.drone.core;

import com.uwyn.drone.core.Bot;
import com.uwyn.drone.core.BotsRunnerListener;
import com.uwyn.drone.core.exceptions.CoreException;
import com.uwyn.rife.rep.Rep;
import com.uwyn.rife.tools.ExceptionUtils;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.logging.Logger;

public class BotsRunner extends Thread implements BotListener
{
  private Collection  mBots = null;
  private Object     mBotsMonitor = new Object();
 
  private Throwable  mBotError = null;
  private HashSet    mBotsRunnerListeners = null;
  private Object    mBotsRunnerListenersMonitor = new Object();
 
  public BotsRunner(Collection bots)
  {
    if (null == botsthrow new IllegalArgumentException("bots can't be null.");
   
    mBots = bots;
    mBotsRunnerListeners = new HashSet();
  }
 
  public static BotsRunner getRepInstance()
  {
    return (BotsRunner)Rep.getParticipant("com.uwyn.drone.core.DroneParticipant").getObject();
  }
 
  public Collection getBots()
  {
    return mBots;
  }
 
  public void run()
  {
    Iterator  bots_it = null;
    Bot      bot = null;
    try
    {
      bots_it = mBots.iterator();
      while (bots_it.hasNext())
      {
        bot = (Bot)bots_it.next();
       
        bot.addBotListener(this);
        bot.logon();

        // wait for bot startup
        if (null == mBotError &&
          !bot.isLoggedOn())
        {
          try
          {
            synchronized (mBotsMonitor)
            {
              mBotsMonitor.wait();
            }
          }
          catch (InterruptedException e)
          {
            // do nothing, just let other threads execute
            Thread.yield();
          }
        }
      }
     
     
      // wait for bot termination
      while (areBotsLoggedOn() &&
           !isInterrupted())
      {
        try
        {
          synchronized (mBotsMonitor)
          {
            mBotsMonitor.wait();
          }
        }
        catch (InterruptedException e)
        {
          break;
        }
      }
     
      // disconnect the bots
      bots_it = mBots.iterator();
      while (bots_it.hasNext())
      {
        bot = (Bot)bots_it.next();
        bot.disconnect();
      }
     
      fireFinished();
    }
    catch (CoreException e)
    {
      Logger.getLogger("com.uwyn.drone").severe(ExceptionUtils.getExceptionStackTrace(e));
    }
  }
 
  private boolean areBotsLoggedOn()
  {
    boolean result = false;
   
    Iterator  bots_it = mBots.iterator();
    while (bots_it.hasNext())
    {
      if (((Bot)bots_it.next()).isLoggedOn())
      {
        result = true;
        break;
      }
    }

    return result;
  }
 
  public void interrupt()
  {
    synchronized (mBotsMonitor)
    {
      super.interrupt();
     
      mBotsMonitor.notifyAll();
    }
  }
 
  public void loggedOff(Bot bot)
  {
    synchronized (mBotsMonitor)
    {
      mBotsMonitor.notifyAll();
    }
  }
 
  public void loggedOn(Bot bot)
  {
    synchronized (mBotsMonitor)
    {
      mBotsMonitor.notifyAll();
    }
  }
 
  public void nickChanged(Bot bot)
  {
  }

  public void nickInUse(Bot bot, String nick)
  {
  }

  public void connectionError(Bot bot, Throwable e)
  {
    synchronized (mBotsMonitor)
    {
      mBotError = e;
      mBotsMonitor.notifyAll();
      Logger.getLogger("com.uwyn.drone").severe(ExceptionUtils.getExceptionStackTrace(e));
    }
  }

  private void fireFinished()
  {
    Iterator  listeners = mBotsRunnerListeners.iterator();
   
    while (listeners.hasNext())
    {
      ((BotsRunnerListener)listeners.next()).finished(this);
    }
  }

  public boolean addBotsRunnerListener(BotsRunnerListener listener)
  {
    if (null == listenerthrow new IllegalArgumentException("listener can't be null.");

    boolean result = false;
   
    synchronized (mBotsRunnerListenersMonitor)
    {
      if (!mBotsRunnerListeners.contains(listener))
      {
        HashSet clone = (HashSet)mBotsRunnerListeners.clone();
        result = clone.add(listener);
        mBotsRunnerListeners = clone;
      }
      else
      {
        result = true;
      }
    }
   
    assert true == mBotsRunnerListeners.contains(listener);
   
    return result;
  }

  public boolean removeBotsRunnerListener(BotsRunnerListener listener)
  {
    if (null == listenerthrow new IllegalArgumentException("listener can't be null.");

        boolean result = false;
   
    synchronized (mBotsRunnerListenersMonitor)
    {
      HashSet clone = (HashSet)mBotsRunnerListeners.clone();
      result = clone.remove(listener);
      mBotsRunnerListeners = clone;
    }
   
    assert false == mBotsRunnerListeners.contains(listener);
   
    return result;
  }
}
TOP

Related Classes of com.uwyn.drone.core.BotsRunner

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.