diff -r 000000000000 -r 8238cdb4113a java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ejb/ChatEJB.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ejb/ChatEJB.java Wed Jun 30 00:26:14 2010 +0200 @@ -0,0 +1,105 @@ +package cz.frantovo.nekurak.ejb; + +import cz.frantovo.nekurak.chat.MistnostPripojena; +import cz.frantovo.nekurak.chat.Nastaveni; +import cz.frantovo.nekurak.chat.Spojeni; +import cz.frantovo.nekurak.chat.SpravceNastaveni; +import cz.frantovo.nekurak.chat.UcetRobota; +import cz.frantovo.nekurak.dto.ZpravaChatu; +import cz.frantovo.nekurak.vyjimky.NekurakVyjimka; +import java.util.ArrayList; +import java.util.Collection; +import java.util.logging.Level; +import java.util.logging.Logger; +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import javax.ejb.Singleton; +import javax.ejb.Startup; +import javax.naming.NamingException; + +/** + * + * @author fiki + */ +@Singleton +@Startup +public class ChatEJB implements ChatRemote { + + private static final Logger log = Logger.getLogger(ChatRemote.class.getSimpleName()); + private Nastaveni nastaveni; + private Collection spojeni = new ArrayList(); + + @Override + public void posliZpravu(String mistnost, String prezdivka, String zprava) throws NekurakVyjimka { + MistnostPripojena mp = najdiMistnost(mistnost); + if (mp == null) { + throw new NekurakVyjimka("Místnost s tímto názvem neexistuje", null); + } else { + try { + mp.posliZpravu(new ZpravaChatu(prezdivka, zprava)); + } catch (Exception e) { + log.log(Level.SEVERE, "Selhalo odesílání zprávy", e); + throw new NekurakVyjimka("Zprávu se nepodařilo odeslat.", e); + } + } + } + + /** + * @param mistnost název místnosti včetně zavináče a serveru + * @param poradoveCislo pořadové číslo poslední zprávy, kterou jsme dostali + * @return všechny novější zprávy než dané pořadové číslo + * @throws NekurakVyjimka + */ + @Override + public Collection getZpravy(String mistnost, int poradoveCislo) throws NekurakVyjimka { + MistnostPripojena mp = najdiMistnost(mistnost); + if (mp == null) { + throw new NekurakVyjimka("Místnost s tímto názvem neexistuje", null); + } else { + return mp.getZpravy(poradoveCislo); + } + } + + public ChatEJB() throws NekurakVyjimka { + /** TODO: vyřešit lépe. */ + nastaveni = new SpravceNastaveni().getNastaveni(); + } + + @PreDestroy + public void odpoj() { + for (Spojeni s : spojeni) { + s.odpoj(); + } + } + + @PostConstruct + public void inicializuj() throws NekurakVyjimka, NamingException { + pripojXMPP(); + } + + private void pripojXMPP() throws NekurakVyjimka { + try { + for (UcetRobota u : nastaveni.getUctyRobota()) { + Spojeni s = new Spojeni(u); + spojeni.add(s); + } + } catch (Exception e) { + throw new NekurakVyjimka("Chyba při připojování.", e); + } + } + + /** + * @param nazev Název místnosti, kterou hledáme. + * @return nalezená místnost, nebo null, pokud místnost nebyla nalezena. + */ + private MistnostPripojena najdiMistnost(String nazev) { + for (Spojeni s : spojeni) { + for (MistnostPripojena mp : s.getMistnosti()) { + if (mp.porovnejNazev(nazev)) { + return mp; + } + } + } + return null; + } +}