// An Observable version of the LinkedQueue class.
// Barry Cornelius, 19 June 2000
import java.util. LinkedList;
import java.util. Iterator;
import java.util. List;
import java.util. Observable;
import java.util. Observer;
public class LinkedQueue extends Observable implements Queue 
{
   private List iList;
   public LinkedQueue()
   {
      iList = new LinkedList();
   }
   public synchronized void add(final Object pObject) 
   {
      iList.add(pObject);
      setChanged();
      notifyObservers("add");
   }
   public synchronized Object getFirst()
   {
      if (iList.isEmpty())
      {
         return null;
      }
      return iList.get(0);
   }
   public synchronized Object remove() 
   {
      if (iList.isEmpty())
      {
         return null;
      }
      final Object tObject = iList.remove(0);
      setChanged();
      notifyObservers("remove");
      return tObject;
   }
   public synchronized int size()
   {
      return iList.size();
   } //BJCHEREFIRST
   public synchronized boolean equals(final Object pObject)
   {
      if ( pObject==null || getClass()!=pObject.getClass() )
      {
         return false;
      }
      return iList.equals(((LinkedQueue)pObject).iList);
   }
   public synchronized int hashCode()
   {
      return 0;
   }
   public synchronized String toString()
   {
      if (iList.isEmpty())
      {
         return new String("");
      }
      final StringBuffer tStringBuffer = new StringBuffer();
      final Iterator tIterator = iList.iterator();
      while (tIterator.hasNext())
      {
         final Object tObject = tIterator.next();
         tStringBuffer.append("@" + tObject);
      }
      tStringBuffer.deleteCharAt(0);
      return tStringBuffer.toString();
   }
}
