java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ejb/ChatEJB.java
changeset 149 8238cdb4113a
child 153 c84a3e3c8a46
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ejb/ChatEJB.java	Wed Jun 30 00:26:14 2010 +0200
     1.3 @@ -0,0 +1,105 @@
     1.4 +package cz.frantovo.nekurak.ejb;
     1.5 +
     1.6 +import cz.frantovo.nekurak.chat.MistnostPripojena;
     1.7 +import cz.frantovo.nekurak.chat.Nastaveni;
     1.8 +import cz.frantovo.nekurak.chat.Spojeni;
     1.9 +import cz.frantovo.nekurak.chat.SpravceNastaveni;
    1.10 +import cz.frantovo.nekurak.chat.UcetRobota;
    1.11 +import cz.frantovo.nekurak.dto.ZpravaChatu;
    1.12 +import cz.frantovo.nekurak.vyjimky.NekurakVyjimka;
    1.13 +import java.util.ArrayList;
    1.14 +import java.util.Collection;
    1.15 +import java.util.logging.Level;
    1.16 +import java.util.logging.Logger;
    1.17 +import javax.annotation.PostConstruct;
    1.18 +import javax.annotation.PreDestroy;
    1.19 +import javax.ejb.Singleton;
    1.20 +import javax.ejb.Startup;
    1.21 +import javax.naming.NamingException;
    1.22 +
    1.23 +/**
    1.24 + *
    1.25 + * @author fiki
    1.26 + */
    1.27 +@Singleton
    1.28 +@Startup
    1.29 +public class ChatEJB implements ChatRemote {
    1.30 +
    1.31 +	private static final Logger log = Logger.getLogger(ChatRemote.class.getSimpleName());
    1.32 +	private Nastaveni nastaveni;
    1.33 +	private Collection<Spojeni> spojeni = new ArrayList<Spojeni>();
    1.34 +
    1.35 +	@Override
    1.36 +	public void posliZpravu(String mistnost, String prezdivka, String zprava) throws NekurakVyjimka {
    1.37 +		MistnostPripojena mp = najdiMistnost(mistnost);
    1.38 +		if (mp == null) {
    1.39 +			throw new NekurakVyjimka("Místnost s tímto názvem neexistuje", null);
    1.40 +		} else {
    1.41 +			try {
    1.42 +				mp.posliZpravu(new ZpravaChatu(prezdivka, zprava));
    1.43 +			} catch (Exception e) {
    1.44 +				log.log(Level.SEVERE, "Selhalo odesílání zprávy", e);
    1.45 +				throw new NekurakVyjimka("Zprávu se nepodařilo odeslat.", e);
    1.46 +			}
    1.47 +		}
    1.48 +	}
    1.49 +
    1.50 +	/**
    1.51 +	 * @param mistnost název místnosti včetně zavináče a serveru
    1.52 +	 * @param poradoveCislo pořadové číslo poslední zprávy, kterou jsme dostali
    1.53 +	 * @return všechny novější zprávy než dané pořadové číslo
    1.54 +	 * @throws NekurakVyjimka
    1.55 +	 */
    1.56 +	@Override
    1.57 +	public Collection<ZpravaChatu> getZpravy(String mistnost, int poradoveCislo) throws NekurakVyjimka {
    1.58 +		MistnostPripojena mp = najdiMistnost(mistnost);
    1.59 +		if (mp == null) {
    1.60 +			throw new NekurakVyjimka("Místnost s tímto názvem neexistuje", null);
    1.61 +		} else {
    1.62 +			return mp.getZpravy(poradoveCislo);
    1.63 +		}
    1.64 +	}
    1.65 +
    1.66 +	public ChatEJB() throws NekurakVyjimka {
    1.67 +		/** TODO: vyřešit lépe. */
    1.68 +		nastaveni = new SpravceNastaveni().getNastaveni();
    1.69 +	}
    1.70 +
    1.71 +	@PreDestroy
    1.72 +	public void odpoj() {
    1.73 +		for (Spojeni s : spojeni) {
    1.74 +			s.odpoj();
    1.75 +		}
    1.76 +	}
    1.77 +
    1.78 +	@PostConstruct
    1.79 +	public void inicializuj() throws NekurakVyjimka, NamingException {
    1.80 +		pripojXMPP();
    1.81 +	}
    1.82 +
    1.83 +	private void pripojXMPP() throws NekurakVyjimka {
    1.84 +		try {
    1.85 +			for (UcetRobota u : nastaveni.getUctyRobota()) {
    1.86 +				Spojeni s = new Spojeni(u);
    1.87 +				spojeni.add(s);
    1.88 +			}
    1.89 +		} catch (Exception e) {
    1.90 +			throw new NekurakVyjimka("Chyba při připojování.", e);
    1.91 +		}
    1.92 +	}
    1.93 +
    1.94 +	/**
    1.95 +	 * @param nazev Název místnosti, kterou hledáme.
    1.96 +	 * @return nalezená místnost, nebo null, pokud místnost nebyla nalezena.
    1.97 +	 */
    1.98 +	private MistnostPripojena najdiMistnost(String nazev) {
    1.99 +		for (Spojeni s : spojeni) {
   1.100 +			for (MistnostPripojena mp : s.getMistnosti()) {
   1.101 +				if (mp.porovnejNazev(nazev)) {
   1.102 +					return mp;
   1.103 +				}
   1.104 +			}
   1.105 +		}
   1.106 +		return null;
   1.107 +	}
   1.108 +}