XMPP chat – první verze. 16. díl
authorFrantišek Kučera <franta-hg@frantovo.cz>
Wed Jun 30 00:26:14 2010 +0200 (2010-06-30)
changeset 1498238cdb4113a
parent 148 784b3945c440
child 150 2c9fb7563da6
XMPP chat – první verze.
java/nekurak.net-ejb/nbproject/build-impl.xml
java/nekurak.net-ejb/nbproject/genfiles.properties
java/nekurak.net-ejb/nbproject/project.properties
java/nekurak.net-ejb/nbproject/project.xml
java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/Mistnost.java
java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/MistnostPripojena.java
java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/Nastaveni.java
java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/Spojeni.java
java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/SpravceNastaveni.java
java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/chat/UcetRobota.java
java/nekurak.net-ejb/src/java/cz/frantovo/nekurak/ejb/ChatEJB.java
java/nekurak.net-lib/src/cz/frantovo/nekurak/dto/ZpravaChatu.java
java/nekurak.net-lib/src/cz/frantovo/nekurak/ejb/ChatRemote.java
java/nekurak.net-lib/src/cz/frantovo/nekurak/preklady_cs.properties
java/nekurak.net-lib/src/cz/frantovo/nekurak/web/HledacSluzby.java
java/nekurak.net-rest/nbproject/project.properties
java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/chat/OdesilacZprav.java
java/nekurak.net-web/src/java/cz/frantovo/nekurak/web/chat/VypisZprav.java
java/nekurak.net-web/web/WEB-INF/casti/chat.jsp
java/nekurak.net-web/web/WEB-INF/tags/nekurak/stranka.tag
java/nekurak.net-web/web/index.jsp
java/nekurak.net-web/web/js/chat.js
java/nekurak.net-web/web/styl.css
java/nekurak.net-ws/nbproject/project.properties
     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