aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/juick/xmpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/juick/xmpp')
-rw-r--r--src/main/java/com/juick/xmpp/s2s/XMPPComponent.java110
1 files changed, 65 insertions, 45 deletions
diff --git a/src/main/java/com/juick/xmpp/s2s/XMPPComponent.java b/src/main/java/com/juick/xmpp/s2s/XMPPComponent.java
index d2504c25..ff4ec3e6 100644
--- a/src/main/java/com/juick/xmpp/s2s/XMPPComponent.java
+++ b/src/main/java/com/juick/xmpp/s2s/XMPPComponent.java
@@ -8,13 +8,14 @@ import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.io.FileInputStream;
import java.io.IOException;
+import java.sql.Driver;
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;
+import java.sql.SQLException;
+import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.logging.Level;
+import java.util.logging.Logger;
/**
*
@@ -22,21 +23,21 @@ import java.util.Properties;
*/
public class XMPPComponent implements ServletContextListener {
+ private static final Logger LOGGER = Logger.getLogger(XMPPComponent.class.getName());
+
+ ExecutorService executorService;
+
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 List<ConnectionIn> inConnections = Collections.synchronizedList(new ArrayList<>());
+ static final List<ConnectionOut> outConnections = Collections.synchronizedList(new ArrayList<>());
+ static final List<CacheEntry> outCache = Collections.synchronizedList(new ArrayList<>());
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();
- }
+ final public static HashMap<String, StanzaChild> childParsers = new HashMap<>();
public static void addConnectionIn(ConnectionIn c) {
synchronized (inConnections) {
@@ -79,8 +80,7 @@ public class XMPPComponent implements ServletContextListener {
public static ConnectionOut getConnectionOut(String hostname, boolean needReady) {
synchronized (outConnections) {
- for (Iterator<ConnectionOut> i = outConnections.iterator(); i.hasNext();) {
- ConnectionOut c = i.next();
+ for (ConnectionOut c : outConnections) {
if (c.to != null && c.to.equals(hostname) && (!needReady || c.streamReady)) {
return c;
}
@@ -91,8 +91,7 @@ public class XMPPComponent implements ServletContextListener {
public static ConnectionIn getConnectionIn(String streamID) {
synchronized (inConnections) {
- for (Iterator<ConnectionIn> i = inConnections.iterator(); i.hasNext();) {
- ConnectionIn c = i.next();
+ for (ConnectionIn c : inConnections) {
if (c.streamID != null && c.streamID.equals(streamID)) {
return c;
}
@@ -110,8 +109,7 @@ public class XMPPComponent implements ServletContextListener {
ConnectionOut connOut = null;
synchronized (outConnections) {
- for (Iterator<ConnectionOut> i = outConnections.iterator(); i.hasNext();) {
- ConnectionOut c = i.next();
+ for (ConnectionOut c : outConnections) {
if (c.to != null && c.to.equals(hostname)) {
if (c.streamReady) {
connOut = c;
@@ -134,8 +132,7 @@ public class XMPPComponent implements ServletContextListener {
boolean haveCache = false;
synchronized (outCache) {
- for (Iterator<CacheEntry> i = outCache.iterator(); i.hasNext();) {
- CacheEntry c = i.next();
+ for (CacheEntry c : outCache) {
if (c.hostname != null && c.hostname.equals(hostname)) {
c.xml += xml;
c.tsUpdated = System.currentTimeMillis();
@@ -153,39 +150,62 @@ public class XMPPComponent implements ServletContextListener {
}
}
- 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");
+ @Override
+ public void contextInitialized(ServletContextEvent sce) {
- 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", ""));
+ LOGGER.info("component initialized");
+ executorService = Executors.newSingleThreadExecutor();
+ executorService.submit(() -> {
+ Properties conf = new Properties();
+ try {
+ conf.load(new FileInputStream("/etc/juick/s2s.conf"));
+ HOSTNAME = conf.getProperty("hostname");
+ COMPONENTNAME = conf.getProperty("componentname");
+ LOGFILE = conf.getProperty("logfile");
+ STATSFILE = conf.getProperty("statsfile");
- Runtime.getRuntime().addShutdownHook(new Shutdown());
+ 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", ""));
- childParsers.put(JuickMessage.XMLNS, new JuickMessage());
+ Runtime.getRuntime().addShutdownHook(new Shutdown());
- connRouter = new ConnectionRouter();
- new Thread(connRouter).start();
- new Thread(new ConnectionListener()).start();
- new Thread(new CleaningUp()).start();
+ childParsers.put(JuickMessage.XMLNS, new JuickMessage());
- } catch (Exception e) {
- System.err.println(e);
- }
+ connRouter = new ConnectionRouter();
+ new Thread(connRouter).start();
+ new Thread(new ConnectionListener()).start();
+ new Thread(new CleaningUp()).start();
+ } catch (IOException | ClassNotFoundException | SQLException e) {
+ LOGGER.log(Level.SEVERE, "XMPPComponent error", e);
+ }
+ });
}
- @Override
- public void contextInitialized(ServletContextEvent sce) {
- }
@Override
public void contextDestroyed(ServletContextEvent sce) {
-
+ // Now deregister JDBC drivers in this context's ClassLoader:
+ // Get the webapp's ClassLoader
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ // Loop through all drivers
+ Enumeration<Driver> drivers = DriverManager.getDrivers();
+ while (drivers.hasMoreElements()) {
+ Driver driver = drivers.nextElement();
+ if (driver.getClass().getClassLoader() == cl) {
+ // This driver was registered by the webapp's ClassLoader, so deregister it:
+ try {
+ LOGGER.info(String.format("Deregistering JDBC driver %s", driver.toString()));
+ DriverManager.deregisterDriver(driver);
+ } catch (SQLException ex) {
+ LOGGER.log(Level.SEVERE, String.format("Error deregistering JDBC driver %s", driver), ex);
+ }
+ } else {
+ // driver was not registered by the webapp's ClassLoader and may be in use elsewhere
+ LOGGER.log(Level.SEVERE, String.format("Not deregistering JDBC driver %s as it does not belong to this webapp's ClassLoader", driver));
+ }
+ }
+ executorService.shutdown();
+ LOGGER.info("component destroyed");
}
}