From 3634a61ee58d283c6e5380e230f15d7fd76af05a Mon Sep 17 00:00:00 2001 From: Daniel Collin Date: Tue, 20 Oct 2015 15:52:23 +0000 Subject: [PATCH] using listeners instead of a main thread for main logic --- src/com/coder/client/CoderClient.java | 90 +++++++++++++++---- src/com/coder/client/gui/GuiWindow.java | 7 +- .../coder/client/gui/login/LoginDialog.java | 38 ++++---- .../client/gui/login/LoginDialogAction.java | 6 -- .../client/gui/login/LoginDialogListener.java | 9 ++ .../SelectProjectDialog.fxml | 0 .../SelectProjectDialog.java | 2 +- .../SelectProjectDialogListener.java | 2 +- .../gui/selectServer/SelectServerDialog.fxml | 43 +++++++++ .../gui/selectServer/SelectServerDialog.java | 68 ++++++++++++++ .../SelectServerDialogListener.java | 11 +++ 11 files changed, 229 insertions(+), 47 deletions(-) delete mode 100644 src/com/coder/client/gui/login/LoginDialogAction.java create mode 100644 src/com/coder/client/gui/login/LoginDialogListener.java rename src/com/coder/client/gui/{project => selectProject}/SelectProjectDialog.fxml (100%) rename src/com/coder/client/gui/{project => selectProject}/SelectProjectDialog.java (98%) rename src/com/coder/client/gui/{project => selectProject}/SelectProjectDialogListener.java (78%) create mode 100644 src/com/coder/client/gui/selectServer/SelectServerDialog.fxml create mode 100644 src/com/coder/client/gui/selectServer/SelectServerDialog.java create mode 100644 src/com/coder/client/gui/selectServer/SelectServerDialogListener.java diff --git a/src/com/coder/client/CoderClient.java b/src/com/coder/client/CoderClient.java index af3e78e..7d1e032 100644 --- a/src/com/coder/client/CoderClient.java +++ b/src/com/coder/client/CoderClient.java @@ -11,22 +11,18 @@ 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.LoginDialogAction; -import com.coder.client.gui.project.SelectProjectDialog; -import com.coder.client.gui.project.SelectProjectDialogListener; +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.fxml.FXMLLoader; -import javafx.scene.Parent; -import javafx.scene.Scene; import javafx.stage.Stage; public class CoderClient extends Application{ @@ -34,14 +30,17 @@ public class CoderClient extends Application{ private int port = CoderServer.SERVER_PORT; private static final int DEFAULT_CONNECTION_RETRIES = 5; private Session session; - private String url; private Stage mainStage; + private int connectionRetriesLimit = DEFAULT_CONNECTION_RETRIES; //if zero, try forever + + private String url; private String username = null; private char[] password = null; - private int connectionRetriesLimit = DEFAULT_CONNECTION_RETRIES; //if zero, try forever + private EditorWindow editorWindow; private LoginDialog loginDialog; private SelectProjectDialog selectProjectDialog; + private SelectServerDialog selectServerDialog; public static void main(String[] args) { Application.launch(args); @@ -56,6 +55,7 @@ public class CoderClient extends Application{ //parse program arguments Map params = this.getParameters().getNamed(); + String url = null; String username = null; char[] password = null; boolean reconnectForever = false; @@ -67,11 +67,15 @@ public class CoderClient extends Application{ password = value.toCharArray(); }else if(key.equals("retry-connect-forever")){ reconnectForever = true; + }else if(key.equals("url")){ + url = value; } } //create a client instance - this.url = "127.0.0.1"; + if(url != null){ + this.url = url; + } if(username != null){ this.username = username; if(password != null){ @@ -88,16 +92,69 @@ public class CoderClient extends Application{ this.editorWindow = new EditorWindow(); this.loginDialog = new LoginDialog(); this.selectProjectDialog = new SelectProjectDialog(); + this.selectServerDialog = new SelectServerDialog(); //register listeners registerListeners(); //start program logic - run(); + selectServerDialog.showOnStage(mainStage); + + //run(); } private void registerListeners() { + this.selectServerDialog.addSelectProjectDialogListener(new SelectServerDialogListener() { + @Override + public void willShow() { + selectServerDialog.setURL(url); + } + @Override + public void cancel() { + //TODO + } + @Override + public void connect(String serverUrl) { + //selectServerDialog.hide(); + url = serverUrl; + //connect session + session = Session.setupConnection(url, port); + if(session == null){ + logger.warning("Could not setup a connection to " + url + ":" + port); + url = null; + selectServerDialog.showOnStage(mainStage); + } + loginDialog.showOnStage(mainStage); + } + }); + + this.loginDialog.addLoginDialogListener(new LoginDialogListener(){ + @Override + public void willShow() { + loginDialog.setUsername(username); + loginDialog.setPassword(password); + } + @Override + public void cancel() { + //TODO + } + @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); + } + selectProjectDialog.showOnStage(mainStage); + } + }); + this.selectProjectDialog.addSelectProjectDialogListener(new SelectProjectDialogListener() { @Override public void willShow() { @@ -116,17 +173,15 @@ public class CoderClient extends Application{ } @Override public void openProject(String selectedProjectName) { - selectProjectDialog.close(); editorWindow.showOnStage(mainStage); } @Override public void newProject() { - selectProjectDialog.close(); //TODO } @Override public void cancel() { - selectProjectDialog.close(); + //TODO } }); @@ -142,7 +197,7 @@ public class CoderClient extends Application{ session = null; } } - +/* public void run(){ //keep track of the number of connection retries to the server int connectionRetries = 0; @@ -242,5 +297,6 @@ public class CoderClient extends Application{ // this.projectEditorWindow.dispose(); System.exit(0); } +*/ } diff --git a/src/com/coder/client/gui/GuiWindow.java b/src/com/coder/client/gui/GuiWindow.java index 6863a6e..2a04cdd 100644 --- a/src/com/coder/client/gui/GuiWindow.java +++ b/src/com/coder/client/gui/GuiWindow.java @@ -52,12 +52,9 @@ public abstract class GuiWindow implements Initializable{ modalStage.showAndWait(); } - /** - * hide the stage - */ - public void close(){ + public void hide(){ if(stage != null){ - stage.close(); + this.stage.hide(); } } diff --git a/src/com/coder/client/gui/login/LoginDialog.java b/src/com/coder/client/gui/login/LoginDialog.java index 37363a5..d1df287 100644 --- a/src/com/coder/client/gui/login/LoginDialog.java +++ b/src/com/coder/client/gui/login/LoginDialog.java @@ -2,6 +2,7 @@ package com.coder.client.gui.login; import java.io.IOException; import java.net.URL; +import java.util.HashSet; import java.util.ResourceBundle; import java.util.logging.Logger; @@ -16,18 +17,20 @@ import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import com.coder.client.gui.GuiWindow; +import com.coder.client.gui.selectProject.SelectProjectDialogListener; public class LoginDialog extends GuiWindow { public static final Logger logger = LogUtil.getLogger(); + private HashSet listeners; @FXML private TextField usernameTextField; @FXML private PasswordField passwordPasswordField; @FXML private Button cancelButton; @FXML private Button loginButton; - private LoginDialogAction action; public LoginDialog() throws IOException { super(LoginDialog.class.getResource("LoginDialog.fxml")); + this.listeners = new HashSet(); } @Override @@ -37,8 +40,12 @@ public class LoginDialog extends GuiWindow { @Override protected void willShow(){ - action = LoginDialogAction.CANCEL; - passwordPasswordField.setText(""); + for(LoginDialogListener listener : this.listeners){ + listener.willShow(); + } + if(!usernameTextField.getText().isEmpty() && !passwordPasswordField.getText().isEmpty()){ + loginButton.fire(); + } if(!usernameTextField.getText().isEmpty()){ passwordPasswordField.requestFocus(); } @@ -57,31 +64,28 @@ public class LoginDialog extends GuiWindow { @FXML protected void login(ActionEvent event){ - action = LoginDialogAction.LOGIN; - this.close(); + for(LoginDialogListener listener : this.listeners){ + listener.login(usernameTextField.getText(), passwordPasswordField.getText().toCharArray()); + } } @FXML protected void cancel(ActionEvent event){ - action = LoginDialogAction.CANCEL; - this.close(); - } - - public LoginDialogAction getAction(){ - return action; + for(LoginDialogListener listener : this.listeners){ + listener.cancel(); + } } public void setUsername(String username){ usernameTextField.setText(username); } - public String getUsername(){ - return usernameTextField.getText(); + public void setPassword(char[] password){ + passwordPasswordField.setText(new String(password)); } - - public char[] getPassword(){ - //TODO: fix this since is not safe since the password will be in a string - return passwordPasswordField.getText().toCharArray(); + + public void addLoginDialogListener(LoginDialogListener listener) { + this.listeners.add(listener); } } diff --git a/src/com/coder/client/gui/login/LoginDialogAction.java b/src/com/coder/client/gui/login/LoginDialogAction.java deleted file mode 100644 index 6f2c454..0000000 --- a/src/com/coder/client/gui/login/LoginDialogAction.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.coder.client.gui.login; - -public enum LoginDialogAction { - LOGIN, - CANCEL -} diff --git a/src/com/coder/client/gui/login/LoginDialogListener.java b/src/com/coder/client/gui/login/LoginDialogListener.java new file mode 100644 index 0000000..d835076 --- /dev/null +++ b/src/com/coder/client/gui/login/LoginDialogListener.java @@ -0,0 +1,9 @@ +package com.coder.client.gui.login; + +public interface LoginDialogListener { + + public void cancel(); + public void login(String username, char[] password); + public void willShow(); + +} diff --git a/src/com/coder/client/gui/project/SelectProjectDialog.fxml b/src/com/coder/client/gui/selectProject/SelectProjectDialog.fxml similarity index 100% rename from src/com/coder/client/gui/project/SelectProjectDialog.fxml rename to src/com/coder/client/gui/selectProject/SelectProjectDialog.fxml diff --git a/src/com/coder/client/gui/project/SelectProjectDialog.java b/src/com/coder/client/gui/selectProject/SelectProjectDialog.java similarity index 98% rename from src/com/coder/client/gui/project/SelectProjectDialog.java rename to src/com/coder/client/gui/selectProject/SelectProjectDialog.java index a939ab1..f97c716 100644 --- a/src/com/coder/client/gui/project/SelectProjectDialog.java +++ b/src/com/coder/client/gui/selectProject/SelectProjectDialog.java @@ -1,4 +1,4 @@ -package com.coder.client.gui.project; +package com.coder.client.gui.selectProject; import java.io.IOException; import java.net.URL; diff --git a/src/com/coder/client/gui/project/SelectProjectDialogListener.java b/src/com/coder/client/gui/selectProject/SelectProjectDialogListener.java similarity index 78% rename from src/com/coder/client/gui/project/SelectProjectDialogListener.java rename to src/com/coder/client/gui/selectProject/SelectProjectDialogListener.java index 64485c0..4920d5d 100644 --- a/src/com/coder/client/gui/project/SelectProjectDialogListener.java +++ b/src/com/coder/client/gui/selectProject/SelectProjectDialogListener.java @@ -1,4 +1,4 @@ -package com.coder.client.gui.project; +package com.coder.client.gui.selectProject; public interface SelectProjectDialogListener { diff --git a/src/com/coder/client/gui/selectServer/SelectServerDialog.fxml b/src/com/coder/client/gui/selectServer/SelectServerDialog.fxml new file mode 100644 index 0000000..c604ff7 --- /dev/null +++ b/src/com/coder/client/gui/selectServer/SelectServerDialog.fxml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/com/coder/client/gui/selectServer/SelectServerDialog.java b/src/com/coder/client/gui/selectServer/SelectServerDialog.java new file mode 100644 index 0000000..2bc0f56 --- /dev/null +++ b/src/com/coder/client/gui/selectServer/SelectServerDialog.java @@ -0,0 +1,68 @@ +package com.coder.client.gui.selectServer; + +import java.io.IOException; +import java.net.URL; +import java.util.HashSet; +import java.util.ResourceBundle; +import java.util.logging.Logger; + +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.control.Button; + +import zutil.log.LogUtil; + +import com.coder.client.gui.GuiWindow; + +public class SelectServerDialog extends GuiWindow { + public static final Logger logger = LogUtil.getLogger(); + private HashSet listeners; + private String url = null; + + @FXML private Button cancelButton; + @FXML private Button connectButton; + + public SelectServerDialog() throws IOException { + super(SelectServerDialog.class.getResource("SelectServerDialog.fxml")); + listeners = new HashSet(); + } + + @Override + protected void willShow() { + for(SelectServerDialogListener listener : this.listeners){ + listener.willShow(); + } + if(url != null){ + connectButton.fire(); + } + } + + @Override + public void initialize(URL fxmlFileLocation, ResourceBundle resources) { + // TODO Auto-generated method stub + + } + + @FXML + protected void cancel(ActionEvent event){ + for(SelectServerDialogListener listener : this.listeners){ + listener.cancel(); + } + } + + @FXML + protected void connect(ActionEvent event){ + for(SelectServerDialogListener listener : this.listeners){ + listener.connect(url); + } + } + + public void addSelectProjectDialogListener(SelectServerDialogListener listener){ + this.listeners.add(listener); + } + + public void setURL(String url) { + this.url = url; + } + +} diff --git a/src/com/coder/client/gui/selectServer/SelectServerDialogListener.java b/src/com/coder/client/gui/selectServer/SelectServerDialogListener.java new file mode 100644 index 0000000..365d659 --- /dev/null +++ b/src/com/coder/client/gui/selectServer/SelectServerDialogListener.java @@ -0,0 +1,11 @@ +package com.coder.client.gui.selectServer; + +public interface SelectServerDialogListener { + + void willShow(); + + void cancel(); + + void connect(String url); + +}