package org.jivesoftware.openfire.plugin.gojara.messagefilter.processors;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jivesoftware.openfire.interceptor.PacketRejectedException;
import org.jivesoftware.openfire.plugin.gojara.sessions.GojaraAdminManager;
import org.jivesoftware.openfire.plugin.gojara.sessions.TransportSessionManager;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;
public class GojaraAdminProcessor extends AbstractRemoteRosterProcessor {
private TransportSessionManager transportSessionManager = TransportSessionManager.getInstance();
private GojaraAdminManager gojaraAdminManager = GojaraAdminManager.getInstance();
public GojaraAdminProcessor() {
Log.info("Created GojaraAdminProcessor");
}
/**
* Here we process the response of the remote command sent to Spectrum. We have to identify what kind of response it
* is, as no tag for the command being responded is being sent. Currently these commands are used in Gojara
* TransportSessionManager: online_users ( Chatmsg of online users for specific transport), usernames seperated by
* newlines
*/
@Override
public void process(Packet packet, String subdomain, String to, String from) throws PacketRejectedException {
Message message = (Message) packet;
// handle different commands
Log.debug("Intercepted spectrum message: " + message.toString());
String command = packet.getID();
if (command.equals("online_users")) {
handleOnlineUsers(message, subdomain);
} else if (command.equals("unregister")) {
handleUnregister(message, subdomain);
} else if (command.equals("config_check")) {
handleConfigCheck(subdomain);
} else if (command.equals("uptime")) {
handleStatistic(message, subdomain, "uptime");
} else if (command.equals("messages_from_xmpp")) {
handleStatistic(message, subdomain, "messages_from_xmpp");
} else if (command.equals("messages_to_xmpp")) {
handleStatistic(message, subdomain, "messages_to_xmpp");
} else if (command.equals("used_memory")) {
handleStatistic(message, subdomain, "used_memory");
} else if (command.equals("average_memory_per_user")) {
handleStatistic(message, subdomain, "average_memory_per_user");
}
}
private void handleOnlineUsers(Message message, String subdomain) {
Log.debug("Found online_users command!");
String body = message.getBody();
if (body.equals("0") || body.startsWith("Unknown command."))
return;
String[] content = message.getBody().split("\\r?\\n");
for (String user : content) {
JID userjid = new JID(user);
transportSessionManager.connectUserTo(subdomain, userjid.getNode());
}
}
private void handleUnregister(Message message, String subdomain) {
Log.debug("Found unregister command! ");
String body = message.getBody();
Pattern p = Pattern.compile("^User '(.+)' unregistered.");
Matcher m = p.matcher(body);
if (m.matches()) {
String user = m.group(1);
JID userJid = new JID(user);
transportSessionManager.removeRegistrationOfUserFromDB(subdomain, userJid.getNode());
Log.debug("unregister command was successfull for user: " + userJid.getNode());
}
}
private void handleConfigCheck(String subdomain) {
gojaraAdminManager.confirmGatewayConfig(subdomain);
Log.info("Confirm config_check for " + subdomain);
}
private void handleStatistic(Message message, String subdomain, String statistic) {
String body = message.getBody();
// we dont catch this with exception so we can see what might go wrong. Sometimes S2 responded not knowing the
// command but i dont really know why
if (body.startsWith("Unknown command."))
return;
int value;
try {
value = Integer.parseInt(body);
gojaraAdminManager.putStatisticValue(subdomain, statistic, value);
} catch (Exception e) {
e.printStackTrace();
}
}
}