From 787f4f010ac6f77432cd383f26f4372ff696c69f Mon Sep 17 00:00:00 2001 From: Me Car Date: Thu, 7 Jan 2016 23:43:28 +0900 Subject: [PATCH] Keep registerClient for older clients. Rename the new version to registerClientWithPassword. Add an error message on NoSuchMethodException so that this kind of version incompatibility can be handled and informed to user. --- Mage.Common/src/mage/interfaces/MageServer.java | 6 +++++- Mage.Common/src/mage/remote/SessionImpl.java | 12 +++++++++--- .../src/main/java/mage/server/MageServerImpl.java | 10 +++++++++- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Mage.Common/src/mage/interfaces/MageServer.java b/Mage.Common/src/mage/interfaces/MageServer.java index 75baad0e6a8..85bae2817e1 100644 --- a/Mage.Common/src/mage/interfaces/MageServer.java +++ b/Mage.Common/src/mage/interfaces/MageServer.java @@ -56,7 +56,11 @@ import mage.view.UserView; public interface MageServer { // connection methods - boolean registerClient(String userName, String password, String sessionId, MageVersion version) throws MageException; + // DEPRECATED - Use registerClientWithPassword instead. This is kept for older clients. + // This can be deleted once users transitioned to newer clients (1.4.6v1 and later). + boolean registerClient(String userName, String sessionId, MageVersion version) throws MageException; + + boolean registerClientWithPassword(String userName, String password, String sessionId, MageVersion version) throws MageException; boolean registerAdmin(String password, String sessionId, MageVersion version) throws MageException; // Not used diff --git a/Mage.Common/src/mage/remote/SessionImpl.java b/Mage.Common/src/mage/remote/SessionImpl.java index a75ab5ab49b..eab3306e5bc 100644 --- a/Mage.Common/src/mage/remote/SessionImpl.java +++ b/Mage.Common/src/mage/remote/SessionImpl.java @@ -280,7 +280,7 @@ public class SessionImpl implements Session { boolean registerResult; if (connection.getAdminPassword() == null) { // for backward compatibility. don't remove twice call - first one does nothing but for version checking - registerResult = server.registerClient(connection.getUsername(), connection.getPassword(), sessionId, client.getVersion()); + registerResult = server.registerClientWithPassword(connection.getUsername(), connection.getPassword(), sessionId, client.getVersion()); if (registerResult) { server.setUserData(connection.getUsername(), sessionId, connection.getUserData()); } @@ -304,13 +304,19 @@ public class SessionImpl implements Session { client.showMessage("Unable to connect to server. " + ex.getMessage()); } catch (UndeclaredThrowableException ex) { String addMessage = ""; - if (ex.getCause() instanceof InvocationFailureException) { - InvocationFailureException exep = (InvocationFailureException) ex.getCause(); + Throwable cause = ex.getCause(); + if (cause instanceof InvocationFailureException) { + InvocationFailureException exep = (InvocationFailureException) cause; if (exep.getCause() instanceof IOException) { if (exep.getCause().getMessage().startsWith("Field hash null is not available on current")) { addMessage = "Probabaly the server version is not compatible to the client. "; } } + } else if (cause instanceof NoSuchMethodException) { + // NoSuchMethodException is thrown on an invocation of an unknow JBoss remoting + // method, so it's likely to be because of a version incompatibility. + addMessage = "The following method is not available in the server, probably the " + + "server version is not compatible to the client: " + cause.getMessage(); } if (addMessage.isEmpty()) { logger.fatal("", ex); diff --git a/Mage.Server/src/main/java/mage/server/MageServerImpl.java b/Mage.Server/src/main/java/mage/server/MageServerImpl.java index 2405d45f6b8..c4f3b420f4a 100644 --- a/Mage.Server/src/main/java/mage/server/MageServerImpl.java +++ b/Mage.Server/src/main/java/mage/server/MageServerImpl.java @@ -106,7 +106,15 @@ public class MageServerImpl implements MageServer { } @Override - public boolean registerClient(String userName, String password, String sessionId, MageVersion version) throws MageException { + public boolean registerClient(String userName, String sessionId, MageVersion version) throws MageException { + // This method is deprecated, so just inform the server version. + logger.info("MageVersionException: userName=" + userName + ", version=" + version); + LogServiceImpl.instance.log(LogKeys.KEY_WRONG_VERSION, userName, version.toString(), Main.getVersion().toString(), sessionId); + throw new MageVersionException(version, Main.getVersion()); + } + + @Override + public boolean registerClientWithPassword(String userName, String password, String sessionId, MageVersion version) throws MageException { try { if (version.compareTo(Main.getVersion()) != 0) { logger.info("MageVersionException: userName=" + userName + ", version=" + version);