diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 702a8f45f64..1c4b763ee59 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -75,6 +75,7 @@ import javax.swing.event.PopupMenuListener; import mage.client.deckeditor.DeckEditorPane; import mage.client.draft.DraftPane; import mage.client.game.GamePane; +import mage.client.remote.Session.SessionState; import mage.client.table.TablesPane; import mage.client.tournament.TournamentPane; import mage.game.match.MatchOptions; @@ -710,7 +711,7 @@ public class MageFrame extends javax.swing.JFrame { }//GEN-LAST:event_btnExitActionPerformed private void btnConnectActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnConnectActionPerformed - if (session.isConnected()) { + if (session.getState() == SessionState.CONNECTED) { if (JOptionPane.showConfirmDialog(this, "Are you sure you want to disconnect?", "Confirm disconnect", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { session.disconnect(true); } diff --git a/Mage.Client/src/main/java/mage/client/chat/ChatPanel.java b/Mage.Client/src/main/java/mage/client/chat/ChatPanel.java index 1fef5f35e50..ad0e6e3eaff 100644 --- a/Mage.Client/src/main/java/mage/client/chat/ChatPanel.java +++ b/Mage.Client/src/main/java/mage/client/chat/ChatPanel.java @@ -43,6 +43,7 @@ import mage.client.remote.Session; import mage.view.ChatMessage.MessageColor; import javax.swing.table.AbstractTableModel; +import mage.client.remote.Session.SessionState; /** * @@ -79,7 +80,7 @@ public class ChatPanel extends javax.swing.JPanel { } public void disconnect() { - if (session != null && session.isConnected()) + if (session != null && session.getState() == SessionState.CONNECTED) session.leaveChat(chatId); } diff --git a/Mage.Client/src/main/java/mage/client/remote/Session.java b/Mage.Client/src/main/java/mage/client/remote/Session.java index aa5683f8fe9..d68bcf17c74 100644 --- a/Mage.Client/src/main/java/mage/client/remote/Session.java +++ b/Mage.Client/src/main/java/mage/client/remote/Session.java @@ -77,11 +77,16 @@ public class Session { private final static Logger logger = Logger.getLogger(Session.class); private static ScheduledExecutorService sessionExecutor = Executors.newScheduledThreadPool(1); + public enum SessionState { + DISCONNECTED, CONNECTED, CONNECTING, DISCONNECTING, SERVER_UNAVAILABLE; + } + private UUID sessionId; private Client client; private String userName; private MageFrame frame; private ServerState serverState; + private SessionState sessionState = SessionState.DISCONNECTED; private Map chats = new HashMap(); private Map games = new HashMap(); private Map drafts = new HashMap(); @@ -90,16 +95,13 @@ public class Session { private ScheduledFuture future; private MageUI ui = new MageUI(); private Connection connection; - private boolean reconnecting = false; - private boolean connecting = false; public Session(MageFrame frame) { this.frame = frame; } public synchronized boolean connect(Connection connection) { - this.connecting = true; - if (this.connection != null && isConnected()) { + if (this.connection != null && sessionState == SessionState.DISCONNECTED) { disconnect(true); } this.connection = connection; @@ -107,6 +109,7 @@ public class Session { } public boolean connect() { + sessionState = SessionState.CONNECTING; try { System.setSecurityManager(null); System.setProperty("http.nonProxyHosts", "code.google.com"); @@ -140,32 +143,27 @@ public class Session { logger.info("Connected to RMI server at " + connection.getHost() + ":" + connection.getPort()); frame.setStatusText("Connected to " + connection.getHost() + ":" + connection.getPort() + " "); frame.enableButtons(); - reconnecting = false; - connecting = false; + sessionState = SessionState.CONNECTED; return true; } catch (Exception ex) { logger.fatal("", ex); - if (!reconnecting) { + if (sessionState == SessionState.CONNECTING) { disconnect(false); JOptionPane.showMessageDialog(frame, "Unable to connect to server. " + ex.getMessage()); } + sessionState = SessionState.SERVER_UNAVAILABLE; } return false; } public synchronized void disconnect(boolean voluntary) { + sessionState = SessionState.DISCONNECTING; if (connection == null) return; - if (reconnecting) - return; if (future != null && !future.isDone()) future.cancel(true); frame.setStatusText("Not connected"); frame.disableButtons(); -// if (!voluntary && !connecting) { -// if (attemptReconnect()) -// return; -// } try { for (UUID chatId: chats.keySet()) { leaveChat(chatId); @@ -185,32 +183,22 @@ public class Session { frame.hideGames(); frame.hideTables(); logger.info("Disconnected ... "); - if (!voluntary && !connecting) + if (!voluntary) JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Server error. You have been disconnected", "Error", JOptionPane.ERROR_MESSAGE); } - -// private boolean attemptReconnect() { -// reconnecting = true; -// ReconnectDialog rcd = new ReconnectDialog(); -// MageFrame.getDesktop().add(rcd, JLayeredPane.MODAL_LAYER); -// rcd.showDialog(this); -// reconnecting = false; -// return rcd.getResult(); -// } - + public boolean ping() { Ping method = new Ping(connection, sessionId); try { return method.makeCall(); } catch (ServerUnavailable ex) { - logger.fatal("server unavailable - ", ex); + handleServerUnavailable(ex); } catch (MageException ex) { logger.fatal("ping error", ex); } return false; } - private UUID registerClient(String userName, UUID clientId, MageVersion version) throws MageException, ServerUnavailable { RegisterClient method = new RegisterClient(connection, userName, clientId, version); return method.makeCall(); @@ -230,15 +218,18 @@ public class Session { try { return method.makeCall(); } catch (ServerUnavailable ex) { - logger.fatal("server unavailable - ", ex); + handleServerUnavailable(ex); } catch (MageException ex) { logger.fatal("GetServerState error", ex); } return null; } + public SessionState getState() { + return sessionState; + } public boolean isConnected() { - return ping(); + return sessionState == SessionState.CONNECTED; } public String[] getPlayerTypes() { @@ -853,28 +844,12 @@ public class Session { return ui; } -// public Server getServerRef() { -// return server; -// } - class ServerPinger implements Runnable { - private int missed = 0; - @Override public void run() { - if (!ping()) { - missed++; - if (missed > 10) { - logger.info("Connection to server timed out"); - disconnect(false); - } - } - else { - missed = 0; - } + ping(); } - } } diff --git a/Mage.Common/src/mage/remote/Connection.java b/Mage.Common/src/mage/remote/Connection.java index e8b5be0181f..c908c3b57e6 100644 --- a/Mage.Common/src/mage/remote/Connection.java +++ b/Mage.Common/src/mage/remote/Connection.java @@ -71,7 +71,12 @@ public class Connection { Connection otherConnection = (Connection) object; return hashCode() == otherConnection.hashCode(); } - + + @Override + public String toString() { + return host + ":" + Integer.toString(port); + } + public ProxyType getProxyType() { return proxyType; } diff --git a/Mage.Server/src/main/java/mage/server/Session.java b/Mage.Server/src/main/java/mage/server/Session.java index 0f6796a482f..982d9eb4118 100644 --- a/Mage.Server/src/main/java/mage/server/Session.java +++ b/Mage.Server/src/main/java/mage/server/Session.java @@ -91,7 +91,9 @@ public class Session { public void kill() { this.killed = true; - ackResponse.notify(); + synchronized(ackResponse) { + ackResponse.notify(); + } SessionManager.getInstance().removeSession(sessionId); TableManager.getInstance().removeSession(sessionId); GameManager.getInstance().removeSession(sessionId);