/*
* Manager.java
*
* Created on November 22, 2004, 5:50 PM
*/
package pt.jkaiui.manager;
import javax.swing.JOptionPane;
import java.util.Collection;
import java.util.Iterator;
import java.util.logging.Logger;
import pt.jkaiui.JKaiUI;
import pt.jkaiui.core.Arena;
import pt.jkaiui.core.KaiConfig;
import pt.jkaiui.core.KaiString;
import pt.jkaiui.core.messages.*;
import pt.jkaiui.tools.log.ConfigLog;
import static pt.jkaiui.core.KaiConfig.ConfigTag.*;
/**
*
* @author pedro
*/
public class Manager {
private static ActionExecuter executer;
private Connection conn;
private static Logger _logger;
// String[] to find all I_InMessage interfaces.
// I would rather do this dynamically, but I don't know how
// to find all classes within a given package.
// To update this list use:
// egrep -c "implements .*I_InMessage" src/pt/jkaiui/core/messages/* | grep -v :0 | sed -e 's/src\///;s/.java:.*//;s/\//./g;s/\(.*\)/"\1",/'
private static final String[] IN_MESSAGES = {
"pt.jkaiui.core.messages.AddContact",
"pt.jkaiui.core.messages.AdminPrivileges",
"pt.jkaiui.core.messages.ArenaPing",
"pt.jkaiui.core.messages.ArenaPM",
"pt.jkaiui.core.messages.AttachEngine",
"pt.jkaiui.core.messages.Avatar",
"pt.jkaiui.core.messages.Chat",
"pt.jkaiui.core.messages.Chat2",
"pt.jkaiui.core.messages.ChatMode",
"pt.jkaiui.core.messages.ClientNotLoggedIn",
"pt.jkaiui.core.messages.ConnectedMessenger",
"pt.jkaiui.core.messages.ContactOffline",
"pt.jkaiui.core.messages.ContactOnline",
"pt.jkaiui.core.messages.ContactPing",
"pt.jkaiui.core.messages.DetachEngine",
"pt.jkaiui.core.messages.EngineHere",
"pt.jkaiui.core.messages.EngineInUse",
"pt.jkaiui.core.messages.JoinsChat",
"pt.jkaiui.core.messages.JoinsVector",
"pt.jkaiui.core.messages.KaiVectorIn",
"pt.jkaiui.core.messages.LeavesChat",
"pt.jkaiui.core.messages.LeavesVector",
"pt.jkaiui.core.messages.LoggedIn",
"pt.jkaiui.core.messages.ModeratorPrivileges",
"pt.jkaiui.core.messages.PM",
"pt.jkaiui.core.messages.RemoveContact",
"pt.jkaiui.core.messages.RemoveSubVector",
"pt.jkaiui.core.messages.Status",
"pt.jkaiui.core.messages.SubVector",
"pt.jkaiui.core.messages.SubVectorUpdate",
"pt.jkaiui.core.messages.UserData",
"pt.jkaiui.core.messages.UserSubVector",
"pt.jkaiui.core.messages.Metrics",
"pt.jkaiui.core.messages.LocalDevice",
"pt.jkaiui.core.messages.DhcpFailure",
"pt.jkaiui.core.messages.UserProfile",
"pt.jkaiui.core.messages.RemoteArenaDevice",
"pt.jkaiui.core.messages.CodePage",
"pt.jkaiui.core.messages.ArenaStatus",
"pt.jkaiui.core.messages.SessionKey",
"pt.jkaiui.core.messages.ConnectedArena"
};
/** Creates a new instance of Manager */
public Manager() {
_logger = ConfigLog.getLogger(this.getClass().getName());
executer = new ActionExecuter(this);
// LogFileinit();
}
public void connect(){
KaiConfig config = JKaiUI.getConfig();
_logger.fine("Discovering engine");
if(config.getConfigBoolean(AUTOMATICALLYDETECTED)) {
EngineFinder finder = new EngineFinder();
// SPLASH SCREEN WOULD BE GOOD HERE!!!
// Finding engines. Note: the argument given is the number of SECONDS to timeout
finder.spawnEngineReceivers(2);
Collection engines = finder.getEngines();
if(engines.size() == 0) {
boolean shouldRetry = JKaiUI.getMainUI().askRetry("MSG_NoEngineFound", "MSG_NoEngineFoundTitleMsg");
if(shouldRetry) {
JKaiUI.connect();
}
return;
} else if(engines.size() == 1) {
Iterator it = engines.iterator();
conn = new Connection((String)it.next(), 34522);
} else {
String[] engineArray = new String[engines.size()];
// Fill the array using the Collection's iterator
Iterator it = engines.iterator();
int traverseIndex = 0;
while(it.hasNext()) engineArray[traverseIndex++] = (String) it.next();
String choice = JKaiUI.getMainUI().openEnginePrompt(engineArray);
if(choice == null) return;
conn = new Connection(choice, 34522);
}
} else {
// User wants to manually specify a host and port
conn = new Connection(config.getConfigString(HOST), config.getConfigInt(PORT));
}
executer.execute(new DiscoverEngine());
}
public void send(I_OutMessage message){
if (message instanceof PMOut || message instanceof ArenaPMOut) {
try {
if (message instanceof PMOut) {
// conn.send(message.send().getBytes(JKaiUI.getChatManager().getSelectedEncoding(((PMOut) message).getUser().decode())));
conn.send(StringByteConverter.StringtoByteforPM(message.send(), ((PMOut) message).getUser().decode()));
}
if (message instanceof ArenaPMOut) {
// conn.send(message.send().getBytes(JKaiUI.getChatManager().getSelectedEncoding(((ArenaPMOut) message).getUser().decode())));
conn.send(StringByteConverter.StringtoByteforPM(message.send(), ((ArenaPMOut) message).getUser().decode()));
}
} catch (Exception e) {
System.out.println("manager send:" + e);
}
} else {
conn.send(StringByteConverter.StringtoByte(message.send()));
}
JKaiUI.getLogFileManager().println("All", "Send; " + message.send());
}
private Message parse(String s) throws UnsupportedMessageException {
Message message = null;
for( int i = 0; i < IN_MESSAGES.length; i++ ){
try{
I_InMessage parser = (I_InMessage) Class.forName(IN_MESSAGES[i]).newInstance();
message = parser.parse(s);
if (message != null)
return message;
}
catch (Exception e){
System.out.println("Manager parse:"+e);
_logger.severe("Could not find or initialize class " + IN_MESSAGES[i] + ": " + e.getMessage());
}
}
// if we got here, no message was found
throw new UnsupportedMessageException();
}
public void process(byte[] b){
String s= StringByteConverter.BytetoString(b).trim();
// String s = StringValidator.CheckandReturnCorrectString(b).trim();
JKaiUI.getLogFileManager().println("All", "Receive; " + s);
Message message = null;
try {
message = parse(s);
if (message instanceof PM) {
message = parse(StringByteConverter.BytetoStringforPM(b, ((PM) message).getUser().decode()).trim());
}
if (message instanceof ArenaPM) {
message = parse(StringByteConverter.BytetoStringforPM(b, ((ArenaPM) message).getUser().decode()).trim());
}
}
catch (UnsupportedMessageException e){
System.out.println("Manager process:"+e);
_logger.warning("Message not supported: " + s);
return;
}
// _logger.finest("Found message: " + message);
try {
executer.execute(message);
} catch (Exception e) {
System.out.println("Manage process:" + e);
}
}
public static ActionExecuter getExecuter(){
return executer;
}
public static void enterArena(Arena arena){
// Check for pass
String pass = "";
if (arena.isPass())
pass = JOptionPane.showInputDialog(null, java.util.ResourceBundle.getBundle("pt/jkaiui/ui/Bundle").getString("LBL_AskForPass"));
KaiVectorOut vector = new KaiVectorOut();
vector.setVector(new KaiString(arena.getVector()));
vector.setPassword(new KaiString(pass));
getExecuter().execute(vector);
}
}