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

/* Udržuje údaje o všech aktuální klientech.

  Všechny vlákna TourServerHandler používají jediný 
  objekt typu TourGroup, takže metody, které manipulují se 
  seznamem typu ArrayList tourPeople musí být synchronizován,
  zabraňujíc tak souběžným aktualizacím.

  Třída TourGroup ošetřuje:
    * přidání/odebrání údajů o klientovi
    * všesměrové vysílání, ne však původnímu odesílateli
    * metodu sendTo() pro komunikaci s jedním klientem

  Třída je velmi podobná třídě ChatGroup v multi-vláknovém diskusním serveru.
*/

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


public class TourGroup
{
  private ArrayList tourPeople;    
          // uchovává seznam objektů typu TouristInfo


  public TourGroup()
  {  tourPeople = new ArrayList();  }


  synchronized public void addmerson(String cliAddr, int port, PrintWriter out)
  {  tourPeople.add( new TouristInfo(cliAddr, port, out));  }


  synchronized public void delPerson(String cliAddr, int port, String byeMsg)
  // odebere turistu a pošle zprávu "bye" ostatním
  { TouristInfo c;
    for(int i=0; i < tourPeople.size(); i++) {
      c = (TouristInfo) tourPeople.get(i);
      if (c.matches(cliAddr, port)) {
        tourPeople.remove(i);
        broadcast(cliAddr, port, byeMsg);
        break;
      }
    }
  }  // konec metody: delPerson()


  synchronized public void broadcast(String cliAddr, int port, String msg)
  // rozešle všem zprávu msg, kromě odesílatele
  {
    TouristInfo c;
    for(int i=0; i < tourPeople.size(); i++) {
      c = (TouristInfo) tourPeople.get(i);
      if (!c.matches(cliAddr, port))
        c.sendMessage(msg);
    }
  }  // konec metody: broadcast()



  synchronized public void sendTo(String cliAddr, int port, String msg)
  // send odešle zprávu msg jedinému příjemnic cliAddr/port
  { TouristInfo c;
    for(int i=0; i < tourPeople.size(); i++) {
      c = (TouristInfo) tourPeople.get(i);
      if (c.matches(cliAddr, port)) {
        c.sendMessage(msg);
        break;
      }
    }
  }  // konec metody: sendTo()


}  // konec třídy: TourGroup
