# HG changeset patch # User František Kučera # Date 1277850374 -7200 # Node ID 8238cdb4113a09760e284178ab3b1f67891ff68d # Parent 784b3945c440b94ebadbeab838ac8bff608e997b XMPP chat – první verze. diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-ejb/nbproject/build-impl.xml --- a/java/nekurak.net-ejb/nbproject/build-impl.xml Sun Jun 27 22:00:48 2010 +0200 +++ b/java/nekurak.net-ejb/nbproject/build-impl.xml Wed Jun 30 00:26:14 2010 +0200 @@ -456,10 +456,12 @@ + + diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-ejb/nbproject/genfiles.properties --- a/java/nekurak.net-ejb/nbproject/genfiles.properties Sun Jun 27 22:00:48 2010 +0200 +++ b/java/nekurak.net-ejb/nbproject/genfiles.properties Wed Jun 30 00:26:14 2010 +0200 @@ -1,8 +1,8 @@ -build.xml.data.CRC32=764630c8 +build.xml.data.CRC32=70881d3e build.xml.script.CRC32=d7a2a0ed build.xml.stylesheet.CRC32=5910fda3@1.22.1 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=764630c8 -nbproject/build-impl.xml.script.CRC32=43ab1f1c +nbproject/build-impl.xml.data.CRC32=70881d3e +nbproject/build-impl.xml.script.CRC32=c3b61fed nbproject/build-impl.xml.stylesheet.CRC32=986a5256@1.22.1 diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-ejb/nbproject/project.properties --- a/java/nekurak.net-ejb/nbproject/project.properties Sun Jun 27 22:00:48 2010 +0200 +++ b/java/nekurak.net-ejb/nbproject/project.properties Wed Jun 30 00:26:14 2010 +0200 @@ -35,7 +35,8 @@ jar.name=nekurak.net-ejb.jar javac.classpath=\ ${reference.nekurak_net-lib.jar}:\ - ${reference.SuperDAO.jar} + ${reference.SuperDAO.jar}:\ + ${libs.Smack-XMPP.classpath} javac.debug=true javac.deprecation=false javac.processorpath=${javac.classpath} diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-ejb/nbproject/project.xml --- a/java/nekurak.net-ejb/nbproject/project.xml Sun Jun 27 22:00:48 2010 +0200 +++ b/java/nekurak.net-ejb/nbproject/project.xml Wed Jun 30 00:26:14 2010 +0200 @@ -7,6 +7,7 @@ 1.6.5 reference.nekurak_net-lib.jar reference.SuperDAO.jar + libs.Smack-XMPP.classpath diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/Mistnost.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/Mistnost.java Wed Jun 30 00:26:14 2010 +0200 @@ -0,0 +1,77 @@ +package cz.frantovo.nekurak.chat; + +/** + * Diskusní (chatovací) místnost, do které robot vstupuje. + * @author fiki + */ +public class Mistnost { + + /** Část před zavináčem */ + private String nazev; + /** Část za zavináčem */ + private String domena; + /** Robotova přezdívka v této místnosti */ + private String prezdivka; + /** Co robot napíše po vstupu do místnosti */ + private String uvitaciZprava; + /** Co robot napíše před opuštěním místnosti */ + private String louciciZprava; + /** Délka fronty zpráv – historie */ + private int delkaFronty = 10; + + public String getNazev() { + return nazev; + } + + public void setNazev(String nazev) { + this.nazev = nazev; + } + + public String getDomena() { + return domena; + } + + /** + * Celý název místnosti. + * Např. lobby@konference.frantovo.cz + */ + public String getMuc() { + return nazev + "@" + domena; + } + + public void setDomena(String domena) { + this.domena = domena; + } + + public String getUvitaciZprava() { + return uvitaciZprava; + } + + public void setUvitaciZprava(String uvitaciZprava) { + this.uvitaciZprava = uvitaciZprava; + } + + public String getPrezdivka() { + return prezdivka; + } + + public void setPrezdivka(String prezdivka) { + this.prezdivka = prezdivka; + } + + public String getLouciciZprava() { + return louciciZprava; + } + + public void setLouciciZprava(String louciciZprava) { + this.louciciZprava = louciciZprava; + } + + public int getDelkaFronty() { + return delkaFronty; + } + + public void setDelkaFronty(int delkaFronty) { + this.delkaFronty = delkaFronty; + } +} diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/MistnostPripojena.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/MistnostPripojena.java Wed Jun 30 00:26:14 2010 +0200 @@ -0,0 +1,112 @@ +package cz.frantovo.nekurak.chat; + +import cz.frantovo.nekurak.dto.ZpravaChatu; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedList; +import org.jivesoftware.smack.PacketListener; +import org.jivesoftware.smack.XMPPException; +import org.jivesoftware.smack.packet.Message; +import org.jivesoftware.smack.packet.Packet; +import org.jivesoftware.smack.util.StringUtils; +import org.jivesoftware.smackx.muc.MultiUserChat; + +/** + * + * @author fiki + */ +public class MistnostPripojena implements PacketListener { + + private final MultiUserChat muc; + private final Mistnost nastaveni; + private final LinkedList fronta = new LinkedList(); + private final String mojePrezdivka; + /** Zatím nejvyšší pořadové číslo – poradoveCislo. */ + private int pocitadloZprav = 0; + + public MistnostPripojena(Mistnost mistnost, Spojeni spojeni) throws XMPPException { + nastaveni = mistnost; + mojePrezdivka = mistnost.getPrezdivka(); + muc = new MultiUserChat(spojeni.getSpojeni(), mistnost.getMuc()); + muc.join(mistnost.getPrezdivka()); + + if (mistnost.getUvitaciZprava() != null) { + muc.sendMessage(mistnost.getUvitaciZprava()); + } + + muc.addMessageListener(this); + } + + public void processPacket(Packet packet) { + if (packet instanceof Message) { + Message m = (Message) packet; + String od = StringUtils.parseResource(m.getFrom()); + String text = m.getBody(); + + /** Vydolujeme jméno z anonymně (námi) poslaných zpráv */ + boolean overenyUzivatel = true; + if (mojePrezdivka.equals(od) && text.contains(":")) { + od = text.split(":")[0]; + text = text.substring(od.length() + 2); + overenyUzivatel = false; + } + + /** Přidáme zprávu do fronty historie. */ + ZpravaChatu z = new ZpravaChatu(od, text, overenyUzivatel, dalsiPoradoveCislo()); + pridejZpravu(z); + + /** TODO: zpracovávat další události – příkazy atd. */ + } + } + + /** + * @param z Zpráva, která se má přidat do fronty (historie). + */ + private void pridejZpravu(ZpravaChatu z) { + fronta.add(z); + + while (fronta.size() > nastaveni.getDelkaFronty()) { + fronta.removeFirst(); + } + } + + public void posliZpravu(ZpravaChatu zprava) throws XMPPException { + muc.sendMessage(zprava.toString()); + } + + public void odejdi() throws XMPPException { + if (nastaveni.getLouciciZprava() != null) { + muc.sendMessage(nastaveni.getLouciciZprava()); + } + muc.leave(); + } + + /** + * @param nazev název místnosti (něco@moje.doména) + * @return true, pokud se jedná o místnost s tímto názvem + */ + public boolean porovnejNazev(String nazev) { + return nazev.equals(nastaveni.getMuc()); + + } + + public Collection getZpravy(int poradoveCislo) { + /** + * TODO: + * http://stackoverflow.com/questions/122105/java-what-is-the-best-way-to-filter-a-collection + * http://www.javaworld.com/javaworld/jw-10-2004/jw-1018-filter.html + */ + Collection vysledek = new ArrayList(); + for (ZpravaChatu z : fronta) { + if (z.getPoradoveCislo() > poradoveCislo) { + vysledek.add(z); + } + } + return vysledek; + } + + private int dalsiPoradoveCislo() { + pocitadloZprav++; + return pocitadloZprav; + } +} diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/Nastaveni.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/Nastaveni.java Wed Jun 30 00:26:14 2010 +0200 @@ -0,0 +1,22 @@ +package cz.frantovo.nekurak.chat; + +import java.util.ArrayList; +import java.util.Collection; + +/** + * Nastavení serveru, singletonu, typicky jen jedno v celém systému. + * Můžeme uchovávat jejich starší verze. + * @author fiki + */ +public class Nastaveni { + + private Collection uctyRobota = new ArrayList(); + + public Collection getUctyRobota() { + return uctyRobota; + } + + public void setUctyRobota(Collection uctyRobota) { + this.uctyRobota = uctyRobota; + } +} diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/Spojeni.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/Spojeni.java Wed Jun 30 00:26:14 2010 +0200 @@ -0,0 +1,56 @@ +package cz.frantovo.nekurak.chat; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.logging.Level; +import java.util.logging.Logger; +import org.jivesoftware.smack.ConnectionConfiguration; +import org.jivesoftware.smack.XMPPConnection; +import org.jivesoftware.smack.XMPPException; + +/** + * + * @author fiki + */ +public class Spojeni { + + private XMPPConnection spojeni; + private Collection mistnosti = new ArrayList(); + private static final Logger log = Logger.getLogger(Spojeni.class.getSimpleName()); + + public Spojeni(UcetRobota ucet) throws XMPPException { + /** Navážeme spojení */ + ConnectionConfiguration nastaveni = new ConnectionConfiguration(ucet.getAdresaServeru(), ucet.getPort(), ucet.getDomena()); + spojeni = new XMPPConnection(nastaveni); + spojeni.connect(); + spojeni.login(ucet.getUzivatelskeJmeno(), ucet.getUzivatelskeHeslo(), ucet.getProstredek()); + + /** Vstoupíme do místností */ + for (Mistnost m : ucet.getMistnosti()) { + MistnostPripojena mp = new MistnostPripojena(m, this); + mistnosti.add(mp); + } + } + + public void odpoj() { + /** Rozloučíme se ve všech místnostech */ + try { + for (MistnostPripojena mp : mistnosti) { + mp.odejdi(); + } + } catch (Exception e) { + log.log(Level.WARNING, "Nepodařilo se odejít z místnosti před ukončením spojení.", e); + } + + /** Ukončíme spojení */ + spojeni.disconnect(); + } + + public XMPPConnection getSpojeni() { + return spojeni; + } + + public Collection getMistnosti() { + return mistnosti; + } +} diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/SpravceNastaveni.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/SpravceNastaveni.java Wed Jun 30 00:26:14 2010 +0200 @@ -0,0 +1,31 @@ +package cz.frantovo.nekurak.chat; + +/** + * + * @author fiki + */ +public class SpravceNastaveni { + + public Nastaveni getNastaveni() { + Nastaveni n = new Nastaveni(); + + UcetRobota u = new UcetRobota(); + u.setUzivatelskeJmeno("nekurakrobot"); + u.setUzivatelskeHeslo("nekurak"); + u.setDomena("frantovo.cz"); + u.setAdresaServeru("ipv6.frantovo.cz"); + + n.getUctyRobota().add(u); + + Mistnost m = new Mistnost(); + m.setNazev("nekurak"); + m.setDomena("konference.frantovo.cz"); + m.setPrezdivka("WeboRobot"); + m.setUvitaciZprava("Ahoj, tak jsem tady!"); + m.setLouciciZprava("Mějte se tu hezky!"); + + u.getMistnosti().add(m); + + return n; + } +} diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/UcetRobota.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/UcetRobota.java Wed Jun 30 00:26:14 2010 +0200 @@ -0,0 +1,97 @@ +package cz.frantovo.nekurak.chat; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * Definice jabberovského účtu, který používá robot k připojení. + * @author fiki + */ +public class UcetRobota { + + /** Seznam diskusních místností, do kterých robot vstoupí */ + private Collection mistnosti = new ArrayList(); + /** Doména – jabber server, ke kterému se připojí */ + private String domena; + /** Pokud má být jiná než doména */ + private String adresaServeru; + /** TCP port pro připojení */ + private int port = 5222; + /** Jméno robota */ + private String uzivatelskeJmeno; + /** Heslo robota */ + private String uzivatelskeHeslo; + /** Prostředek (resource) tzn. část JID za lomítkem */ + private String prostredek = "robot"; + + private static final Logger log = Logger.getLogger(UcetRobota.class.getSimpleName()); + + public UcetRobota() { + try { + /** aby nedocházelo ke konfliktům, když aplikaci nasadíme na víc serverů současně */ + prostredek = InetAddress.getLocalHost().getHostName(); + } catch (UnknownHostException e) { + log.log(Level.SEVERE, "Nepodařilo se zjistit místní „hostname“", e); + } + } + + public Collection getMistnosti() { + return mistnosti; + } + + public void setMistnosti(Collection mistnosti) { + this.mistnosti = mistnosti; + } + + public String getDomena() { + return domena; + } + + public void setDomena(String domena) { + this.domena = domena; + } + + public String getAdresaServeru() { + return adresaServeru; + } + + public void setAdresaServeru(String adresaServeru) { + this.adresaServeru = adresaServeru; + } + + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + + public String getUzivatelskeJmeno() { + return uzivatelskeJmeno; + } + + public void setUzivatelskeJmeno(String uzivatelskeJmeno) { + this.uzivatelskeJmeno = uzivatelskeJmeno; + } + + public String getUzivatelskeHeslo() { + return uzivatelskeHeslo; + } + + public void setUzivatelskeHeslo(String uzivatelskeHeslo) { + this.uzivatelskeHeslo = uzivatelskeHeslo; + } + + public String getProstredek() { + return prostredek; + } + + public void setProstredek(String prostredek) { + this.prostredek = prostredek; + } +} diff -r 784b3945c440 -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; + } +} diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-lib/src/cz/frantovo/nekurak/dto/ZpravaChatu.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/dto/ZpravaChatu.java Wed Jun 30 00:26:14 2010 +0200 @@ -0,0 +1,76 @@ +package cz.frantovo.nekurak.dto; + +import java.util.Date; + +/** + * + * @author fiki + */ +public class ZpravaChatu { + + private String od; + private Date kdy = new Date(); + private String text; + private boolean overenyUzivatel; + private int poradoveCislo; + + public ZpravaChatu(String od, String text) { + this.od = od; + this.text = text; + } + + public ZpravaChatu(String od, String text, boolean overenyUzivatel, int poradoveCislo) { + this.od = od; + this.text = text; + this.overenyUzivatel = overenyUzivatel; + this.poradoveCislo = poradoveCislo; + } + + public String getOd() { + return od; + } + + public String getText() { + return text; + } + + public Date getKdy() { + return kdy; + } + + /** + * @return true, pokud zprávu odeslal přihlášený uživatel (normálně přes jabber). + * False, pokud zprávu odeslal nějaký anonym jen přes web. + */ + public boolean isOverenyUzivatel() { + return overenyUzivatel; + } + + /** + * @param overenyUzivatel true, pokud zprávu odeslal přihlášený uživatel (normálně přes jabber). + * False, pokud zprávu odeslal nějaký anonym jen přes web. + */ + public void setOverenyUzivatel(boolean overenyUzivatel) { + this.overenyUzivatel = overenyUzivatel; + } + + /** + * @return Text zprávy – případně včetně přezdívky autora. + */ + @Override + public String toString() { + if (od == null) { + return text; + } else { + return od + ": " + text; + } + } + + public int getPoradoveCislo() { + return poradoveCislo; + } + + public void setPoradoveCislo(int poradoveCislo) { + this.poradoveCislo = poradoveCislo; + } +} diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-lib/src/cz/frantovo/nekurak/ejb/ChatRemote.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/ejb/ChatRemote.java Wed Jun 30 00:26:14 2010 +0200 @@ -0,0 +1,15 @@ +package cz.frantovo.nekurak.ejb; + +import cz.frantovo.nekurak.dto.ZpravaChatu; +import cz.frantovo.nekurak.vyjimky.NekurakVyjimka; +import java.util.Collection; +import javax.ejb.Remote; + +@Remote +public interface ChatRemote { + + void posliZpravu(String mistnost, String prezdivka, String zprava) throws NekurakVyjimka; + + public Collection getZpravy(String mistnost, int poradoveCislo) throws NekurakVyjimka; + +} diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-lib/src/cz/frantovo/nekurak/preklady_cs.properties --- a/java/nekurak.net-lib/src/cz/frantovo/nekurak/preklady_cs.properties Sun Jun 27 22:00:48 2010 +0200 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/preklady_cs.properties Wed Jun 30 00:26:14 2010 +0200 @@ -106,3 +106,6 @@ komentar.typ.texy=Texy form\u00e1tovan\u00fd text komentar.nejdeZobrazit=Tento koment\u00e1\u0159 bohu\u017eel nelze z technick\u00fdch d\u016fvod\u016f zobrazit. +chat.nadpis=Chat +chat.anonym=Kolemjdouc\u00ed +chat.tlacitkoOdeslat=Odeslat diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-lib/src/cz/frantovo/nekurak/web/HledacSluzby.java --- a/java/nekurak.net-lib/src/cz/frantovo/nekurak/web/HledacSluzby.java Sun Jun 27 22:00:48 2010 +0200 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/web/HledacSluzby.java Wed Jun 30 00:26:14 2010 +0200 @@ -1,5 +1,6 @@ package cz.frantovo.nekurak.web; +import cz.frantovo.nekurak.ejb.ChatRemote; import cz.frantovo.nekurak.ejb.ClanekRemote; import cz.frantovo.nekurak.ejb.PodnikRemote; import cz.frantovo.nekurak.ejb.UzivatelRemote; @@ -19,6 +20,7 @@ private PodnikRemote podnikEJB; private UzivatelRemote uzivatelEJB; private ClanekRemote clanekEJB; + private ChatRemote chatEJB; private static final Logger log = Logger.getLogger(HledacSluzby.class.getSimpleName()); public PodnikRemote getPodnikEJB() { @@ -59,4 +61,17 @@ } return clanekEJB; } + + public ChatRemote getChatEJB() { + if (chatEJB == null) { + try { + Context c = new InitialContext(); + chatEJB = (ChatRemote) c.lookup("cz.frantovo.nekurak.ejb.ChatRemote"); + } catch (NamingException e) { + log.log(Level.SEVERE, "Chyba při hledání ChatRemote", e); + throw new RuntimeException(e); + } + } + return chatEJB; + } } diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-rest/nbproject/project.properties --- a/java/nekurak.net-rest/nbproject/project.properties Sun Jun 27 22:00:48 2010 +0200 +++ b/java/nekurak.net-rest/nbproject/project.properties Wed Jun 30 00:26:14 2010 +0200 @@ -29,7 +29,7 @@ includes=** j2ee.deploy.on.save=false j2ee.platform=1.6-web -j2ee.platform.classpath= +j2ee.platform.classpath=${j2ee.server.home}/modules/javax.servlet.jar:${j2ee.server.home}/modules/jstl-impl.jar:${j2ee.server.home}/modules/javax.ejb.jar:${j2ee.server.home}/modules/javax.enterprise.deploy.jar:${j2ee.server.home}/modules/javax.security.jacc.jar:${j2ee.server.home}/modules/bean-validator.jar:${j2ee.server.home}/modules/javax.transaction.jar:${j2ee.server.home}/modules/jsr311-api.jar:${j2ee.server.home}/modules/jsf-api.jar:${j2ee.server.home}/modules/javax.security.auth.message.jar:${j2ee.server.home}/modules/javax.servlet.jsp.jar:${j2ee.server.home}/modules/endorsed/javax.annotation.jar:${j2ee.server.home}/modules/javax.management.j2ee.jar:${j2ee.server.home}/modules/endorsed/webservices-api-osgi.jar:${j2ee.server.home}/modules/endorsed/jaxb-api-osgi.jar:${j2ee.server.home}/modules/javax.jms.jar:${j2ee.server.home}/modules/javax.persistence.jar:${j2ee.server.home}/modules/javax.servlet.jsp.jstl.jar:${j2ee.server.home}/modules/javax.resource.jar:${j2ee.server.home}/modules/weld-osgi-bundle.jar:${j2ee.server.home}/modules/jsf-impl.jar:${j2ee.server.home}/modules/mail.jar j2ee.platform.embeddableejb.classpath=${j2ee.server.home}/lib/embedded/glassfish-embedded-static-shell.jar j2ee.platform.wscompile.classpath=${j2ee.server.home}/modules/webservices-osgi.jar j2ee.platform.wsgen.classpath=${j2ee.server.home}/modules/webservices-osgi.jar:${j2ee.server.home}/modules/endorsed/webservices-api-osgi.jar:${j2ee.server.home}/modules/jaxb-osgi.jar:${j2ee.server.home}/modules/endorsed/jaxb-api-osgi.jar:${j2ee.server.home}/modules/javax.ejb.jar diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/chat/OdesilacZprav.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/chat/OdesilacZprav.java Wed Jun 30 00:26:14 2010 +0200 @@ -0,0 +1,33 @@ +package cz.frantovo.nekurak.web.chat; + +import cz.frantovo.nekurak.vyjimky.NekurakVyjimka; +import cz.frantovo.nekurak.web.HledacSluzby; + +/** + * + * @author fiki + */ +public class OdesilacZprav { + + private HledacSluzby h = new HledacSluzby(); + private String od; + private String zprava; + private String mistnost; + + public void setOd(String od) { + this.od = od; + } + + public void setZprava(String zprava) { + this.zprava = zprava; + } + + public void setMistnost(String mistnost) { + this.mistnost = mistnost; + } + + public boolean isOdeslano() throws NekurakVyjimka { + h.getChatEJB().posliZpravu(mistnost, od, zprava); + return true; + } +} diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/chat/VypisZprav.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/chat/VypisZprav.java Wed Jun 30 00:26:14 2010 +0200 @@ -0,0 +1,29 @@ +package cz.frantovo.nekurak.web.chat; + +import cz.frantovo.nekurak.dto.ZpravaChatu; +import cz.frantovo.nekurak.vyjimky.NekurakVyjimka; +import cz.frantovo.nekurak.web.HledacSluzby; +import java.util.Collection; + +/** + * + * @author fiki + */ +public class VypisZprav { + + private HledacSluzby hledac = new HledacSluzby(); + private String mistnost; + private int poradoveCislo; + + public void setMistnost(String mistnost) { + this.mistnost = mistnost; + } + + public void setPoradoveCislo(int poradoveCislo) { + this.poradoveCislo = poradoveCislo; + } + + public Collection getZpravy() throws NekurakVyjimka { + return hledac.getChatEJB().getZpravy(mistnost, poradoveCislo); + } +} diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-web/web/WEB-INF/casti/chat.jsp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-web/web/WEB-INF/casti/chat.jsp Wed Jun 30 00:26:14 2010 +0200 @@ -0,0 +1,67 @@ + + + + + + + + + + + + +

Zpráva byla odeslána.

+
+
+ + + + + + + + + + + + + + + + + + + + + + +

+ + +
+
+
+ + + + + + +
+
+
+
+ + +
+
+
+ +
diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-web/web/WEB-INF/tags/nekurak/stranka.tag --- a/java/nekurak.net-web/web/WEB-INF/tags/nekurak/stranka.tag Sun Jun 27 22:00:48 2010 +0200 +++ b/java/nekurak.net-web/web/WEB-INF/tags/nekurak/stranka.tag Wed Jun 30 00:26:14 2010 +0200 @@ -48,6 +48,7 @@
  • +
  • diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-web/web/index.jsp --- a/java/nekurak.net-web/web/index.jsp Sun Jun 27 22:00:48 2010 +0200 +++ b/java/nekurak.net-web/web/index.jsp Wed Jun 30 00:26:14 2010 +0200 @@ -43,6 +43,9 @@ + + + diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-web/web/js/chat.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/nekurak.net-web/web/js/chat.js Wed Jun 30 00:26:14 2010 +0200 @@ -0,0 +1,130 @@ +/** TODO: jQuery */ +/** TODO: neglobální funkce */ + +var intervalObnovy = 2000; +var poradoveCislo = 0; + +function setRychlostObnovy(interval) { + clearTimeout(t); + intervalObnovy = interval; + spustCasovac(); +} + +function getXmlHttpRequestObject() { + if (window.XMLHttpRequest) { + return new XMLHttpRequest(); + } else if(window.ActiveXObject) { + return new ActiveXObject("Microsoft.XMLHTTP"); + } else { + alert("Nepodporovaný prohlížeč."); + return null; + } +} + +/** Náš AJAXový objekt. */ +var ajax = getXmlHttpRequestObject(); + +function getMistnost() { + return document.getElementById("odesilaciFormular").mistnost.value; +} + +function getOd() { + return document.getElementById("odesilaciFormular").od.value; +} + +function getZprava() { + return document.getElementById("odesilaciFormular").text.value; +} + +function vymazTextZpravy() { + document.getElementById("odesilaciFormular").text.value = ""; +} + +function ajaxOdesli() { + if (ajax.readyState == 4 || ajax.readyState == 0) { + ajax.open("POST", "?akce=chat&akceChat=odesli&mistnost=" + encodeURIComponent(getMistnost()) + "&od=" + encodeURIComponent(getOd()) + "&zprava=" + encodeURIComponent(getZprava()), true); + ajax.onreadystatechange = function() { + if (ajax.readyState == 4) { + vymazTextZpravy(); + aktualizujVypisZprav(); + } + }; + ajax.send(null); + } +} + +function aktualizujVypisZprav() { + if (ajax.readyState == 4 || ajax.readyState == 0) { + ajax.open("POST", "?akce=chat&akceChat=vypis&mistnost=" + encodeURIComponent(getMistnost()), true); + ajax.onreadystatechange = function() { + if (ajax.readyState == 4) { + zpracujZpravy(ajax.responseXML); + document.getElementById("vypisZprav").scrollTop = 100000; + } + }; + ajax.send(null); + } +} + +function ziskejVnitrekXML(data, element) { + try { + return data.getElementsByTagName(element)[0].firstChild.nodeValue; + } catch (e) { + return ""; + } +} + +function zpracujZpravy(xmlOdpoved) { + var vypisZprav = document.getElementById("vypisZprav"); + var zpravy = xmlOdpoved.getElementsByTagName("zprava"); + vypisZprav.innerHTML = ""; + var elementUl = document.createElement("ul"); + vypisZprav.appendChild(elementUl); + + for (i = 0; i < zpravy.length; i++) { + var od = ziskejVnitrekXML(zpravy[i], "od"); + var text = ziskejVnitrekXML(zpravy[i], "text"); + var kdy = ziskejVnitrekXML(zpravy[i], "kdy"); + var overeny = ziskejVnitrekXML(zpravy[i], "overeny"); + poradoveCislo = ziskejVnitrekXML(zpravy[i], "poradoveCislo"); + + var elementLi = document.createElement("li"); + elementLi.title = kdy; + + var elementOd = document.createElement("strong"); + elementOd.textContent = od; + elementLi.appendChild(elementOd); + elementLi.appendChild(document.createTextNode(": ")); + + var elementText = document.createElement("span"); + elementText.textContent = text; + + /** + * Ověřený je takový uživatel, + * který se přihlásil normálně přes Jabber a vstoupil do místnosti pod svojí přezdívkou. + * Uživatelé z webu jsou anonymové a připojují se k XMPP pod společným účtem. + * Svoji přezdívku si vyplňují sami a přenášíme ji zvlášť. + * Proto odlišíme tyto dvě skupiny uživatelů jinou barvou jejich příspěvku. + */ + if (overeny == "true") { + } + // zprávu můžeme zvýraznit + } else { + elementText.style.color = "#444444"; + } + elementLi.appendChild(elementText); + + elementUl.appendChild(elementLi); + } +} + +var t; + +function spustCasovac() { + aktualizujVypisZprav(); + + t = setTimeout(function () { + aktualizujVypisZprav(); + spustCasovac(); + }, intervalObnovy); +} \ No newline at end of file diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-web/web/styl.css --- a/java/nekurak.net-web/web/styl.css Sun Jun 27 22:00:48 2010 +0200 +++ b/java/nekurak.net-web/web/styl.css Wed Jun 30 00:26:14 2010 +0200 @@ -128,6 +128,44 @@ max-width: 400px; } +#chat form { + max-width: 666px; +} + +input.chatOd { + width: 120px; +} + +input.chatText { + width: 410px; +} + +button.chatOdeslat { + width: 80px; +} + +#vypisZprav { + width: 960px; + height: 320px; + overflow: auto; +} + +#vypisZprav ul { + list-style: none; +} + +#chat .zprava h2 { + font-size: medium; + font-weight: bolder; + display: inline; +} + +#chat .autorDatum { + font-size: smaller; + color: gray; + margin-left: 4px; +} + input, textarea, select { width:200px; margin-left: 2px; @@ -244,4 +282,4 @@ .komentar p { margin-top: 8px; margin-bottom: 8px; -} \ No newline at end of file +} diff -r 784b3945c440 -r 8238cdb4113a java/nekurak.net-ws/nbproject/project.properties --- a/java/nekurak.net-ws/nbproject/project.properties Sun Jun 27 22:00:48 2010 +0200 +++ b/java/nekurak.net-ws/nbproject/project.properties Wed Jun 30 00:26:14 2010 +0200 @@ -29,7 +29,7 @@ includes=** j2ee.deploy.on.save=false j2ee.platform=1.6-web -j2ee.platform.classpath= +j2ee.platform.classpath=${j2ee.server.home}/modules/javax.servlet.jar:${j2ee.server.home}/modules/jstl-impl.jar:${j2ee.server.home}/modules/javax.ejb.jar:${j2ee.server.home}/modules/javax.enterprise.deploy.jar:${j2ee.server.home}/modules/javax.security.jacc.jar:${j2ee.server.home}/modules/bean-validator.jar:${j2ee.server.home}/modules/javax.transaction.jar:${j2ee.server.home}/modules/jsr311-api.jar:${j2ee.server.home}/modules/jsf-api.jar:${j2ee.server.home}/modules/javax.security.auth.message.jar:${j2ee.server.home}/modules/javax.servlet.jsp.jar:${j2ee.server.home}/modules/endorsed/javax.annotation.jar:${j2ee.server.home}/modules/javax.management.j2ee.jar:${j2ee.server.home}/modules/endorsed/webservices-api-osgi.jar:${j2ee.server.home}/modules/endorsed/jaxb-api-osgi.jar:${j2ee.server.home}/modules/javax.jms.jar:${j2ee.server.home}/modules/javax.persistence.jar:${j2ee.server.home}/modules/javax.servlet.jsp.jstl.jar:${j2ee.server.home}/modules/javax.resource.jar:${j2ee.server.home}/modules/weld-osgi-bundle.jar:${j2ee.server.home}/modules/jsf-impl.jar:${j2ee.server.home}/modules/mail.jar j2ee.platform.embeddableejb.classpath=${j2ee.server.home}/lib/embedded/glassfish-embedded-static-shell.jar j2ee.platform.wscompile.classpath=${j2ee.server.home}/modules/webservices-osgi.jar j2ee.platform.wsgen.classpath=${j2ee.server.home}/modules/webservices-osgi.jar:${j2ee.server.home}/modules/endorsed/webservices-api-osgi.jar:${j2ee.server.home}/modules/jaxb-osgi.jar:${j2ee.server.home}/modules/endorsed/jaxb-api-osgi.jar:${j2ee.server.home}/modules/javax.ejb.jar