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.Session; import com.coder.client.gui.editor.EditorWindow; import com.coder.client.gui.editor.EditorWindowListener; import com.coder.client.gui.login.LoginDialog; import com.coder.client.gui.login.LoginDialogListener; import com.coder.client.gui.selectProject.SelectProjectDialog; import com.coder.client.gui.selectProject.SelectProjectDialogListener; import com.coder.client.gui.selectServer.SelectServerDialog; import com.coder.client.gui.selectServer.SelectServerDialogListener; import com.coder.server.CoderServer; import com.coder.server.message.CoderMessage; import com.coder.server.message.ConfigData; import com.coder.server.message.ProjectListData; import com.coder.server.message.ProjectListReqMsg; import com.coder.server.message.ProjectRspMsg; import zutil.log.CompactLogFormatter; import zutil.log.LogUtil; import javafx.application.Application; import javafx.stage.Stage; public class CoderClient extends Application{ public static final Logger logger = LogUtil.getLogger(); private Session session; private Stage mainStage; //GUI elements private EditorWindow editorWindow; private LoginDialog loginDialog; private SelectProjectDialog selectProjectDialog; private SelectServerDialog selectServerDialog; //state variables private String serverURL = null; private int serverPort = CoderServer.SERVER_PORT; private String username = null; private char[] password = null; public static void main(String[] args) { Application.launch(args); } @Override public void start(Stage mainStage) throws Exception { //setup logging LogUtil.setGlobalLevel(Level.INFO); LogUtil.setGlobalFormatter(new CompactLogFormatter()); //parse program arguments Map params = this.getParameters().getNamed(); for(String key : params.keySet()){ String value = params.get(key); if(key.equals("username")){ this.username = value; }else if(key.equals("password")){ this.password = value.toCharArray(); }else if(key.equals("url")){ this.serverURL = value; }else if(key.equals("port")){ try{ this.serverPort = Integer.parseInt(value); }catch(NumberFormatException e){ logger.warning("port argument to program is not of a integer type. using default port."); } } } if(this.username == null){ //ignore the password if no username was set this.password = null; } //loading GUI this.mainStage = mainStage; mainStage.setTitle("CoderClient"); try{ setupSelectServerDialog(); setupLoginDialog(); setupSelectProjectDialog(); setupEditWindow(); }catch(IOException e){ logger.log(Level.SEVERE, "could not load all GUI elements", e); } //start program logic selectServerDialog.showOnStage(mainStage); } private void setupSelectServerDialog() throws IOException{ this.selectServerDialog = new SelectServerDialog(); this.selectServerDialog.addSelectProjectDialogListener(new SelectServerDialogListener() { @Override public void willShow() { closeCurrentSession(); selectServerDialog.setServerAddress(serverURL); selectServerDialog.setServerPort(serverPort); } @Override public void cancel() { logger.info("terminating"); System.exit(0); } @Override public void connect(String address, int port) { //selectServerDialog.hide(); serverURL = address; serverPort = port; //connect session session = Session.setupConnection(serverURL, serverPort); if(session == null){ logger.warning("Could not setup a connection to " + serverURL + ":" + port); serverURL = null; selectServerDialog.showOnStage(mainStage); }else{ loginDialog.showOnStage(mainStage); } } }); } private void setupLoginDialog() throws IOException { this.loginDialog = new LoginDialog(); this.loginDialog.addLoginDialogListener(new LoginDialogListener(){ @Override public void willShow() { loginDialog.setUsername(username); loginDialog.setPassword(password); } @Override public void cancel() { serverURL = null; serverPort = CoderServer.SERVER_PORT; selectServerDialog.showOnStage(mainStage); } @Override public void login(String uname, char[] paswd) { username = uname; password = paswd; //authenticate session boolean authenticated = session.authenticate(username, password); if(!authenticated){ JOptionPane.showMessageDialog(null, "Wrong username or password", "Authentication Failed", JOptionPane.INFORMATION_MESSAGE); logger.severe("Authentication failed: wrong username or password"); password = null; loginDialog.showOnStage(mainStage); } setupSessionListener(); //resister a message listener to the session session.start(); //start receiving traffic from the server selectProjectDialog.showOnStage(mainStage); } private void setupSessionListener(){ session.addCoderMessageReceivedListener(new CoderMessageReceivedListener() { @Override public void projectListRspReceived(Map projectListRsp) { for(String projectName : projectListRsp.keySet()){ ProjectListData projectData = projectListRsp.get(projectName); selectProjectDialog.addProjectToList(projectName, projectData); } } @Override public void projectRspReceived(ProjectRspMsg projectRspMsg) { // TODO Auto-generated method stub } @Override public void projectTypeRspReceived(Map projectTypeRsp) { // TODO Auto-generated method stub } }); } }); } private void setupSelectProjectDialog() throws IOException { this.selectProjectDialog = new SelectProjectDialog(); this.selectProjectDialog.addSelectProjectDialogListener(new SelectProjectDialogListener() { @Override public void willShow() { selectProjectDialog.clearProjectList(); sendProjectListReq(); } @Override public void openProject(String selectedProjectName) { editorWindow.showOnStage(mainStage); } @Override public void newProject() { //TODO } @Override public void cancel() { serverURL = null; serverPort = CoderServer.SERVER_PORT; selectServerDialog.showOnStage(mainStage); } @Override public void refresh() { selectProjectDialog.clearProjectList(); sendProjectListReq(); } private void sendProjectListReq(){ //send a request for a new list of projects CoderMessage msg = new CoderMessage(); msg.ProjectListReq = new ProjectListReqMsg(); try { session.send(msg); } catch (IOException e) { logger.log(Level.SEVERE, "Unable to send ProjectListReqMsg", e); closeCurrentSession(); } } }); } private void setupEditWindow() throws IOException { this.editorWindow = new EditorWindow(); this.editorWindow.addEditorWindowListener(new EditorWindowListener() { @Override public void willShow() { //TODO } @Override public void compile() { //TODO } @Override public void run() { //TODO } }); } private void closeCurrentSession(){ if(this.session != null){ session.close(); session = null; } } }