import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Random; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.xml.DomDriver; public class ChatClient { //public static ChatRoom chatroom = null; public static Map chatrooms = new HashMap(); public static RoomRegistry room_registry = null; /** * @param args */ public static void main(String[] args) { BufferedReader infile=null; String ior = ""; String xml_file = "roomregistry.xml"; String username = "timw"; if (args.length == 1){ username = args[0]; } /////////////////// // ROOM REGISTRY // /////////////////// StringBuffer xml = new StringBuffer(); try { echo("Lendo o arquivo "+xml_file); infile = new BufferedReader(new FileReader(xml_file)); String str; while ((str = infile.readLine()) != null) { xml.append(str+"\n"); } infile.close(); } catch (IOException e) { e.printStackTrace(); }finally{ try { infile.close(); } catch (IOException e) { } echo("leitura finalizada"); } XStream xstream = new XStream(new DomDriver()); xstream.alias("reference", ObjectXmlReference.class); ObjectXmlReference roomregistry_reference = (ObjectXmlReference) xstream.fromXML(xml.toString()); ObjectReference roomregistry_ref = new ObjectReference (roomregistry_reference.getObject(), roomregistry_reference.getHost(), roomregistry_reference.getPort()); room_registry = new RoomRegistryStub(roomregistry_ref); ////////////// //CHATUSER /// ////////////// String server_host = "localhost"; Random r = new Random(); int server_port = (r.nextInt(2000) + 5000); echo("Iniciando thread..."); TCPAddress addr = new TCPAddress (server_host, server_port); ORB.instance().address(addr); ChatUser chatuser = null; chatuser = new ChatUserImpl(username); echo("criado skel para o ChatUser -> "+chatuser.objectReference().stringify()); ////////////////////////////////// //THREAD PARA RECEBER CONEXOES /// ////////////////////////////////// ChatClientThread thread = new ChatClientThread(chatuser, username, server_host, server_port); thread.start(); //////////////////////////// //TRATAMENTO DOS COMANDOS // //////////////////////////// /* List array_comandos = new ArrayList(); array_comandos.add("$join rio"); array_comandos.add("testando 1..2...3"); array_comandos.add("$rooms"); array_comandos.add("$leave rio"); */ ChatRoom chatroom = null; String command_line = ""; String patternStr = "^\\$(\\w+)(\\s+(.*))?$"; Pattern pattern = Pattern.compile(patternStr); BufferedReader in = null; while (true) { //command_line = (String) array_comandos.get(i); in = new BufferedReader(new InputStreamReader(System.in)); try { command_line = in.readLine(); } catch (IOException e1) { e1.printStackTrace(); } Matcher matcher = pattern.matcher(command_line); boolean matchFound = matcher.find(); String command; String argument; if (matchFound) { command = matcher.group(1); argument = matcher.group(2); //echo("command: "+command); //echo("argument: "+argument); if (argument!=null) argument = argument.trim(); if (command.equals("rooms")){ //lista sala criadas Map salas_criadas = ChatClient.room_registry.getRooms(); prompt("salas criadas:"); Iterator iterator = salas_criadas.keySet().iterator(); while (iterator.hasNext()) { String name = (String) iterator.next(); prompt(name); } }else if (command.equals("join")) { //entra numa sala e permite criar se nao existe String name = argument; chatroom = ChatClient.room_registry.findRoom(name.trim()); if (chatroom == null){ //cria sala? try { String str = ""; str = question("Sala "+name+" nao existe... deseja criar? [s/n]"); if (str.trim().toLowerCase().equals("s")){ prompt("a sala ["+name+"] sera criada"); chatroom = ChatClient.room_registry.newRoom(name); registerRoom(name, chatroom); //Join no ChatRoom if (! chatroom.join(username, chatuser)) { prompt("Nao foi possivel entrar na sala "+name); } }else{ prompt("a sala ["+name+"] nao sera criada"); } } catch (IOException e) { } }else{ registerRoom(name, chatroom); //Join no ChatRoom if (! chatroom.join(username, chatuser)) { prompt("Nao foi possivel entrar na sala "+name); } } }else if (command.equals("leave")) { //sai de uma sala String name = argument; if (name != null) { if (chatroom == null) { prompt("Voce precisa entrar em uma sala antes!"); }else{ chatroom = ChatClient.getRoom(name); if (! chatroom.leave(username)) { prompt("Nao foi possivel sair da sala "+name); }else{ unRegisterRoom(name); chatroom = null; } } } else { prompt("Voce precisa informar o nome da sala que quer sair"); } }else if (command.equals("private")) { //lista usuarios da sala atual e permite selecionar um para batepapo privado if (chatroom == null) { prompt("Voce precisa entrar em uma sala antes!"); }else{ //Listar os usuarios Map user_na_sala = chatroom.getUsers(); prompt("Escolha um usuario da sala "+chatroom.getName()+" para enviar mensagem"); Iterator iterator = user_na_sala.keySet().iterator(); int i = 0; List lista_usuarios = new ArrayList(); ObjectReference obj_ref_aux = null; ChatUser chatuser_aux = null; String username_aux = ""; while (iterator.hasNext()) { String key = (String) iterator.next(); obj_ref_aux = (ObjectReference) user_na_sala.get(key); if (obj_ref_aux.getHost().equals(server_host) && obj_ref_aux.getPort() == server_port) { username_aux = username; chatuser_aux = null; }else{ chatuser_aux = new ChatUserStub(obj_ref_aux); username_aux = chatuser_aux.getUsername(); } prompt((i+1)+" => "+username_aux); lista_usuarios.add(chatuser_aux); i++; } try { while (true) { String user_privado_id = question("Digite o numero do usuario para envio de mensagem privada:"); prompt("Usuario escolhido: "+user_privado_id); int indice = Integer.valueOf(user_privado_id) - 1; if (indice == -1) { prompt("saindo do envio privado de mensagens"); break; } chatuser_aux = (ChatUser) lista_usuarios.get(indice); if (chatuser_aux == null) { prompt("Voce escolheu a si proprio!!"); }else{ String msg = question("Digite a mensagem para envio:"); chatuser_aux.notifyMessage(username, msg); break; } } } catch (IOException e) { prompt("Erro no envio: "+e.getMessage()); e.printStackTrace(); break; } catch (NumberFormatException e) { prompt("Digite um numero valido"); } catch (ArrayIndexOutOfBoundsException e) { prompt("Digite um numero valido"); } } }else if (command.equals("quit")) { //encerra a aplicacao if (chatroom != null) { String name = ""; Iterator iterator = ChatClient.chatrooms.keySet().iterator(); while (iterator.hasNext()) { name = (String) iterator.next(); prompt("Sala para sair: "+name); } chatroom = ChatClient.getRoom(name); if (! chatroom.leave(username)) { prompt("Nao foi possivel sair da sala "+name); }else{ unRegisterRoom(name); chatroom = null; } } prompt("Good-bye!"); System.exit(0); } }else{ //envio de mensagem de texto //echo("envio do texto: ["+command_line+"]"); if (chatroom == null) { prompt("Voce precisa entrar em uma sala antes!"); }else{ chatroom.send(username, command_line); } } }//fim do while } public static void echo(String msg) { System.out.println("[ChatClient] "+msg); } public static void prompt(String msg) { System.out.println("> "+msg); } public static void registerRoom(String name, ChatRoom chatroom){ //echo("sala registrada: "+name); ChatClient.chatrooms.put(name, chatroom); } public static void unRegisterRoom(String name){ ChatClient.chatrooms.remove(name); } public static ChatRoom getRoom(String name) { return (ChatRoom) ChatClient.chatrooms.get(name); } public static String question(String question) throws IOException { String answer = ""; BufferedReader in = null; prompt(question); in = new BufferedReader(new InputStreamReader(System.in)); String str = ""; answer = in.readLine(); return answer; } } class ChatClientThread extends Thread { private ChatUser _chatuser; private String _username; private String _server_host = "localhost"; private int _server_port = 0; public ChatClientThread(ChatUser chatuser, String username, String server_host, int server_port) { _chatuser = chatuser; _username = username; _server_host = server_host; _server_port = server_port; } public void run() { echo("username: "+_username); echo("ORB Running on "+_server_host+":"+_server_port); ORB.instance().run(); } private void echo(String msg) { System.out.println("[ChatClientThread] "+msg); } } //Exemplos /* Account account = new AccountStub(ref); System.out.println("deposit"); account.deposit (700); System.out.println("Client: balance is " + account.balance()); System.out.println("withdraw"); account.withdraw (50); System.out.println("Client: balance is " + account.balance()); */ /* try { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String str = ""; while (str != null) { System.out.print("> prompt "); str = in.readLine(); process(str); } } catch (IOException e) { } */