XMPP chat – první verze.
1.1 --- a/java/nekurak.net-ejb/nbproject/build-impl.xml Sun Jun 27 22:00:48 2010 +0200
1.2 +++ b/java/nekurak.net-ejb/nbproject/build-impl.xml Wed Jun 30 00:26:14 2010 +0200
1.3 @@ -456,10 +456,12 @@
1.4 <target depends="compile" name="library-inclusion-in-archive">
1.5 <copyfiles files="${reference.nekurak_net-lib.jar}" todir="${build.classes.dir}"/>
1.6 <copyfiles files="${reference.SuperDAO.jar}" todir="${build.classes.dir}"/>
1.7 + <copyfiles files="${libs.Smack-XMPP.classpath}" todir="${build.classes.dir}"/>
1.8 </target>
1.9 <target depends="compile" name="library-inclusion-in-manifest">
1.10 <copyfiles files="${reference.nekurak_net-lib.jar}" todir="${dist.ear.dir}/lib"/>
1.11 <copyfiles files="${reference.SuperDAO.jar}" todir="${dist.ear.dir}/lib"/>
1.12 + <copyfiles files="${libs.Smack-XMPP.classpath}" todir="${dist.ear.dir}/lib"/>
1.13 <manifest file="${build.ear.classes.dir}/META-INF/MANIFEST.MF" mode="update"/>
1.14 </target>
1.15 <target name="-copy-meta-inf">
2.1 --- a/java/nekurak.net-ejb/nbproject/genfiles.properties Sun Jun 27 22:00:48 2010 +0200
2.2 +++ b/java/nekurak.net-ejb/nbproject/genfiles.properties Wed Jun 30 00:26:14 2010 +0200
2.3 @@ -1,8 +1,8 @@
2.4 -build.xml.data.CRC32=764630c8
2.5 +build.xml.data.CRC32=70881d3e
2.6 build.xml.script.CRC32=d7a2a0ed
2.7 build.xml.stylesheet.CRC32=5910fda3@1.22.1
2.8 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
2.9 # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
2.10 -nbproject/build-impl.xml.data.CRC32=764630c8
2.11 -nbproject/build-impl.xml.script.CRC32=43ab1f1c
2.12 +nbproject/build-impl.xml.data.CRC32=70881d3e
2.13 +nbproject/build-impl.xml.script.CRC32=c3b61fed
2.14 nbproject/build-impl.xml.stylesheet.CRC32=986a5256@1.22.1
3.1 --- a/java/nekurak.net-ejb/nbproject/project.properties Sun Jun 27 22:00:48 2010 +0200
3.2 +++ b/java/nekurak.net-ejb/nbproject/project.properties Wed Jun 30 00:26:14 2010 +0200
3.3 @@ -35,7 +35,8 @@
3.4 jar.name=nekurak.net-ejb.jar
3.5 javac.classpath=\
3.6 ${reference.nekurak_net-lib.jar}:\
3.7 - ${reference.SuperDAO.jar}
3.8 + ${reference.SuperDAO.jar}:\
3.9 + ${libs.Smack-XMPP.classpath}
3.10 javac.debug=true
3.11 javac.deprecation=false
3.12 javac.processorpath=${javac.classpath}
4.1 --- a/java/nekurak.net-ejb/nbproject/project.xml Sun Jun 27 22:00:48 2010 +0200
4.2 +++ b/java/nekurak.net-ejb/nbproject/project.xml Wed Jun 30 00:26:14 2010 +0200
4.3 @@ -7,6 +7,7 @@
4.4 <minimum-ant-version>1.6.5</minimum-ant-version>
4.5 <included-library dirs="200">reference.nekurak_net-lib.jar</included-library>
4.6 <included-library dirs="200">reference.SuperDAO.jar</included-library>
4.7 + <included-library dirs="200">libs.Smack-XMPP.classpath</included-library>
4.8 <source-roots>
4.9 <root id="src.dir" name="Source Packages"/>
4.10 </source-roots>
5.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
5.2 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/Mistnost.java Wed Jun 30 00:26:14 2010 +0200
5.3 @@ -0,0 +1,77 @@
5.4 +package cz.frantovo.nekurak.chat;
5.5 +
5.6 +/**
5.7 + * Diskusní (chatovací) místnost, do které robot vstupuje.
5.8 + * @author fiki
5.9 + */
5.10 +public class Mistnost {
5.11 +
5.12 + /** Část před zavináčem */
5.13 + private String nazev;
5.14 + /** Část za zavináčem */
5.15 + private String domena;
5.16 + /** Robotova přezdívka v této místnosti */
5.17 + private String prezdivka;
5.18 + /** Co robot napíše po vstupu do místnosti */
5.19 + private String uvitaciZprava;
5.20 + /** Co robot napíše před opuštěním místnosti */
5.21 + private String louciciZprava;
5.22 + /** Délka fronty zpráv – historie */
5.23 + private int delkaFronty = 10;
5.24 +
5.25 + public String getNazev() {
5.26 + return nazev;
5.27 + }
5.28 +
5.29 + public void setNazev(String nazev) {
5.30 + this.nazev = nazev;
5.31 + }
5.32 +
5.33 + public String getDomena() {
5.34 + return domena;
5.35 + }
5.36 +
5.37 + /**
5.38 + * Celý název místnosti.
5.39 + * Např. lobby@konference.frantovo.cz
5.40 + */
5.41 + public String getMuc() {
5.42 + return nazev + "@" + domena;
5.43 + }
5.44 +
5.45 + public void setDomena(String domena) {
5.46 + this.domena = domena;
5.47 + }
5.48 +
5.49 + public String getUvitaciZprava() {
5.50 + return uvitaciZprava;
5.51 + }
5.52 +
5.53 + public void setUvitaciZprava(String uvitaciZprava) {
5.54 + this.uvitaciZprava = uvitaciZprava;
5.55 + }
5.56 +
5.57 + public String getPrezdivka() {
5.58 + return prezdivka;
5.59 + }
5.60 +
5.61 + public void setPrezdivka(String prezdivka) {
5.62 + this.prezdivka = prezdivka;
5.63 + }
5.64 +
5.65 + public String getLouciciZprava() {
5.66 + return louciciZprava;
5.67 + }
5.68 +
5.69 + public void setLouciciZprava(String louciciZprava) {
5.70 + this.louciciZprava = louciciZprava;
5.71 + }
5.72 +
5.73 + public int getDelkaFronty() {
5.74 + return delkaFronty;
5.75 + }
5.76 +
5.77 + public void setDelkaFronty(int delkaFronty) {
5.78 + this.delkaFronty = delkaFronty;
5.79 + }
5.80 +}
6.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
6.2 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/MistnostPripojena.java Wed Jun 30 00:26:14 2010 +0200
6.3 @@ -0,0 +1,112 @@
6.4 +package cz.frantovo.nekurak.chat;
6.5 +
6.6 +import cz.frantovo.nekurak.dto.ZpravaChatu;
6.7 +import java.util.ArrayList;
6.8 +import java.util.Collection;
6.9 +import java.util.LinkedList;
6.10 +import org.jivesoftware.smack.PacketListener;
6.11 +import org.jivesoftware.smack.XMPPException;
6.12 +import org.jivesoftware.smack.packet.Message;
6.13 +import org.jivesoftware.smack.packet.Packet;
6.14 +import org.jivesoftware.smack.util.StringUtils;
6.15 +import org.jivesoftware.smackx.muc.MultiUserChat;
6.16 +
6.17 +/**
6.18 + *
6.19 + * @author fiki
6.20 + */
6.21 +public class MistnostPripojena implements PacketListener {
6.22 +
6.23 + private final MultiUserChat muc;
6.24 + private final Mistnost nastaveni;
6.25 + private final LinkedList<ZpravaChatu> fronta = new LinkedList<ZpravaChatu>();
6.26 + private final String mojePrezdivka;
6.27 + /** Zatím nejvyšší pořadové číslo – poradoveCislo. */
6.28 + private int pocitadloZprav = 0;
6.29 +
6.30 + public MistnostPripojena(Mistnost mistnost, Spojeni spojeni) throws XMPPException {
6.31 + nastaveni = mistnost;
6.32 + mojePrezdivka = mistnost.getPrezdivka();
6.33 + muc = new MultiUserChat(spojeni.getSpojeni(), mistnost.getMuc());
6.34 + muc.join(mistnost.getPrezdivka());
6.35 +
6.36 + if (mistnost.getUvitaciZprava() != null) {
6.37 + muc.sendMessage(mistnost.getUvitaciZprava());
6.38 + }
6.39 +
6.40 + muc.addMessageListener(this);
6.41 + }
6.42 +
6.43 + public void processPacket(Packet packet) {
6.44 + if (packet instanceof Message) {
6.45 + Message m = (Message) packet;
6.46 + String od = StringUtils.parseResource(m.getFrom());
6.47 + String text = m.getBody();
6.48 +
6.49 + /** Vydolujeme jméno z anonymně (námi) poslaných zpráv */
6.50 + boolean overenyUzivatel = true;
6.51 + if (mojePrezdivka.equals(od) && text.contains(":")) {
6.52 + od = text.split(":")[0];
6.53 + text = text.substring(od.length() + 2);
6.54 + overenyUzivatel = false;
6.55 + }
6.56 +
6.57 + /** Přidáme zprávu do fronty historie. */
6.58 + ZpravaChatu z = new ZpravaChatu(od, text, overenyUzivatel, dalsiPoradoveCislo());
6.59 + pridejZpravu(z);
6.60 +
6.61 + /** TODO: zpracovávat další události – příkazy atd. */
6.62 + }
6.63 + }
6.64 +
6.65 + /**
6.66 + * @param z Zpráva, která se má přidat do fronty (historie).
6.67 + */
6.68 + private void pridejZpravu(ZpravaChatu z) {
6.69 + fronta.add(z);
6.70 +
6.71 + while (fronta.size() > nastaveni.getDelkaFronty()) {
6.72 + fronta.removeFirst();
6.73 + }
6.74 + }
6.75 +
6.76 + public void posliZpravu(ZpravaChatu zprava) throws XMPPException {
6.77 + muc.sendMessage(zprava.toString());
6.78 + }
6.79 +
6.80 + public void odejdi() throws XMPPException {
6.81 + if (nastaveni.getLouciciZprava() != null) {
6.82 + muc.sendMessage(nastaveni.getLouciciZprava());
6.83 + }
6.84 + muc.leave();
6.85 + }
6.86 +
6.87 + /**
6.88 + * @param nazev název místnosti (něco@moje.doména)
6.89 + * @return true, pokud se jedná o místnost s tímto názvem
6.90 + */
6.91 + public boolean porovnejNazev(String nazev) {
6.92 + return nazev.equals(nastaveni.getMuc());
6.93 +
6.94 + }
6.95 +
6.96 + public Collection<ZpravaChatu> getZpravy(int poradoveCislo) {
6.97 + /**
6.98 + * TODO:
6.99 + * http://stackoverflow.com/questions/122105/java-what-is-the-best-way-to-filter-a-collection
6.100 + * http://www.javaworld.com/javaworld/jw-10-2004/jw-1018-filter.html
6.101 + */
6.102 + Collection<ZpravaChatu> vysledek = new ArrayList<ZpravaChatu>();
6.103 + for (ZpravaChatu z : fronta) {
6.104 + if (z.getPoradoveCislo() > poradoveCislo) {
6.105 + vysledek.add(z);
6.106 + }
6.107 + }
6.108 + return vysledek;
6.109 + }
6.110 +
6.111 + private int dalsiPoradoveCislo() {
6.112 + pocitadloZprav++;
6.113 + return pocitadloZprav;
6.114 + }
6.115 +}
7.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
7.2 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/Nastaveni.java Wed Jun 30 00:26:14 2010 +0200
7.3 @@ -0,0 +1,22 @@
7.4 +package cz.frantovo.nekurak.chat;
7.5 +
7.6 +import java.util.ArrayList;
7.7 +import java.util.Collection;
7.8 +
7.9 +/**
7.10 + * Nastavení serveru, singletonu, typicky jen jedno v celém systému.
7.11 + * Můžeme uchovávat jejich starší verze.
7.12 + * @author fiki
7.13 + */
7.14 +public class Nastaveni {
7.15 +
7.16 + private Collection<UcetRobota> uctyRobota = new ArrayList<UcetRobota>();
7.17 +
7.18 + public Collection<UcetRobota> getUctyRobota() {
7.19 + return uctyRobota;
7.20 + }
7.21 +
7.22 + public void setUctyRobota(Collection<UcetRobota> uctyRobota) {
7.23 + this.uctyRobota = uctyRobota;
7.24 + }
7.25 +}
8.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
8.2 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/Spojeni.java Wed Jun 30 00:26:14 2010 +0200
8.3 @@ -0,0 +1,56 @@
8.4 +package cz.frantovo.nekurak.chat;
8.5 +
8.6 +import java.util.ArrayList;
8.7 +import java.util.Collection;
8.8 +import java.util.logging.Level;
8.9 +import java.util.logging.Logger;
8.10 +import org.jivesoftware.smack.ConnectionConfiguration;
8.11 +import org.jivesoftware.smack.XMPPConnection;
8.12 +import org.jivesoftware.smack.XMPPException;
8.13 +
8.14 +/**
8.15 + *
8.16 + * @author fiki
8.17 + */
8.18 +public class Spojeni {
8.19 +
8.20 + private XMPPConnection spojeni;
8.21 + private Collection<MistnostPripojena> mistnosti = new ArrayList<MistnostPripojena>();
8.22 + private static final Logger log = Logger.getLogger(Spojeni.class.getSimpleName());
8.23 +
8.24 + public Spojeni(UcetRobota ucet) throws XMPPException {
8.25 + /** Navážeme spojení */
8.26 + ConnectionConfiguration nastaveni = new ConnectionConfiguration(ucet.getAdresaServeru(), ucet.getPort(), ucet.getDomena());
8.27 + spojeni = new XMPPConnection(nastaveni);
8.28 + spojeni.connect();
8.29 + spojeni.login(ucet.getUzivatelskeJmeno(), ucet.getUzivatelskeHeslo(), ucet.getProstredek());
8.30 +
8.31 + /** Vstoupíme do místností */
8.32 + for (Mistnost m : ucet.getMistnosti()) {
8.33 + MistnostPripojena mp = new MistnostPripojena(m, this);
8.34 + mistnosti.add(mp);
8.35 + }
8.36 + }
8.37 +
8.38 + public void odpoj() {
8.39 + /** Rozloučíme se ve všech místnostech */
8.40 + try {
8.41 + for (MistnostPripojena mp : mistnosti) {
8.42 + mp.odejdi();
8.43 + }
8.44 + } catch (Exception e) {
8.45 + log.log(Level.WARNING, "Nepodařilo se odejít z místnosti před ukončením spojení.", e);
8.46 + }
8.47 +
8.48 + /** Ukončíme spojení */
8.49 + spojeni.disconnect();
8.50 + }
8.51 +
8.52 + public XMPPConnection getSpojeni() {
8.53 + return spojeni;
8.54 + }
8.55 +
8.56 + public Collection<MistnostPripojena> getMistnosti() {
8.57 + return mistnosti;
8.58 + }
8.59 +}
9.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
9.2 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/SpravceNastaveni.java Wed Jun 30 00:26:14 2010 +0200
9.3 @@ -0,0 +1,31 @@
9.4 +package cz.frantovo.nekurak.chat;
9.5 +
9.6 +/**
9.7 + *
9.8 + * @author fiki
9.9 + */
9.10 +public class SpravceNastaveni {
9.11 +
9.12 + public Nastaveni getNastaveni() {
9.13 + Nastaveni n = new Nastaveni();
9.14 +
9.15 + UcetRobota u = new UcetRobota();
9.16 + u.setUzivatelskeJmeno("nekurakrobot");
9.17 + u.setUzivatelskeHeslo("nekurak");
9.18 + u.setDomena("frantovo.cz");
9.19 + u.setAdresaServeru("ipv6.frantovo.cz");
9.20 +
9.21 + n.getUctyRobota().add(u);
9.22 +
9.23 + Mistnost m = new Mistnost();
9.24 + m.setNazev("nekurak");
9.25 + m.setDomena("konference.frantovo.cz");
9.26 + m.setPrezdivka("WeboRobot");
9.27 + m.setUvitaciZprava("Ahoj, tak jsem tady!");
9.28 + m.setLouciciZprava("Mějte se tu hezky!");
9.29 +
9.30 + u.getMistnosti().add(m);
9.31 +
9.32 + return n;
9.33 + }
9.34 +}
10.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
10.2 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/UcetRobota.java Wed Jun 30 00:26:14 2010 +0200
10.3 @@ -0,0 +1,97 @@
10.4 +package cz.frantovo.nekurak.chat;
10.5 +
10.6 +import java.net.InetAddress;
10.7 +import java.net.UnknownHostException;
10.8 +import java.util.ArrayList;
10.9 +import java.util.Collection;
10.10 +import java.util.logging.Level;
10.11 +import java.util.logging.Logger;
10.12 +
10.13 +/**
10.14 + * Definice jabberovského účtu, který používá robot k připojení.
10.15 + * @author fiki
10.16 + */
10.17 +public class UcetRobota {
10.18 +
10.19 + /** Seznam diskusních místností, do kterých robot vstoupí */
10.20 + private Collection<Mistnost> mistnosti = new ArrayList<Mistnost>();
10.21 + /** Doména – jabber server, ke kterému se připojí */
10.22 + private String domena;
10.23 + /** Pokud má být jiná než doména */
10.24 + private String adresaServeru;
10.25 + /** TCP port pro připojení */
10.26 + private int port = 5222;
10.27 + /** Jméno robota */
10.28 + private String uzivatelskeJmeno;
10.29 + /** Heslo robota */
10.30 + private String uzivatelskeHeslo;
10.31 + /** Prostředek (resource) tzn. část JID za lomítkem */
10.32 + private String prostredek = "robot";
10.33 +
10.34 + private static final Logger log = Logger.getLogger(UcetRobota.class.getSimpleName());
10.35 +
10.36 + public UcetRobota() {
10.37 + try {
10.38 + /** aby nedocházelo ke konfliktům, když aplikaci nasadíme na víc serverů současně */
10.39 + prostredek = InetAddress.getLocalHost().getHostName();
10.40 + } catch (UnknownHostException e) {
10.41 + log.log(Level.SEVERE, "Nepodařilo se zjistit místní „hostname“", e);
10.42 + }
10.43 + }
10.44 +
10.45 + public Collection<Mistnost> getMistnosti() {
10.46 + return mistnosti;
10.47 + }
10.48 +
10.49 + public void setMistnosti(Collection<Mistnost> mistnosti) {
10.50 + this.mistnosti = mistnosti;
10.51 + }
10.52 +
10.53 + public String getDomena() {
10.54 + return domena;
10.55 + }
10.56 +
10.57 + public void setDomena(String domena) {
10.58 + this.domena = domena;
10.59 + }
10.60 +
10.61 + public String getAdresaServeru() {
10.62 + return adresaServeru;
10.63 + }
10.64 +
10.65 + public void setAdresaServeru(String adresaServeru) {
10.66 + this.adresaServeru = adresaServeru;
10.67 + }
10.68 +
10.69 + public int getPort() {
10.70 + return port;
10.71 + }
10.72 +
10.73 + public void setPort(int port) {
10.74 + this.port = port;
10.75 + }
10.76 +
10.77 + public String getUzivatelskeJmeno() {
10.78 + return uzivatelskeJmeno;
10.79 + }
10.80 +
10.81 + public void setUzivatelskeJmeno(String uzivatelskeJmeno) {
10.82 + this.uzivatelskeJmeno = uzivatelskeJmeno;
10.83 + }
10.84 +
10.85 + public String getUzivatelskeHeslo() {
10.86 + return uzivatelskeHeslo;
10.87 + }
10.88 +
10.89 + public void setUzivatelskeHeslo(String uzivatelskeHeslo) {
10.90 + this.uzivatelskeHeslo = uzivatelskeHeslo;
10.91 + }
10.92 +
10.93 + public String getProstredek() {
10.94 + return prostredek;
10.95 + }
10.96 +
10.97 + public void setProstredek(String prostredek) {
10.98 + this.prostredek = prostredek;
10.99 + }
10.100 +}
11.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
11.2 +++ b/java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ejb/ChatEJB.java Wed Jun 30 00:26:14 2010 +0200
11.3 @@ -0,0 +1,105 @@
11.4 +package cz.frantovo.nekurak.ejb;
11.5 +
11.6 +import cz.frantovo.nekurak.chat.MistnostPripojena;
11.7 +import cz.frantovo.nekurak.chat.Nastaveni;
11.8 +import cz.frantovo.nekurak.chat.Spojeni;
11.9 +import cz.frantovo.nekurak.chat.SpravceNastaveni;
11.10 +import cz.frantovo.nekurak.chat.UcetRobota;
11.11 +import cz.frantovo.nekurak.dto.ZpravaChatu;
11.12 +import cz.frantovo.nekurak.vyjimky.NekurakVyjimka;
11.13 +import java.util.ArrayList;
11.14 +import java.util.Collection;
11.15 +import java.util.logging.Level;
11.16 +import java.util.logging.Logger;
11.17 +import javax.annotation.PostConstruct;
11.18 +import javax.annotation.PreDestroy;
11.19 +import javax.ejb.Singleton;
11.20 +import javax.ejb.Startup;
11.21 +import javax.naming.NamingException;
11.22 +
11.23 +/**
11.24 + *
11.25 + * @author fiki
11.26 + */
11.27 +@Singleton
11.28 +@Startup
11.29 +public class ChatEJB implements ChatRemote {
11.30 +
11.31 + private static final Logger log = Logger.getLogger(ChatRemote.class.getSimpleName());
11.32 + private Nastaveni nastaveni;
11.33 + private Collection<Spojeni> spojeni = new ArrayList<Spojeni>();
11.34 +
11.35 + @Override
11.36 + public void posliZpravu(String mistnost, String prezdivka, String zprava) throws NekurakVyjimka {
11.37 + MistnostPripojena mp = najdiMistnost(mistnost);
11.38 + if (mp == null) {
11.39 + throw new NekurakVyjimka("Místnost s tímto názvem neexistuje", null);
11.40 + } else {
11.41 + try {
11.42 + mp.posliZpravu(new ZpravaChatu(prezdivka, zprava));
11.43 + } catch (Exception e) {
11.44 + log.log(Level.SEVERE, "Selhalo odesílání zprávy", e);
11.45 + throw new NekurakVyjimka("Zprávu se nepodařilo odeslat.", e);
11.46 + }
11.47 + }
11.48 + }
11.49 +
11.50 + /**
11.51 + * @param mistnost název místnosti včetně zavináče a serveru
11.52 + * @param poradoveCislo pořadové číslo poslední zprávy, kterou jsme dostali
11.53 + * @return všechny novější zprávy než dané pořadové číslo
11.54 + * @throws NekurakVyjimka
11.55 + */
11.56 + @Override
11.57 + public Collection<ZpravaChatu> getZpravy(String mistnost, int poradoveCislo) throws NekurakVyjimka {
11.58 + MistnostPripojena mp = najdiMistnost(mistnost);
11.59 + if (mp == null) {
11.60 + throw new NekurakVyjimka("Místnost s tímto názvem neexistuje", null);
11.61 + } else {
11.62 + return mp.getZpravy(poradoveCislo);
11.63 + }
11.64 + }
11.65 +
11.66 + public ChatEJB() throws NekurakVyjimka {
11.67 + /** TODO: vyřešit lépe. */
11.68 + nastaveni = new SpravceNastaveni().getNastaveni();
11.69 + }
11.70 +
11.71 + @PreDestroy
11.72 + public void odpoj() {
11.73 + for (Spojeni s : spojeni) {
11.74 + s.odpoj();
11.75 + }
11.76 + }
11.77 +
11.78 + @PostConstruct
11.79 + public void inicializuj() throws NekurakVyjimka, NamingException {
11.80 + pripojXMPP();
11.81 + }
11.82 +
11.83 + private void pripojXMPP() throws NekurakVyjimka {
11.84 + try {
11.85 + for (UcetRobota u : nastaveni.getUctyRobota()) {
11.86 + Spojeni s = new Spojeni(u);
11.87 + spojeni.add(s);
11.88 + }
11.89 + } catch (Exception e) {
11.90 + throw new NekurakVyjimka("Chyba při připojování.", e);
11.91 + }
11.92 + }
11.93 +
11.94 + /**
11.95 + * @param nazev Název místnosti, kterou hledáme.
11.96 + * @return nalezená místnost, nebo null, pokud místnost nebyla nalezena.
11.97 + */
11.98 + private MistnostPripojena najdiMistnost(String nazev) {
11.99 + for (Spojeni s : spojeni) {
11.100 + for (MistnostPripojena mp : s.getMistnosti()) {
11.101 + if (mp.porovnejNazev(nazev)) {
11.102 + return mp;
11.103 + }
11.104 + }
11.105 + }
11.106 + return null;
11.107 + }
11.108 +}
12.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
12.2 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/dto/ZpravaChatu.java Wed Jun 30 00:26:14 2010 +0200
12.3 @@ -0,0 +1,76 @@
12.4 +package cz.frantovo.nekurak.dto;
12.5 +
12.6 +import java.util.Date;
12.7 +
12.8 +/**
12.9 + *
12.10 + * @author fiki
12.11 + */
12.12 +public class ZpravaChatu {
12.13 +
12.14 + private String od;
12.15 + private Date kdy = new Date();
12.16 + private String text;
12.17 + private boolean overenyUzivatel;
12.18 + private int poradoveCislo;
12.19 +
12.20 + public ZpravaChatu(String od, String text) {
12.21 + this.od = od;
12.22 + this.text = text;
12.23 + }
12.24 +
12.25 + public ZpravaChatu(String od, String text, boolean overenyUzivatel, int poradoveCislo) {
12.26 + this.od = od;
12.27 + this.text = text;
12.28 + this.overenyUzivatel = overenyUzivatel;
12.29 + this.poradoveCislo = poradoveCislo;
12.30 + }
12.31 +
12.32 + public String getOd() {
12.33 + return od;
12.34 + }
12.35 +
12.36 + public String getText() {
12.37 + return text;
12.38 + }
12.39 +
12.40 + public Date getKdy() {
12.41 + return kdy;
12.42 + }
12.43 +
12.44 + /**
12.45 + * @return true, pokud zprávu odeslal přihlášený uživatel (normálně přes jabber).
12.46 + * False, pokud zprávu odeslal nějaký anonym jen přes web.
12.47 + */
12.48 + public boolean isOverenyUzivatel() {
12.49 + return overenyUzivatel;
12.50 + }
12.51 +
12.52 + /**
12.53 + * @param overenyUzivatel true, pokud zprávu odeslal přihlášený uživatel (normálně přes jabber).
12.54 + * False, pokud zprávu odeslal nějaký anonym jen přes web.
12.55 + */
12.56 + public void setOverenyUzivatel(boolean overenyUzivatel) {
12.57 + this.overenyUzivatel = overenyUzivatel;
12.58 + }
12.59 +
12.60 + /**
12.61 + * @return Text zprávy – případně včetně přezdívky autora.
12.62 + */
12.63 + @Override
12.64 + public String toString() {
12.65 + if (od == null) {
12.66 + return text;
12.67 + } else {
12.68 + return od + ": " + text;
12.69 + }
12.70 + }
12.71 +
12.72 + public int getPoradoveCislo() {
12.73 + return poradoveCislo;
12.74 + }
12.75 +
12.76 + public void setPoradoveCislo(int poradoveCislo) {
12.77 + this.poradoveCislo = poradoveCislo;
12.78 + }
12.79 +}
13.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
13.2 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/ejb/ChatRemote.java Wed Jun 30 00:26:14 2010 +0200
13.3 @@ -0,0 +1,15 @@
13.4 +package cz.frantovo.nekurak.ejb;
13.5 +
13.6 +import cz.frantovo.nekurak.dto.ZpravaChatu;
13.7 +import cz.frantovo.nekurak.vyjimky.NekurakVyjimka;
13.8 +import java.util.Collection;
13.9 +import javax.ejb.Remote;
13.10 +
13.11 +@Remote
13.12 +public interface ChatRemote {
13.13 +
13.14 + void posliZpravu(String mistnost, String prezdivka, String zprava) throws NekurakVyjimka;
13.15 +
13.16 + public Collection<ZpravaChatu> getZpravy(String mistnost, int poradoveCislo) throws NekurakVyjimka;
13.17 +
13.18 +}
14.1 --- a/java/nekurak.net-lib/src/cz/frantovo/nekurak/preklady_cs.properties Sun Jun 27 22:00:48 2010 +0200
14.2 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/preklady_cs.properties Wed Jun 30 00:26:14 2010 +0200
14.3 @@ -106,3 +106,6 @@
14.4 komentar.typ.texy=Texy form\u00e1tovan\u00fd text
14.5 komentar.nejdeZobrazit=Tento koment\u00e1\u0159 bohu\u017eel nelze z technick\u00fdch d\u016fvod\u016f zobrazit.
14.6
14.7 +chat.nadpis=Chat
14.8 +chat.anonym=Kolemjdouc\u00ed
14.9 +chat.tlacitkoOdeslat=Odeslat
15.1 --- a/java/nekurak.net-lib/src/cz/frantovo/nekurak/web/HledacSluzby.java Sun Jun 27 22:00:48 2010 +0200
15.2 +++ b/java/nekurak.net-lib/src/cz/frantovo/nekurak/web/HledacSluzby.java Wed Jun 30 00:26:14 2010 +0200
15.3 @@ -1,5 +1,6 @@
15.4 package cz.frantovo.nekurak.web;
15.5
15.6 +import cz.frantovo.nekurak.ejb.ChatRemote;
15.7 import cz.frantovo.nekurak.ejb.ClanekRemote;
15.8 import cz.frantovo.nekurak.ejb.PodnikRemote;
15.9 import cz.frantovo.nekurak.ejb.UzivatelRemote;
15.10 @@ -19,6 +20,7 @@
15.11 private PodnikRemote podnikEJB;
15.12 private UzivatelRemote uzivatelEJB;
15.13 private ClanekRemote clanekEJB;
15.14 + private ChatRemote chatEJB;
15.15 private static final Logger log = Logger.getLogger(HledacSluzby.class.getSimpleName());
15.16
15.17 public PodnikRemote getPodnikEJB() {
15.18 @@ -59,4 +61,17 @@
15.19 }
15.20 return clanekEJB;
15.21 }
15.22 +
15.23 + public ChatRemote getChatEJB() {
15.24 + if (chatEJB == null) {
15.25 + try {
15.26 + Context c = new InitialContext();
15.27 + chatEJB = (ChatRemote) c.lookup("cz.frantovo.nekurak.ejb.ChatRemote");
15.28 + } catch (NamingException e) {
15.29 + log.log(Level.SEVERE, "Chyba při hledání ChatRemote", e);
15.30 + throw new RuntimeException(e);
15.31 + }
15.32 + }
15.33 + return chatEJB;
15.34 + }
15.35 }
16.1 --- a/java/nekurak.net-rest/nbproject/project.properties Sun Jun 27 22:00:48 2010 +0200
16.2 +++ b/java/nekurak.net-rest/nbproject/project.properties Wed Jun 30 00:26:14 2010 +0200
16.3 @@ -29,7 +29,7 @@
16.4 includes=**
16.5 j2ee.deploy.on.save=false
16.6 j2ee.platform=1.6-web
16.7 -j2ee.platform.classpath=
16.8 +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
16.9 j2ee.platform.embeddableejb.classpath=${j2ee.server.home}/lib/embedded/glassfish-embedded-static-shell.jar
16.10 j2ee.platform.wscompile.classpath=${j2ee.server.home}/modules/webservices-osgi.jar
16.11 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
17.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
17.2 +++ b/java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/chat/OdesilacZprav.java Wed Jun 30 00:26:14 2010 +0200
17.3 @@ -0,0 +1,33 @@
17.4 +package cz.frantovo.nekurak.web.chat;
17.5 +
17.6 +import cz.frantovo.nekurak.vyjimky.NekurakVyjimka;
17.7 +import cz.frantovo.nekurak.web.HledacSluzby;
17.8 +
17.9 +/**
17.10 + *
17.11 + * @author fiki
17.12 + */
17.13 +public class OdesilacZprav {
17.14 +
17.15 + private HledacSluzby h = new HledacSluzby();
17.16 + private String od;
17.17 + private String zprava;
17.18 + private String mistnost;
17.19 +
17.20 + public void setOd(String od) {
17.21 + this.od = od;
17.22 + }
17.23 +
17.24 + public void setZprava(String zprava) {
17.25 + this.zprava = zprava;
17.26 + }
17.27 +
17.28 + public void setMistnost(String mistnost) {
17.29 + this.mistnost = mistnost;
17.30 + }
17.31 +
17.32 + public boolean isOdeslano() throws NekurakVyjimka {
17.33 + h.getChatEJB().posliZpravu(mistnost, od, zprava);
17.34 + return true;
17.35 + }
17.36 +}
18.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
18.2 +++ b/java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/chat/VypisZprav.java Wed Jun 30 00:26:14 2010 +0200
18.3 @@ -0,0 +1,29 @@
18.4 +package cz.frantovo.nekurak.web.chat;
18.5 +
18.6 +import cz.frantovo.nekurak.dto.ZpravaChatu;
18.7 +import cz.frantovo.nekurak.vyjimky.NekurakVyjimka;
18.8 +import cz.frantovo.nekurak.web.HledacSluzby;
18.9 +import java.util.Collection;
18.10 +
18.11 +/**
18.12 + *
18.13 + * @author fiki
18.14 + */
18.15 +public class VypisZprav {
18.16 +
18.17 + private HledacSluzby hledac = new HledacSluzby();
18.18 + private String mistnost;
18.19 + private int poradoveCislo;
18.20 +
18.21 + public void setMistnost(String mistnost) {
18.22 + this.mistnost = mistnost;
18.23 + }
18.24 +
18.25 + public void setPoradoveCislo(int poradoveCislo) {
18.26 + this.poradoveCislo = poradoveCislo;
18.27 + }
18.28 +
18.29 + public Collection<ZpravaChatu> getZpravy() throws NekurakVyjimka {
18.30 + return hledac.getChatEJB().getZpravy(mistnost, poradoveCislo);
18.31 + }
18.32 +}
19.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
19.2 +++ b/java/nekurak.net-web/web/WEB-INF/casti/chat.jsp Wed Jun 30 00:26:14 2010 +0200
19.3 @@ -0,0 +1,67 @@
19.4 +<?xml version="1.0" encoding="UTF-8"?>
19.5 +<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"
19.6 + xmlns:c="http://java.sun.com/jsp/jstl/core"
19.7 + xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"
19.8 + xmlns:fn="http://java.sun.com/jsp/jstl/functions"
19.9 + xmlns:nk="urn:jsptagdir:/WEB-INF/tags/nekurak"
19.10 + version="2.0">
19.11 +
19.12 + <c:choose>
19.13 + <c:when test="${param.akceChat == 'odesli'}">
19.14 + <!-- TODO: servlet -->
19.15 + <jsp:useBean id="odesilac" class="cz.frantovo.nekurak.web.chat.OdesilacZprav" scope="request"/>
19.16 + <jsp:setProperty name="odesilac" property="mistnost" value="${param.mistnost}"/>
19.17 + <jsp:setProperty name="odesilac" property="od" value="${param.od}"/>
19.18 + <jsp:setProperty name="odesilac" property="zprava" value="${param.zprava}"/>
19.19 +
19.20 + <c:if test="${odesilac.odeslano}">
19.21 + <p>Zpráva byla odeslána.</p>
19.22 + </c:if>
19.23 + </c:when>
19.24 + <c:when test="${param.akceChat == 'vypis'}">
19.25 + <!-- TODO: servlet + JSP -->
19.26 + <jsp:useBean id="vypis" class="cz.frantovo.nekurak.web.chat.VypisZprav" scope="request"/>
19.27 + <jsp:setProperty name="vypis" property="mistnost" value="${param.mistnost}"/>
19.28 + <jsp:setProperty name="vypis" property="poradoveCislo" value="${param.poradoveCislo}"/>
19.29 + <!-- Náš vlastní XML formát -->
19.30 + <zpravy>
19.31 + <c:forEach var="z" items="${vypis.zpravy}">
19.32 + <zprava>
19.33 + <poradoveCislo><c:out value="${z.poradoveCislo}"/></poradoveCislo>
19.34 + <od><c:out value="${z.od}"/></od>
19.35 + <text><c:out value="${z.text}"/></text>
19.36 + <kdy><fmt:formatDate value="${z.kdy}" pattern="yyyy-MM-dd HH:mm:ss"/></kdy>
19.37 + <overeny><c:out value="${z.overenyUzivatel}"/></overeny>
19.38 + </zprava>
19.39 + </c:forEach>
19.40 + </zpravy>
19.41 + </c:when>
19.42 + <c:otherwise>
19.43 + <fmt:message key="chat.nadpis" var="titulekStranky"/>
19.44 + <nk:stranka titulek="${titulekStranky}">
19.45 +
19.46 + <h1><c:out value="${titulekStranky}"/></h1>
19.47 + <script type="text/javascript" src="js/chat.js"></script>
19.48 +
19.49 + <div id="chat">
19.50 + <form action="javascript:ajaxOdesli();" id="odesilaciFormular">
19.51 + <fieldset>
19.52 + <!-- TODO: jméno místnosti konfigurovat na jednom místě -->
19.53 + <input type="hidden" name="mistnost" value="nekurak@konference.frantovo.cz"/>
19.54 + <fmt:message key="chat.anonym" var="chatAnonym"/>
19.55 + <input title="vaše přezdívka" type="text" name="od" class="chatOd" value="${chatAnonym}"/>
19.56 + <input title="text zprávy" type="text" name="text" class="chatText" value="…"/>
19.57 + <button type="submit" class="chatOdeslat"><fmt:message key="chat.tlacitkoOdeslat"/></button>
19.58 + </fieldset>
19.59 + </form>
19.60 + <div id="vypisZprav">…</div>
19.61 + </div>
19.62 +
19.63 + <script type="text/javascript">
19.64 + spustCasovac();
19.65 + </script>
19.66 + </nk:stranka>
19.67 + </c:otherwise>
19.68 + </c:choose>
19.69 +
19.70 +</jsp:root>
20.1 --- a/java/nekurak.net-web/web/WEB-INF/tags/nekurak/stranka.tag Sun Jun 27 22:00:48 2010 +0200
20.2 +++ b/java/nekurak.net-web/web/WEB-INF/tags/nekurak/stranka.tag Wed Jun 30 00:26:14 2010 +0200
20.3 @@ -48,6 +48,7 @@
20.4
20.5 <ul id="nabidka">
20.6 <li><a href="?"><fmt:message key="uvod"/></a></li>
20.7 + <li><a href="?akce=chat"><fmt:message key="chat.nadpis"/></a></li>
20.8
20.9 <c:choose>
20.10 <c:when test="${prihlasenyUzivatel == null}">
21.1 --- a/java/nekurak.net-web/web/index.jsp Sun Jun 27 22:00:48 2010 +0200
21.2 +++ b/java/nekurak.net-web/web/index.jsp Wed Jun 30 00:26:14 2010 +0200
21.3 @@ -43,6 +43,9 @@
21.4 <c:when test="${param.akce == 'odeslatKomentar'}">
21.5 <jsp:include page="/WEB-INF/casti/odeslatKomentar.jsp" flush="false"/>
21.6 </c:when>
21.7 + <c:when test="${param.akce == 'chat'}">
21.8 + <jsp:include page="/WEB-INF/casti/chat.jsp" flush="false"/>
21.9 + </c:when>
21.10 <c:otherwise>
21.11 <jsp:include page="/WEB-INF/casti/uvod.jsp" flush="false"/>
21.12 </c:otherwise>
22.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
22.2 +++ b/java/nekurak.net-web/web/js/chat.js Wed Jun 30 00:26:14 2010 +0200
22.3 @@ -0,0 +1,130 @@
22.4 +/** TODO: jQuery */
22.5 +/** TODO: neglobální funkce */
22.6 +
22.7 +var intervalObnovy = 2000;
22.8 +var poradoveCislo = 0;
22.9 +
22.10 +function setRychlostObnovy(interval) {
22.11 + clearTimeout(t);
22.12 + intervalObnovy = interval;
22.13 + spustCasovac();
22.14 +}
22.15 +
22.16 +function getXmlHttpRequestObject() {
22.17 + if (window.XMLHttpRequest) {
22.18 + return new XMLHttpRequest();
22.19 + } else if(window.ActiveXObject) {
22.20 + return new ActiveXObject("Microsoft.XMLHTTP");
22.21 + } else {
22.22 + alert("Nepodporovaný prohlížeč.");
22.23 + return null;
22.24 + }
22.25 +}
22.26 +
22.27 +/** Náš AJAXový objekt. */
22.28 +var ajax = getXmlHttpRequestObject();
22.29 +
22.30 +function getMistnost() {
22.31 + return document.getElementById("odesilaciFormular").mistnost.value;
22.32 +}
22.33 +
22.34 +function getOd() {
22.35 + return document.getElementById("odesilaciFormular").od.value;
22.36 +}
22.37 +
22.38 +function getZprava() {
22.39 + return document.getElementById("odesilaciFormular").text.value;
22.40 +}
22.41 +
22.42 +function vymazTextZpravy() {
22.43 + document.getElementById("odesilaciFormular").text.value = "";
22.44 +}
22.45 +
22.46 +function ajaxOdesli() {
22.47 + if (ajax.readyState == 4 || ajax.readyState == 0) {
22.48 + ajax.open("POST", "?akce=chat&akceChat=odesli&mistnost=" + encodeURIComponent(getMistnost()) + "&od=" + encodeURIComponent(getOd()) + "&zprava=" + encodeURIComponent(getZprava()), true);
22.49 + ajax.onreadystatechange = function() {
22.50 + if (ajax.readyState == 4) {
22.51 + vymazTextZpravy();
22.52 + aktualizujVypisZprav();
22.53 + }
22.54 + };
22.55 + ajax.send(null);
22.56 + }
22.57 +}
22.58 +
22.59 +function aktualizujVypisZprav() {
22.60 + if (ajax.readyState == 4 || ajax.readyState == 0) {
22.61 + ajax.open("POST", "?akce=chat&akceChat=vypis&mistnost=" + encodeURIComponent(getMistnost()), true);
22.62 + ajax.onreadystatechange = function() {
22.63 + if (ajax.readyState == 4) {
22.64 + zpracujZpravy(ajax.responseXML);
22.65 + document.getElementById("vypisZprav").scrollTop = 100000;
22.66 + }
22.67 + };
22.68 + ajax.send(null);
22.69 + }
22.70 +}
22.71 +
22.72 +function ziskejVnitrekXML(data, element) {
22.73 + try {
22.74 + return data.getElementsByTagName(element)[0].firstChild.nodeValue;
22.75 + } catch (e) {
22.76 + return "";
22.77 + }
22.78 +}
22.79 +
22.80 +function zpracujZpravy(xmlOdpoved) {
22.81 + var vypisZprav = document.getElementById("vypisZprav");
22.82 + var zpravy = xmlOdpoved.getElementsByTagName("zprava");
22.83 + vypisZprav.innerHTML = "";
22.84 + var elementUl = document.createElement("ul");
22.85 + vypisZprav.appendChild(elementUl);
22.86 +
22.87 + for (i = 0; i < zpravy.length; i++) {
22.88 + var od = ziskejVnitrekXML(zpravy[i], "od");
22.89 + var text = ziskejVnitrekXML(zpravy[i], "text");
22.90 + var kdy = ziskejVnitrekXML(zpravy[i], "kdy");
22.91 + var overeny = ziskejVnitrekXML(zpravy[i], "overeny");
22.92 + poradoveCislo = ziskejVnitrekXML(zpravy[i], "poradoveCislo");
22.93 +
22.94 + var elementLi = document.createElement("li");
22.95 + elementLi.title = kdy;
22.96 +
22.97 + var elementOd = document.createElement("strong");
22.98 + elementOd.textContent = od;
22.99 + elementLi.appendChild(elementOd);
22.100 + elementLi.appendChild(document.createTextNode(": "));
22.101 +
22.102 + var elementText = document.createElement("span");
22.103 + elementText.textContent = text;
22.104 +
22.105 + /**
22.106 + * Ověřený je takový uživatel,
22.107 + * který se přihlásil normálně přes Jabber a vstoupil do místnosti pod svojí přezdívkou.
22.108 + * Uživatelé z webu jsou anonymové a připojují se k XMPP pod společným účtem.
22.109 + * Svoji přezdívku si vyplňují sami a přenášíme ji zvlášť.
22.110 + * Proto odlišíme tyto dvě skupiny uživatelů jinou barvou jejich příspěvku.
22.111 + */
22.112 + if (overeny == "true") {
22.113 + }
22.114 + // zprávu můžeme zvýraznit
22.115 + } else {
22.116 + elementText.style.color = "#444444";
22.117 + }
22.118 + elementLi.appendChild(elementText);
22.119 +
22.120 + elementUl.appendChild(elementLi);
22.121 + }
22.122 +}
22.123 +
22.124 +var t;
22.125 +
22.126 +function spustCasovac() {
22.127 + aktualizujVypisZprav();
22.128 +
22.129 + t = setTimeout(function () {
22.130 + aktualizujVypisZprav();
22.131 + spustCasovac();
22.132 + }, intervalObnovy);
22.133 +}
22.134 \ No newline at end of file
23.1 --- a/java/nekurak.net-web/web/styl.css Sun Jun 27 22:00:48 2010 +0200
23.2 +++ b/java/nekurak.net-web/web/styl.css Wed Jun 30 00:26:14 2010 +0200
23.3 @@ -128,6 +128,44 @@
23.4 max-width: 400px;
23.5 }
23.6
23.7 +#chat form {
23.8 + max-width: 666px;
23.9 +}
23.10 +
23.11 +input.chatOd {
23.12 + width: 120px;
23.13 +}
23.14 +
23.15 +input.chatText {
23.16 + width: 410px;
23.17 +}
23.18 +
23.19 +button.chatOdeslat {
23.20 + width: 80px;
23.21 +}
23.22 +
23.23 +#vypisZprav {
23.24 + width: 960px;
23.25 + height: 320px;
23.26 + overflow: auto;
23.27 +}
23.28 +
23.29 +#vypisZprav ul {
23.30 + list-style: none;
23.31 +}
23.32 +
23.33 +#chat .zprava h2 {
23.34 + font-size: medium;
23.35 + font-weight: bolder;
23.36 + display: inline;
23.37 +}
23.38 +
23.39 +#chat .autorDatum {
23.40 + font-size: smaller;
23.41 + color: gray;
23.42 + margin-left: 4px;
23.43 +}
23.44 +
23.45 input, textarea, select {
23.46 width:200px;
23.47 margin-left: 2px;
23.48 @@ -244,4 +282,4 @@
23.49 .komentar p {
23.50 margin-top: 8px;
23.51 margin-bottom: 8px;
23.52 -}
23.53 \ No newline at end of file
23.54 +}
24.1 --- a/java/nekurak.net-ws/nbproject/project.properties Sun Jun 27 22:00:48 2010 +0200
24.2 +++ b/java/nekurak.net-ws/nbproject/project.properties Wed Jun 30 00:26:14 2010 +0200
24.3 @@ -29,7 +29,7 @@
24.4 includes=**
24.5 j2ee.deploy.on.save=false
24.6 j2ee.platform=1.6-web
24.7 -j2ee.platform.classpath=
24.8 +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
24.9 j2ee.platform.embeddableejb.classpath=${j2ee.server.home}/lib/embedded/glassfish-embedded-static-shell.jar
24.10 j2ee.platform.wscompile.classpath=${j2ee.server.home}/modules/webservices-osgi.jar
24.11 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