java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ejb/ChatEJB.java
author František Kučera <franta-hg@frantovo.cz>
Wed Jun 30 00:26:14 2010 +0200 (2010-06-30)
changeset 149 8238cdb4113a
child 153 c84a3e3c8a46
permissions -rw-r--r--
XMPP chat – první verze.
     1 package cz.frantovo.nekurak.ejb;
     2 
     3 import cz.frantovo.nekurak.chat.MistnostPripojena;
     4 import cz.frantovo.nekurak.chat.Nastaveni;
     5 import cz.frantovo.nekurak.chat.Spojeni;
     6 import cz.frantovo.nekurak.chat.SpravceNastaveni;
     7 import cz.frantovo.nekurak.chat.UcetRobota;
     8 import cz.frantovo.nekurak.dto.ZpravaChatu;
     9 import cz.frantovo.nekurak.vyjimky.NekurakVyjimka;
    10 import java.util.ArrayList;
    11 import java.util.Collection;
    12 import java.util.logging.Level;
    13 import java.util.logging.Logger;
    14 import javax.annotation.PostConstruct;
    15 import javax.annotation.PreDestroy;
    16 import javax.ejb.Singleton;
    17 import javax.ejb.Startup;
    18 import javax.naming.NamingException;
    19 
    20 /**
    21  *
    22  * @author fiki
    23  */
    24 @Singleton
    25 @Startup
    26 public class ChatEJB implements ChatRemote {
    27 
    28 	private static final Logger log = Logger.getLogger(ChatRemote.class.getSimpleName());
    29 	private Nastaveni nastaveni;
    30 	private Collection<Spojeni> spojeni = new ArrayList<Spojeni>();
    31 
    32 	@Override
    33 	public void posliZpravu(String mistnost, String prezdivka, String zprava) throws NekurakVyjimka {
    34 		MistnostPripojena mp = najdiMistnost(mistnost);
    35 		if (mp == null) {
    36 			throw new NekurakVyjimka("Místnost s tímto názvem neexistuje", null);
    37 		} else {
    38 			try {
    39 				mp.posliZpravu(new ZpravaChatu(prezdivka, zprava));
    40 			} catch (Exception e) {
    41 				log.log(Level.SEVERE, "Selhalo odesílání zprávy", e);
    42 				throw new NekurakVyjimka("Zprávu se nepodařilo odeslat.", e);
    43 			}
    44 		}
    45 	}
    46 
    47 	/**
    48 	 * @param mistnost název místnosti včetně zavináče a serveru
    49 	 * @param poradoveCislo pořadové číslo poslední zprávy, kterou jsme dostali
    50 	 * @return všechny novější zprávy než dané pořadové číslo
    51 	 * @throws NekurakVyjimka
    52 	 */
    53 	@Override
    54 	public Collection<ZpravaChatu> getZpravy(String mistnost, int poradoveCislo) throws NekurakVyjimka {
    55 		MistnostPripojena mp = najdiMistnost(mistnost);
    56 		if (mp == null) {
    57 			throw new NekurakVyjimka("Místnost s tímto názvem neexistuje", null);
    58 		} else {
    59 			return mp.getZpravy(poradoveCislo);
    60 		}
    61 	}
    62 
    63 	public ChatEJB() throws NekurakVyjimka {
    64 		/** TODO: vyřešit lépe. */
    65 		nastaveni = new SpravceNastaveni().getNastaveni();
    66 	}
    67 
    68 	@PreDestroy
    69 	public void odpoj() {
    70 		for (Spojeni s : spojeni) {
    71 			s.odpoj();
    72 		}
    73 	}
    74 
    75 	@PostConstruct
    76 	public void inicializuj() throws NekurakVyjimka, NamingException {
    77 		pripojXMPP();
    78 	}
    79 
    80 	private void pripojXMPP() throws NekurakVyjimka {
    81 		try {
    82 			for (UcetRobota u : nastaveni.getUctyRobota()) {
    83 				Spojeni s = new Spojeni(u);
    84 				spojeni.add(s);
    85 			}
    86 		} catch (Exception e) {
    87 			throw new NekurakVyjimka("Chyba při připojování.", e);
    88 		}
    89 	}
    90 
    91 	/**
    92 	 * @param nazev Název místnosti, kterou hledáme.
    93 	 * @return nalezená místnost, nebo null, pokud místnost nebyla nalezena.
    94 	 */
    95 	private MistnostPripojena najdiMistnost(String nazev) {
    96 		for (Spojeni s : spojeni) {
    97 			for (MistnostPripojena mp : s.getMistnosti()) {
    98 				if (mp.porovnejNazev(nazev)) {
    99 					return mp;
   100 				}
   101 			}
   102 		}
   103 		return null;
   104 	}
   105 }