
// ChatGroup.java
// Andrew Davison, April 2005, ad@fivedots.coe.psu.ac.th

/* Spravuje údaje o všech aktuálně připojených klientech.

  Všechna vlákna ChatServerHandler používají jediný objekt 
  typu ChatGroup, takže metody, které manipulují se seznamem
  typu ArrayList chatPeople musí být synchronizovány,
  aby se zabránilo souběžnému přístupu.

  Třída ChatGroup obsluhuje přidání/odebrání údajů o klientech,
  odpovědi na zprávy "who" a rozesílání příspěvků všem klientům.  
*/

import java.io.*;
import java.util.*;


public class ChatGroup
{
  private ArrayList chatPeople;  // uchovává seznam objektů typu Chatter

  public ChatGroup()
  {  chatPeople = new ArrayList();  }


  synchronized public void addmerson(String cliAddr, int port, PrintWriter out)
  // do seznamu přidá nový objekt typu Chatter
  { chatPeople.add( new Chatter(cliAddr, port, out));  
    broadcast("Vítáme nového člena ("+cliAddr+", "+port+")");
  }


  synchronized public void delPerson(String cliAddr, int port)
  // odebere objekt typu Chatter pro danou osobu
  { Chatter c;
    for(int i=0; i < chatPeople.size(); i++) {
      c = (Chatter) chatPeople.get(i);
      if (c.matches(cliAddr, port)) {
        chatPeople.remove(i);
        broadcast("("+cliAddr+", "+port+") has departed");
        break;
      }
    }
  }  // konec metody: delPerson()


  synchronized public void broadcast(String msg)
  /* Pošle zprávu msg všech klientům, včetně původního odesílatele. */
  {
    Chatter c;
    for(int i=0; i < chatPeople.size(); i++) {
      c = (Chatter) chatPeople.get(i);
      c.sendMessage(msg);
    }
  }  // konec metody: broadcast()


  synchronized public String who()
  /*  Vrátí řetězec s aktuálně přihlášenými uživateli ve tvaru:
        "WHO$$ cliAddr1 & port1 & ... cliAddrN & portN & "
  */
  { Chatter c;
    String whoList = "WHO$$ ";
    for(int i=0; i < chatPeople.size(); i++) {
      c = (Chatter) chatPeople.get(i);
      whoList += c.toString();
    }
    return whoList;
  }  // konec metody: who()

}  // konec třídy: ChatGroup
