package com.coder.client; import java.io.IOException; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JOptionPane; import com.coder.client.LoginDialog.LoginDialogAction; import com.coder.server.CoderServer; import com.coder.server.message.CoderMessage; import com.coder.server.message.ProjectListData; import zutil.log.LogUtil; public class CoderClient extends Thread{ public static final Logger logger = LogUtil.getLogger(); private String url; private int port; private Session session; private ProjectEditorWindow projectEditorWindow; public CoderClient(String url, int port) { this.url = url; this.port = port; this.projectEditorWindow = new ProjectEditorWindow("CoderClient"); super.start(); } public void run(){ //save the previously typed user name String username = ""; //keep track of the number of connection retries to the server int connectionRetries = 0; while(true){ //close previous session if applicable closeCurrentSession(); //setup a new session if(connectionRetries > 0){ logger.info("This is reconnection try number: " + connectionRetries); } this.session = Session.setupConnection(url, port); if(session == null){ logger.info("Could not setup a connection to " + url + ":" + port); connectionRetries++; if(connectionRetries > 5){ //stop trying to connect logger.severe("Was not able to conenct to the remote host."); break; }else{ //wait for awhile and try to connect one more logger.info("Will retry to connect once more in 2 seconds."); try { Thread.sleep(2000); } catch (InterruptedException e) { } continue; } } //ask for username and password in a dialog window LoginDialog loginDialog = new LoginDialog(username, null); loginDialog.setVisible(true); //blocking loginDialog.dispose(); if(loginDialog.getAction() == LoginDialogAction.CANCEL){ logger.info("Login dialog closed or canceled by the user. terminating."); break; } //authenticate the user username = loginDialog.getUsername(); String password = new String(loginDialog.getPassword()); boolean authenticated = session.authenticate(username, password); if(!authenticated){ JOptionPane.showMessageDialog(null, "Wrong username or password", "Authentication Failed", JOptionPane.INFORMATION_MESSAGE); logger.info("Authentication failed: wrong username or password"); continue; } //resister a message listener to the session session.addCoderMessageReceivedListener(new CoderMessageReceivedListener() { @Override public void projectListRspReceived(Map projectListRsp) { //TODO } }); //start receiving traffic from the server session.start(); //add a listener to forward messages from the editor GUI to the server this.projectEditorWindow.addMessageSentListener(new GUIMessageSentListener(){ @Override public void sendMessage(CoderMessage msg) { try { session.send(msg); } catch (IOException e) { logger.log(Level.SEVERE, "could not forward message from editor to the server", e); } } }); //show the user the editor GUI this.projectEditorWindow.setVisible(true); try {Thread.sleep(1000);} catch (InterruptedException e) {} //wait here until the session is closed for some reason while(session.isConnected()){ Thread.yield(); } //hide the main GUI logger.info("The socket was closed."); this.projectEditorWindow.setVisible(false); Thread.yield(); } logger.info("The program till now terminate"); closeCurrentSession(); this.projectEditorWindow.dispose(); System.exit(0); } private void closeCurrentSession(){ if(this.session != null){ session.close(); session = null; } } public static void main(String[] args){ int port = CoderServer.SERVER_PORT; new CoderClient("127.0.0.1", port); } }