aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/juick/xmpp/s2s/XMPPComponent.java
diff options
context:
space:
mode:
authorGravatar Vitaly Takmazov2016-01-26 20:09:27 +0300
committerGravatar Vitaly Takmazov2016-01-26 20:09:27 +0300
commit75d80dc433348435c1f8e11fafb0d1deda1ca793 (patch)
treec06a67e2bcf6e10bf12f7caabcd43280df2d91ab /src/main/java/com/juick/xmpp/s2s/XMPPComponent.java
parentbace08c34252bffd3a575ca86b2b2f420165a81b (diff)
import s2s component
Diffstat (limited to 'src/main/java/com/juick/xmpp/s2s/XMPPComponent.java')
-rw-r--r--src/main/java/com/juick/xmpp/s2s/XMPPComponent.java191
1 files changed, 191 insertions, 0 deletions
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<ConnectionIn> inConnections = Collections.synchronizedList(new ArrayList<ConnectionIn>());
+ static final List<ConnectionOut> outConnections = Collections.synchronizedList(new ArrayList<ConnectionOut>());
+ static final List<CacheEntry> outCache = Collections.synchronizedList(new ArrayList<CacheEntry>());
+ static final Integer sqlSync = 0;
+ static java.sql.Connection sql;
+ final public static HashMap<String, StanzaChild> childParsers = new HashMap<String, StanzaChild>();
+
+ 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<CacheEntry> 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<ConnectionOut> 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<ConnectionIn> 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<ConnectionOut> 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<CacheEntry> 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) {
+
+ }
+}