From 75d80dc433348435c1f8e11fafb0d1deda1ca793 Mon Sep 17 00:00:00 2001 From: Vitaly Takmazov Date: Tue, 26 Jan 2016 20:09:27 +0300 Subject: import s2s component --- .../java/com/juick/xmpp/s2s/XMPPComponent.java | 191 +++++++++++++++++++++ 1 file changed, 191 insertions(+) create mode 100644 src/main/java/com/juick/xmpp/s2s/XMPPComponent.java (limited to 'src/main/java/com/juick/xmpp/s2s/XMPPComponent.java') diff --git a/src/main/java/com/juick/xmpp/s2s/XMPPComponent.java b/src/main/java/com/juick/xmpp/s2s/XMPPComponent.java new file mode 100644 index 00000000..d2504c25 --- /dev/null +++ b/src/main/java/com/juick/xmpp/s2s/XMPPComponent.java @@ -0,0 +1,191 @@ +package com.juick.xmpp.s2s; + +import com.juick.xmpp.Stanza; +import com.juick.xmpp.StanzaChild; +import com.juick.xmpp.extensions.JuickMessage; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import java.io.FileInputStream; +import java.io.IOException; +import java.sql.DriverManager; +import java.util.Collections; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Properties; + +/** + * + * @author ugnich + */ +public class XMPPComponent implements ServletContextListener { + + public static String HOSTNAME = null; + public static String COMPONENTNAME = null; + public static String LOGFILE = null; + public static String STATSFILE = null; + public static ConnectionRouter connRouter; + static final List inConnections = Collections.synchronizedList(new ArrayList()); + static final List outConnections = Collections.synchronizedList(new ArrayList()); + static final List outCache = Collections.synchronizedList(new ArrayList()); + static final Integer sqlSync = 0; + static java.sql.Connection sql; + final public static HashMap childParsers = new HashMap(); + + public static void main(String[] args) { + new XMPPComponent().start(); + } + + public static void addConnectionIn(ConnectionIn c) { + synchronized (inConnections) { + inConnections.add(c); + } + } + + public static void addConnectionOut(ConnectionOut c) { + synchronized (outConnections) { + outConnections.add(c); + } + } + + public static void removeConnectionIn(ConnectionIn c) { + synchronized (inConnections) { + inConnections.remove(c); + } + } + + public static void removeConnectionOut(ConnectionOut c) { + synchronized (outConnections) { + outConnections.remove(c); + } + } + + public static String getFromCache(String hostname) { + CacheEntry ret = null; + synchronized (outCache) { + for (Iterator i = outCache.iterator(); i.hasNext();) { + CacheEntry c = i.next(); + if (c.hostname != null && c.hostname.equals(hostname)) { + ret = c; + i.remove(); + break; + } + } + } + return (ret != null) ? ret.xml : null; + } + + public static ConnectionOut getConnectionOut(String hostname, boolean needReady) { + synchronized (outConnections) { + for (Iterator i = outConnections.iterator(); i.hasNext();) { + ConnectionOut c = i.next(); + if (c.to != null && c.to.equals(hostname) && (!needReady || c.streamReady)) { + return c; + } + } + } + return null; + } + + public static ConnectionIn getConnectionIn(String streamID) { + synchronized (inConnections) { + for (Iterator i = inConnections.iterator(); i.hasNext();) { + ConnectionIn c = i.next(); + if (c.streamID != null && c.streamID.equals(streamID)) { + return c; + } + } + } + return null; + } + + public static void sendOut(Stanza s) { + sendOut(s.to.Host, s.toString()); + } + + public static void sendOut(String hostname, String xml) { + boolean haveAnyConn = false; + + ConnectionOut connOut = null; + synchronized (outConnections) { + for (Iterator i = outConnections.iterator(); i.hasNext();) { + ConnectionOut c = i.next(); + if (c.to != null && c.to.equals(hostname)) { + if (c.streamReady) { + connOut = c; + break; + } else { + haveAnyConn = true; + break; + } + } + } + } + if (connOut != null) { + try { + connOut.sendStanza(xml); + } catch (IOException e) { + System.err.println("STREAM TO " + connOut.to + " " + connOut.streamID + " ERROR: " + e.toString()); + } + return; + } + + boolean haveCache = false; + synchronized (outCache) { + for (Iterator i = outCache.iterator(); i.hasNext();) { + CacheEntry c = i.next(); + if (c.hostname != null && c.hostname.equals(hostname)) { + c.xml += xml; + c.tsUpdated = System.currentTimeMillis(); + haveCache = true; + break; + } + } + if (!haveCache) { + outCache.add(new CacheEntry(hostname, xml)); + } + } + + if (!haveAnyConn) { + new Thread(new ConnectionOut(hostname)).start(); + } + } + + public void start() { + try { + Properties conf = new Properties(); + conf.load(new FileInputStream("/etc/juick/s2s.conf")); + HOSTNAME = conf.getProperty("hostname"); + COMPONENTNAME = conf.getProperty("componentname"); + LOGFILE = conf.getProperty("logfile"); + STATSFILE = conf.getProperty("statsfile"); + + Class.forName("com.mysql.jdbc.Driver"); + sql = DriverManager.getConnection("jdbc:mysql://localhost/juick?autoReconnect=true&user=" + conf.getProperty("mysql_username", "") + "&password=" + conf.getProperty("mysql_password", "")); + + Runtime.getRuntime().addShutdownHook(new Shutdown()); + + childParsers.put(JuickMessage.XMLNS, new JuickMessage()); + + connRouter = new ConnectionRouter(); + new Thread(connRouter).start(); + new Thread(new ConnectionListener()).start(); + new Thread(new CleaningUp()).start(); + + } catch (Exception e) { + System.err.println(e); + } + } + + @Override + public void contextInitialized(ServletContextEvent sce) { + + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + + } +} -- cgit v1.2.3