From 5a9e709ae8d1d71a6136b9456a5e56e319439cfa Mon Sep 17 00:00:00 2001 From: dcollin Date: Wed, 11 Nov 2015 16:13:01 +0100 Subject: [PATCH] Refactoring: Moving GUI program logic from CoderClient to each controller class -Removing the Session Guard -Adding a SessionHandler -Adding a ProjectHandler --- src/com/coder/client/CoderClient.java | 526 +++++------------- src/com/coder/client/gui/GuiWindow.java | 44 +- .../coder/client/gui/editor/EditorWindow.fxml | 8 +- .../coder/client/gui/editor/EditorWindow.java | 86 +-- .../gui/editor/EditorWindowListener.java | 11 - .../coder/client/gui/login/LoginDialog.java | 83 +-- .../client/gui/login/LoginDialogListener.java | 9 - .../gui/newProject/NewProjectDialog.java | 60 +- .../newProject/NewProjectDialogListener.java | 11 - .../selectProject/SelectProjectDialog.java | 109 ++-- .../SelectProjectDialogListener.java | 15 - .../gui/selectServer/SelectServerDialog.java | 90 ++- .../SelectServerDialogListener.java | 11 - .../coder/client/project/ProjectHandler.java | 48 ++ .../coder/client/project/ProjectListener.java | 8 + .../session/ProjectListRspMsgListener.java | 2 +- .../session/ProjectMessageListener.java | 5 + .../client/session/ProjectRspMsgListener.java | 2 +- .../session/ProjectTypeRspMsgListener.java | 2 +- src/com/coder/client/session/Session.java | 62 +-- .../coder/client/session/SessionHandler.java | 107 ++++ .../coder/client/session/SessionListener.java | 12 +- 22 files changed, 656 insertions(+), 655 deletions(-) delete mode 100644 src/com/coder/client/gui/editor/EditorWindowListener.java delete mode 100644 src/com/coder/client/gui/login/LoginDialogListener.java delete mode 100644 src/com/coder/client/gui/newProject/NewProjectDialogListener.java delete mode 100644 src/com/coder/client/gui/selectProject/SelectProjectDialogListener.java delete mode 100644 src/com/coder/client/gui/selectServer/SelectServerDialogListener.java create mode 100644 src/com/coder/client/project/ProjectHandler.java create mode 100644 src/com/coder/client/project/ProjectListener.java create mode 100644 src/com/coder/client/session/ProjectMessageListener.java create mode 100644 src/com/coder/client/session/SessionHandler.java diff --git a/src/com/coder/client/CoderClient.java b/src/com/coder/client/CoderClient.java index 03eabce..afde263 100755 --- a/src/com/coder/client/CoderClient.java +++ b/src/com/coder/client/CoderClient.java @@ -1,30 +1,24 @@ package com.coder.client; import java.io.IOException; -import java.util.HashSet; -import java.util.List; import java.util.Map; -import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; -import com.coder.client.gui.GuiWindow; 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.newProject.NewProjectDialog; -import com.coder.client.gui.newProject.NewProjectDialogListener; 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.client.session.ProjectListRspMsgListener; +import com.coder.client.project.ProjectHandler; +import com.coder.client.project.ProjectListener; import com.coder.client.session.ProjectRspMsgListener; -import com.coder.client.session.ProjectTypeRspMsgListener; -import com.coder.client.session.Session; +import com.coder.client.session.SessionHandler; import com.coder.client.session.SessionListener; -import com.coder.server.message.*; +import com.coder.server.message.CoderMessage; +import com.coder.server.message.ProjectCreateReqMsg; +import com.coder.server.message.ProjectReqMsg; +import com.coder.server.message.ProjectRspMsg; import zutil.log.CompactLogFormatter; import zutil.log.LogUtil; @@ -37,10 +31,8 @@ import javafx.stage.Stage; public class CoderClient extends Application{ public static final Logger logger = LogUtil.getLogger(); - private HashSet sessionListeners = new HashSet(); - - private Session session; - private Stage mainStage; + private SessionHandler sessionHandler = new SessionHandler(); + private ProjectHandler projectHandler = new ProjectHandler(); //GUI elements private EditorWindow editorWindow; @@ -49,9 +41,6 @@ public class CoderClient extends Application{ private SelectServerDialog selectServerDialog; private NewProjectDialog newProjectDialog; - //state variables - private GuiWindow projectSelectionWindow = null; //points to the GUI that selected a project for the editor. If any error occurs while creating/loading the project, this is the window we will go back to. - //services SSDPClient ssdpClient; @@ -60,7 +49,7 @@ public class CoderClient extends Application{ } @Override - public void start(Stage mainStage) throws Exception { + public void start(final Stage mainStage) throws Exception { //setup logging CompactLogFormatter formatter = new CompactLogFormatter(); @@ -71,14 +60,13 @@ public class CoderClient extends Application{ LogUtil.setGlobalFormatter(formatter); //setup GUI elements - this.mainStage = mainStage; mainStage.setTitle("CoderClient"); try{ - setupSelectServerDialog(); - setupLoginDialog(); - setupSelectProjectDialog(); - setupEditWindow(); - setupNewProjectDialog(); + this.selectServerDialog = new SelectServerDialog(this); + this.loginDialog = new LoginDialog(this); + this.selectProjectDialog = new SelectProjectDialog(this); + this.newProjectDialog = new NewProjectDialog(this); + this.editorWindow = new EditorWindow(this); }catch(IOException e){ logger.log(Level.SEVERE, "could not load all GUI elements", e); System.exit(1); @@ -90,8 +78,6 @@ public class CoderClient extends Application{ String value = params.get(key); if(key.equals("username")){ loginDialog.setUsername(value); - }else if(key.equals("password")){ - loginDialog.setPassword(value.toCharArray()); }else if(key.equals("url")){ selectServerDialog.setServerAddress(value); }else if(key.equals("port")){ @@ -102,7 +88,7 @@ public class CoderClient extends Application{ selectServerDialog.setServerPort(-1); } }else if(key.equals("project")){ - selectProjectDialog.setProject(value); + projectHandler.setProject(value); } } @@ -113,6 +99,127 @@ public class CoderClient extends Application{ logger.log(Level.SEVERE, "could not setup SSDP client", e); System.exit(1); } + + //add session listeners + sessionHandler.addSessionListener(new SessionListener() { + @Override + public void sessionDisconnected(boolean retryToEstablishConnection) { + Platform.runLater(new Runnable(){ + @Override + public void run() { + logger.info("session disconnected, will show the select server dialog on the main stage"); + selectServerDialog.showOnStage(mainStage); + } + }); + } + @Override + public void sessionConnectionSuccess() { + Platform.runLater(new Runnable(){ + @Override + public void run() { + logger.info("session connection successfull, will show the login dialog on the main stage"); + loginDialog.showOnStage(mainStage); + } + }); + } + @Override + public void sessionConnectionFailure() { + Platform.runLater(new Runnable(){ + @Override + public void run() { + logger.info("session connection failure, will show the select server dialog on the main stage"); + selectServerDialog.showOnStage(mainStage); + } + }); + } + @Override + public void sessionAuthenticationSuccess() { + Platform.runLater(new Runnable(){ + @Override + public void run() { + logger.info("session authentication successfull, will show the select project dialog on the main stage"); + selectProjectDialog.showOnStage(mainStage); + } + }); + } + @Override + public void sessionAuthenticationFailure() { + Platform.runLater(new Runnable(){ + @Override + public void run() { + logger.info("session authentication failure, will show the select server dialog on the main stage"); + selectServerDialog.showOnStage(mainStage); + } + }); + } + @Override + public void sessionAuthenticationCancel() { + Platform.runLater(new Runnable(){ + @Override + public void run() { + logger.info("session authentication canceled, will show the select server dialog on the main stage"); + selectServerDialog.showOnStage(mainStage); + } + }); + } + }); + + //add project listeners + projectHandler.addprojectListener(new ProjectListener() { + @Override + public void selectProject() { + Platform.runLater(new Runnable(){ + @Override + public void run() { + logger.info("select project requested, will show the select project dialog on the main stage"); + selectProjectDialog.showOnStage(mainStage); + } + }); + } + @Override + public void openProject(String projectName) { + CoderMessage msg = new CoderMessage(); + msg.ProjectReq = new ProjectReqMsg(); + msg.ProjectReq.name = projectName; + sessionHandler.sendMessage(msg); + } + @Override + public void createNewProject(String name, String type, String description) { + CoderMessage msg = new CoderMessage(); + msg.ProjectCreateReq = new ProjectCreateReqMsg(); + msg.ProjectCreateReq.name = name; + msg.ProjectCreateReq.type = type; + msg.ProjectCreateReq.description = description; + sessionHandler.sendMessage(msg); + } + @Override + public void createNewProject() { + Platform.runLater(new Runnable(){ + @Override + public void run() { + logger.info("new project requested, will show the new project dialog on the main stage"); + newProjectDialog.showOnStage(mainStage); + } + }); + } + }); + + //add message listeners + sessionHandler.addMessageListener(new ProjectRspMsgListener() { + @Override + public void messageReceived(final ProjectRspMsg msg) { + Platform.runLater(new Runnable() { + @Override + public void run() { + if(msg.error != null){ + selectServerDialog.showOnStage(mainStage); + }else{ + editorWindow.showOnStage(mainStage); + } + } + }); + } + }); //start program logic selectServerDialog.setServerPort(-1); @@ -120,342 +227,6 @@ public class CoderClient extends Application{ } - private void setupSelectServerDialog() throws IOException{ - this.selectServerDialog = new SelectServerDialog(); - this.selectServerDialog.addSelectProjectDialogListener(new SelectServerDialogListener() { - @Override - public void willShow() { - logger.fine("about to show select server dialog on main stage"); - closeCurrentSession(); - selectServerDialog.clearServerList(); - if(ssdpClient != null){ - ssdpClient.requestService("coder:discover"); - for(StandardSSDPInfo server : ssdpClient.getServices("coder:discover")) - selectServerDialog.addServerToList(server.getInetAddress().getHostAddress(), 1337); - }else{ - logger.severe("could not send a SSDP request since the client is not setup"); - } - } - @Override - public void exit() { - logger.info("terminating"); - Platform.exit(); - } - @Override - public void connect(String address, int port) { - //connect session - session = Session.setupConnection(address, port); - if(session == null){ - logger.warning("Could not setup a connection to " + address + ":" + port); - selectServerDialog.setServerAddress(null); - selectServerDialog.setErrorMessage("ERROR: Unable to connect to remote host"); - loginDialog.setErrorMessage(""); - selectServerDialog.showOnStage(mainStage); - }else{ - selectServerDialog.setErrorMessage(""); - loginDialog.showOnStage(mainStage); - } - } - }); - } - - private void setupLoginDialog() throws IOException { - this.loginDialog = new LoginDialog(); - this.loginDialog.addLoginDialogListener(new LoginDialogListener(){ - @Override - public void willShow() { - logger.fine("about to show login dialog on main stage"); - } - @Override - public void cancel() { - loginDialog.setErrorMessage(""); - selectServerDialog.setServerAddress(null); - selectServerDialog.showOnStage(mainStage); - } - @Override - public void login(String username, char[] password) { - //authenticate session - boolean authenticated = session.authenticate(username, password); - if(!authenticated){ - logger.severe("Authentication failed: wrong username or password"); - loginDialog.setPassword(null); - loginDialog.setErrorMessage("Wrong username or password"); - selectServerDialog.showOnStage(mainStage); - return; - }else{ - loginDialog.setErrorMessage(""); - setupSessionListener(); //resister a message listener to the session - session.start(); //start receiving traffic from the server - selectProjectDialog.showOnStage(mainStage); - } - } - }); - } - - /** - * To be called after a session has been connected and authenticated - */ - private void setupSessionListener(){ - if(session == null){ - logger.warning("Cannot setup session listeners for null instance. ignoring call."); - return; - } - if(!session.isAuthenticated()){ - logger.warning("Cannot setup session listeners for a non-authenticated session. ignoring call."); - return; - } - //indicate for listeners that a new session is up - for(SessionListener listener : sessionListeners){ - listener.sessionUp(session); - } - // create a guard for when the session is closed - new Thread(new Runnable(){ - @Override - public void run() { - logger.fine("starting a session guard"); - while(true){ - if(session == null || !session.isConnected()){ - logger.fine("session guard: no connection"); - Platform.runLater(new Runnable() { - @Override - public void run() { - selectServerDialog.setErrorMessage("The current session was disconnected"); - closeCurrentSession(); - selectServerDialog.showOnStage(mainStage); - } - }); - break; - } - Thread.yield(); - } - logger.fine("terminating session guard"); - } - }).start(); - } - - private void setupSelectProjectDialog() throws IOException { - this.selectProjectDialog = new SelectProjectDialog(); - this.selectProjectDialog.addSelectProjectDialogListener(new SelectProjectDialogListener() { - @Override - public void willShow() { - logger.fine("about to show select project dialog on main stage"); - selectProjectDialog.clearProjectList(); - if(!selectProjectDialog.isProjectSelected()){ - sendProjectListReq(); - } - } - @Override - public void open(String selectedProjectName) { - projectSelectionWindow = selectProjectDialog; - editorWindow.showOnStage(mainStage); - } - @Override - public void newProject() { - selectProjectDialog.setProject(null); - newProjectDialog.showOnStage(mainStage); - } - @Override - public void cancel() { - loginDialog.setPassword(null); - selectServerDialog.setServerAddress(null); - 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(); - } - } - }); - this.sessionListeners.add(new SessionListener() { - @Override - public void sessionUp(Session session) { - session.addProjectListRspMsgListener(new ProjectListRspMsgListener() { - @Override - public void messageReceived(final ProjectListRspMsg msg) { - logger.fine("a ProjectListRsp received"); - Platform.runLater(new Runnable() { - @Override - public void run() { - for(String projectName : msg.keySet()){ - ProjectListData projectData = msg.get(projectName); - selectProjectDialog.addProjectToList(projectName, projectData); - } - } - }); - } - }); - } - }); - } - - private void setupNewProjectDialog() throws IOException { - this.newProjectDialog = new NewProjectDialog(); - this.newProjectDialog.addNewProjectDialogListener(new NewProjectDialogListener(){ - @Override - public void willShow() { - logger.fine("about to show new project dialog on main stage"); - newProjectDialog.clearProjectTypeList(); - sendProjectTypeReqMsg(); - } - @Override - public void create(String newProjectName, String projectType, String projectDescription) { - projectSelectionWindow = newProjectDialog; - sendProjectCreateReqMsg(newProjectName, projectType, projectDescription); - selectProjectDialog.setProject(newProjectName); - editorWindow.showOnStage(mainStage); - } - private void sendProjectTypeReqMsg(){ - CoderMessage msg = new CoderMessage(); - msg.ProjectTypeReq = new ProjectTypeReqMsg(); - try { - session.send(msg); - } catch (IOException e) { - logger.log(Level.SEVERE, "Unable to send ProjectTypeReq", e); - closeCurrentSession(); - } - } - private void sendProjectCreateReqMsg(String projectName, String projectType, String projectDescription){ - CoderMessage msg = new CoderMessage(); - msg.ProjectCreateReq = new ProjectCreateReqMsg(); - msg.ProjectCreateReq.name = projectName; - msg.ProjectCreateReq.type = projectType; - msg.ProjectCreateReq.description = projectDescription; - try { - session.send(msg); - } catch (IOException e) { - logger.log(Level.SEVERE, "Unable to send ProjectCreateReq", e); - closeCurrentSession(); - } - } - @Override - public void cancel() { - selectProjectDialog.setProject(null); - selectProjectDialog.showOnStage(mainStage); - } - }); - this.sessionListeners.add(new SessionListener() { - @Override - public void sessionUp(Session session) { - session.addProjectTypeRspMsgListener(new ProjectTypeRspMsgListener() { - @Override - public void messageReceived(final ProjectTypeRspMsg msg) { - logger.fine("a ProjectTypeRspMsg received"); - Platform.runLater(new Runnable() { - @Override - public void run() { - for(String typeName : msg.keySet()){ - SupportedProperties typeData = msg.get(typeName); - newProjectDialog.addProjectTypeToList(typeName, typeData); - } - } - }); - } - }); - } - }); - } - - private void setupEditWindow() throws IOException { - this.editorWindow = new EditorWindow(); - this.editorWindow.addEditorWindowListener(new EditorWindowListener() { - @Override - public void willShow() { - logger.fine("about to show edit window on main stage"); - sendProjectReqMsg(); - } - @Override - public void compile() { - //TODO - } - @Override - public void run() { - //TODO - } - private void sendProjectReqMsg(){ - if(!selectProjectDialog.isProjectSelected()){ - logger.severe("Cannot send a project request when no project is selected"); - return; - } - CoderMessage msg = new CoderMessage(); - msg.ProjectReq = new ProjectReqMsg(); - msg.ProjectReq.name = selectProjectDialog.getSelectedProject(); - try { - session.send(msg); - } catch (IOException e) { - logger.log(Level.SEVERE, "Unable to send ProjectReqMsg", e); - closeCurrentSession(); - } - } - @Override - public void changeProject() { - selectProjectDialog.setProject(null); - selectProjectDialog.showOnStage(mainStage); - } - @Override - public void exit() { - closeCurrentSession(); - Platform.exit(); - } - }); - sessionListeners.add(new SessionListener() { - @Override - public void sessionUp(Session session) { - session.addProjectRspMsgListener(new ProjectRspMsgListener() { - @Override - public void messageReceived(final ProjectRspMsg msg) { - logger.fine("a ProjectRspMsg received"); - Platform.runLater(new Runnable() { - @Override - public void run() { - if(msg.error != null){ - logger.severe("Server responded on the project request with the following error message: " + msg.error); - selectProjectDialog.setProject(null); - if(projectSelectionWindow != null){ - projectSelectionWindow.setErrorMessage("ERROR: " + msg.error); - projectSelectionWindow.showOnStage(mainStage); - return; - }else{ - selectProjectDialog.setErrorMessage("ERROR: " + msg.error); - selectProjectDialog.showOnStage(mainStage); - return; - } - }else{ - if(projectSelectionWindow != null){ - projectSelectionWindow.setErrorMessage(""); - } - editorWindow.setProjectName(msg.name); - - Properties projectConfig = msg.config; - String projectDescription = msg.description; - List fileList = msg.fileList; - String projectType = msg.type; - //TODO: handle msg - } - } - }); - } - }); - session.addProjectTypeRspMsgListener(new ProjectTypeRspMsgListener() { - @Override - public void messageReceived(ProjectTypeRspMsg msg) { - //TODO: update the project properties - } - }); - } - }); - } - private void setupSSDPClient() throws IOException{ this.ssdpClient = new SSDPClient(); ssdpClient.setListener(new SSDPServiceListener() { @@ -477,12 +248,23 @@ public class CoderClient extends Application{ ssdpClient.start(); } - private void closeCurrentSession(){ - if(this.session != null){ - logger.info("disconnecting from server"); - session.close(); - session = null; - } + public void exit() { + logger.info("terminating"); + Platform.exit(); + System.exit(0); + } + + public SSDPClient getSSDPClient() { + return this.ssdpClient; + } + + + public SessionHandler getSessionHandler() { + return this.sessionHandler; + } + + public ProjectHandler getProjectHandler(){ + return this.projectHandler; } } diff --git a/src/com/coder/client/gui/GuiWindow.java b/src/com/coder/client/gui/GuiWindow.java index 9df10f0..b6f0073 100644 --- a/src/com/coder/client/gui/GuiWindow.java +++ b/src/com/coder/client/gui/GuiWindow.java @@ -3,6 +3,9 @@ package com.coder.client.gui; import java.io.IOException; import java.net.URL; import java.util.ResourceBundle; +import java.util.logging.Logger; + +import zutil.log.LogUtil; import javafx.fxml.FXMLLoader; import javafx.fxml.Initializable; @@ -11,7 +14,7 @@ import javafx.scene.Scene; import javafx.stage.Stage; public abstract class GuiWindow implements Initializable{ - + public static final Logger logger = LogUtil.getLogger(); private Scene scene; /** @@ -30,36 +33,19 @@ public abstract class GuiWindow implements Initializable{ * @param stage The stage to show on */ public void showOnStage(Stage stage){ - stage.setScene(scene); - stage.setTitle(getTitle()); - //this.stage = stage; - willShow(); - stage.show(); - } - - /** - * show a modal dialog - * @param parent The dialogs parent - */ -/* public void showModal(Stage parent){ - Stage modalStage = new Stage(); - modalStage.initModality(Modality.WINDOW_MODAL); - modalStage.initOwner(parent); - modalStage.setScene(scene); - modalStage.setTitle(getTitle()); - this.stage = modalStage; - willShow(); - modalStage.showAndWait(); - } -*/ - -/* public void hide(){ - if(stage != null){ - this.stage.hide(); + if(scene != null && stage.getScene() != null && stage.getScene().equals(scene)){ + logger.fine("already showing " + getDescriptiveName() + " on stage"); + }else{ + stage.setScene(scene); + stage.setTitle(getTitle()); + logger.fine("about to show " + getDescriptiveName() + " on stage"); + willShow(); + stage.show(); + logger.fine("showing " + getDescriptiveName()); } } -*/ + protected abstract String getDescriptiveName(); protected abstract String getTitle(); @@ -73,6 +59,4 @@ public abstract class GuiWindow implements Initializable{ */ public abstract void initialize(URL fxmlFileLocation, ResourceBundle resources); - public abstract void setErrorMessage(String msg); - } diff --git a/src/com/coder/client/gui/editor/EditorWindow.fxml b/src/com/coder/client/gui/editor/EditorWindow.fxml index f6d6e0e..841bf3b 100644 --- a/src/com/coder/client/gui/editor/EditorWindow.fxml +++ b/src/com/coder/client/gui/editor/EditorWindow.fxml @@ -51,12 +51,12 @@ - - -