---
 .../freecol/server/control/InGameInputHandler.java | 396 +++++++++++----------
 .../server/control/PreGameInputHandler.java        |  59 +--
 .../freecol/server/control/ServerInputHandler.java | 107 +++---
 .../server/control/UserConnectionHandler.java      |  28 +-
 4 files changed, 298 insertions(+), 292 deletions(-)

diff --git a/src/net/sf/freecol/server/control/InGameInputHandler.java 
b/src/net/sf/freecol/server/control/InGameInputHandler.java
index 7033e6950ec..50c6065c20b 100644
--- a/src/net/sf/freecol/server/control/InGameInputHandler.java
+++ b/src/net/sf/freecol/server/control/InGameInputHandler.java
@@ -19,6 +19,8 @@
 
 package net.sf.freecol.server.control;
 
+import java.net.UnknownServiceException;
+
 import net.sf.freecol.common.networking.AbandonColonyMessage;
 import net.sf.freecol.common.networking.AskSkillMessage;
 import net.sf.freecol.common.networking.AssignTeacherMessage;
@@ -100,205 +102,209 @@ public final class InGameInputHandler extends 
ServerInputHandler {
      *
      * Note: all the handler lamdbas call getGame() because the game
      * is not necessarily available when the constructor is called.
-     * 
+     *
      * @param freeColServer The main server object.
      */
     public InGameInputHandler(final FreeColServer freeColServer) {
         super(freeColServer);
+    }
+
+    @Override
+    public Element handleElement(Connection c, Element e)
+            throws UnknownServiceException {
+        String tag = e.getTagName().intern();
+        switch (tag) {
+            case AbandonColonyMessage.TAG:
+                return handler(true, c, new AbandonColonyMessage(getGame(), 
e));
+
+            case AskSkillMessage.TAG:
+                return handler(true, c, new AskSkillMessage(getGame(), e));
+
+            case AssignTeacherMessage.TAG:
+                return handler(true, c, new AssignTeacherMessage(getGame(), 
e));
+
+            case AssignTradeRouteMessage.TAG:
+                return handler(true, c, new AssignTradeRouteMessage(getGame(), 
e));
+
+            case AttackMessage.TAG:
+                return handler(true, c, new AttackMessage(getGame(), e));
+
+            case BuildColonyMessage.TAG:
+                return handler(true, c, new BuildColonyMessage(getGame(), e));
+
+            case CashInTreasureTrainMessage.TAG:
+                return handler(true, c, new 
CashInTreasureTrainMessage(getGame(), e));
+
+            case ChangeStateMessage.TAG:
+                return handler(true, c, new ChangeStateMessage(getGame(), e));
+
+            case ChangeWorkImprovementTypeMessage.TAG:
+                return handler(true, c, new 
ChangeWorkImprovementTypeMessage(getGame(), e));
+
+            case ChangeWorkTypeMessage.TAG:
+                return handler(true, c, new ChangeWorkTypeMessage(getGame(), 
e));
+
+            case ChooseFoundingFatherMessage.TAG:
+                return handler(true, c, new 
ChooseFoundingFatherMessage(getGame(), e));
+
+            case ClaimLandMessage.TAG:
+                return handler(true, c, new ClaimLandMessage(getGame(), e));
+
+            case ClearSpecialityMessage.TAG:
+                return handler(true, c, new ClearSpecialityMessage(getGame(), 
e));
+
+            case TrivialMessage.CONTINUE_TAG:
+                return handler(false, c, TrivialMessage.CONTINUE_MESSAGE);
+
+            case DeclareIndependenceMessage.TAG:
+                return handler(true, c, new 
DeclareIndependenceMessage(getGame(), e));
+
+            case DeclineMoundsMessage.TAG:
+                return handler(true, c, new DeclineMoundsMessage(getGame(), 
e));
+
+            case DeliverGiftMessage.TAG:
+                return handler(true, c, new DeliverGiftMessage(getGame(), e));
+
+            case DeleteTradeRouteMessage.TAG:
+                return handler(true, c, new DeleteTradeRouteMessage(getGame(), 
e));
+
+            case DemandTributeMessage.TAG:
+                return handler(true, c, new DemandTributeMessage(getGame(), 
e));
+
+            case DiplomacyMessage.TAG:
+                return handler(false, c, new DiplomacyMessage(getGame(), e));
+
+            case DisbandUnitMessage.TAG:
+                return handler(true, c, new DisbandUnitMessage(getGame(), e));
+
+            case DisembarkMessage.TAG:
+                return handler(true, c, new DisembarkMessage(getGame(), e));
+
+            case EmbarkMessage.TAG:
+                return handler(true, c, new EmbarkMessage(getGame(), e));
+
+            case EmigrateUnitMessage.TAG:
+                return handler(true, c, new EmigrateUnitMessage(getGame(), e));
+
+            case TrivialMessage.END_TURN_TAG:
+                return handler(true, c, TrivialMessage.END_TURN_MESSAGE);
+
+            case TrivialMessage.ENTER_REVENGE_MODE_TAG:
+                return handler(false, c, 
TrivialMessage.ENTER_REVENGE_MODE_MESSAGE);
+
+            case EquipForRoleMessage.TAG:
+                return handler(true, c, new EquipForRoleMessage(getGame(), e));
+
+            case FirstContactMessage.TAG:
+                return handler(false, c, new FirstContactMessage(getGame(), 
e));
+
+            case InciteMessage.TAG:
+                return handler(true, c, new InciteMessage(getGame(), e));
+
+            case IndianDemandMessage.TAG:
+                return handler(false, c, new IndianDemandMessage(getGame(), 
e));
+
+            case HighScoreMessage.TAG:
+                return handler(false, c, new HighScoreMessage(getGame(), e));
+
+            case JoinColonyMessage.TAG:
+                return handler(true, c, new JoinColonyMessage(getGame(), e));
+
+            case LearnSkillMessage.TAG:
+                return handler(true, c, new LearnSkillMessage(getGame(), e));
+
+            case LoadGoodsMessage.TAG:
+                return handler(true, c, new LoadGoodsMessage(getGame(), e));
+
+            case LootCargoMessage.TAG:
+                return handler(false, c, new LootCargoMessage(getGame(), e));
+
+            case MissionaryMessage.TAG:
+                return handler(true, c, new MissionaryMessage(getGame(), e));
+
+            case MonarchActionMessage.TAG:
+                return handler(true, c, new MonarchActionMessage(getGame(), 
e));
+
+            case MoveMessage.TAG:
+                return handler(true, c, new MoveMessage(getGame(), e));
+
+            case MoveToMessage.TAG:
+                return handler(true, c, new MoveToMessage(getGame(), e));
+
+            case NationSummaryMessage.TAG:
+                return handler(false, c, new NationSummaryMessage(getGame(), 
e));
+
+            case NativeGiftMessage.TAG:
+                return handler(true, c, new NativeGiftMessage(getGame(), e));
+
+            case NativeTradeMessage.TAG:
+                return handler(false, c, new NativeTradeMessage(getGame(), e));
+
+            case NewLandNameMessage.TAG:
+                return handler(false, c, new NewLandNameMessage(getGame(), e));
+
+            case NewRegionNameMessage.TAG:
+                return handler(false, c, new NewRegionNameMessage(getGame(), 
e));
+
+            case NewTradeRouteMessage.TAG:
+                return handler(true, c, new NewTradeRouteMessage(getGame(), 
e));
+
+            case PayArrearsMessage.TAG:
+                return handler(true, c, new PayArrearsMessage(getGame(), e));
+
+            case PayForBuildingMessage.TAG:
+                return handler(true, c, new PayForBuildingMessage(getGame(), 
e));
+
+            case PutOutsideColonyMessage.TAG:
+                return handler(true, c, new PutOutsideColonyMessage(getGame(), 
e));
+
+            case RearrangeColonyMessage.TAG:
+                return handler(true, c, new RearrangeColonyMessage(getGame(), 
e));
+
+            case RenameMessage.TAG:
+                return handler(true, c, new RenameMessage(getGame(), e));
+
+            case TrivialMessage.RETIRE_TAG:
+                return handler(false, c, TrivialMessage.RETIRE_MESSAGE);
+
+            case ScoutIndianSettlementMessage.TAG:
+                return handler(true, c, new 
ScoutIndianSettlementMessage(getGame(), e));
+
+            case ScoutSpeakToChiefMessage.TAG:
+                return handler(true, c, new 
ScoutSpeakToChiefMessage(getGame(), e));
+
+            case SetBuildQueueMessage.TAG:
+                return handler(true, c, new SetBuildQueueMessage(getGame(), 
e));
+
+            case SetCurrentStopMessage.TAG:
+                return handler(false, c, new SetCurrentStopMessage(getGame(), 
e));
+
+            case SetDestinationMessage.TAG:
+                return handler(false, c, new SetDestinationMessage(getGame(), 
e));
+
+            case SetGoodsLevelsMessage.TAG:
+                return handler(true, c, new SetGoodsLevelsMessage(getGame(), 
e));
+
+            case SpySettlementMessage.TAG:
+                return handler(false, c, new SpySettlementMessage(getGame(), 
e));
+
+            case TrainUnitInEuropeMessage.TAG:
+                return handler(true, c, new 
TrainUnitInEuropeMessage(getGame(), e));
+
+            case UnloadGoodsMessage.TAG:
+                return handler(true, c, new UnloadGoodsMessage(getGame(), e));
+
+            case UpdateTradeRouteMessage.TAG:
+                return handler(false, c, new 
UpdateTradeRouteMessage(getGame(), e));
+
+            case WorkMessage.TAG:
+                return handler(true, c, new WorkMessage(getGame(), e));
+
+            case MultipleMessage.TAG:
+                return (new MultipleMessage(getGame(), 
e).handle(getFreeColServer(), c));
 
-        register(AbandonColonyMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new AbandonColonyMessage(getGame(), e)));
-        register(AskSkillMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new AskSkillMessage(getGame(), e)));
-        register(AssignTeacherMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new AssignTeacherMessage(getGame(), e)));
-        register(AssignTradeRouteMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new AssignTradeRouteMessage(getGame(), e)));
-        register(AttackMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new AttackMessage(getGame(), e)));
-        register(BuildColonyMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new BuildColonyMessage(getGame(), e)));
-        register(CashInTreasureTrainMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new CashInTreasureTrainMessage(getGame(), e)));
-        register(ChangeStateMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new ChangeStateMessage(getGame(), e)));
-        register(ChangeWorkImprovementTypeMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new ChangeWorkImprovementTypeMessage(getGame(), e)));
-        register(ChangeWorkTypeMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new ChangeWorkTypeMessage(getGame(), e)));
-        register(ChooseFoundingFatherMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new ChooseFoundingFatherMessage(getGame(), e)));
-        register(ClaimLandMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new ClaimLandMessage(getGame(), e)));
-        register(ClearSpecialityMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new ClearSpecialityMessage(getGame(), e)));
-        register(TrivialMessage.CONTINUE_TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                TrivialMessage.CONTINUE_MESSAGE));
-        register(DeclareIndependenceMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new DeclareIndependenceMessage(getGame(), e)));
-        register(DeclineMoundsMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new DeclineMoundsMessage(getGame(), e)));
-        register(DeliverGiftMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new DeliverGiftMessage(getGame(), e)));
-        register(DeleteTradeRouteMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new DeleteTradeRouteMessage(getGame(), e)));
-        register(DemandTributeMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new DemandTributeMessage(getGame(), e)));
-        register(DiplomacyMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new DiplomacyMessage(getGame(), e)));
-        register(DisbandUnitMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new DisbandUnitMessage(getGame(), e)));
-        register(DisembarkMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new DisembarkMessage(getGame(), e)));
-        register(EmbarkMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new EmbarkMessage(getGame(), e)));
-        register(EmigrateUnitMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new EmigrateUnitMessage(getGame(), e)));
-        register(TrivialMessage.END_TURN_TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                TrivialMessage.END_TURN_MESSAGE));
-        register(TrivialMessage.ENTER_REVENGE_MODE_TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                TrivialMessage.ENTER_REVENGE_MODE_MESSAGE));
-        register(EquipForRoleMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new EquipForRoleMessage(getGame(), e)));
-        register(FirstContactMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new FirstContactMessage(getGame(), e)));
-        register(InciteMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new InciteMessage(getGame(), e)));
-        register(IndianDemandMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new IndianDemandMessage(getGame(), e)));
-        register(HighScoreMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new HighScoreMessage(getGame(), e)));
-        register(JoinColonyMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new JoinColonyMessage(getGame(), e)));
-        register(LearnSkillMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new LearnSkillMessage(getGame(), e)));
-        register(LoadGoodsMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new LoadGoodsMessage(getGame(), e)));
-        register(LootCargoMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new LootCargoMessage(getGame(), e)));
-        register(MissionaryMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new MissionaryMessage(getGame(), e)));
-        register(MonarchActionMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new MonarchActionMessage(getGame(), e)));
-        register(MoveMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new MoveMessage(getGame(), e)));
-        register(MoveToMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new MoveToMessage(getGame(), e)));
-        //register(MultipleMessage.TAG,
-        //    (Connection conn, Element e) -> handler(false, conn,
-        //        new MultipleMessage(getGame(), e)));
-        register(NationSummaryMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new NationSummaryMessage(getGame(), e)));
-        register(NativeGiftMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new NativeGiftMessage(getGame(), e)));
-        register(NativeTradeMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new NativeTradeMessage(getGame(), e)));
-        register(NewLandNameMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new NewLandNameMessage(getGame(), e)));
-        register(NewRegionNameMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new NewRegionNameMessage(getGame(), e)));
-        register(NewTradeRouteMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new NewTradeRouteMessage(getGame(), e)));
-        register(PayArrearsMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new PayArrearsMessage(getGame(), e)));
-        register(PayForBuildingMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new PayForBuildingMessage(getGame(), e)));
-        register(PutOutsideColonyMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new PutOutsideColonyMessage(getGame(), e)));
-        register(RearrangeColonyMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new RearrangeColonyMessage(getGame(), e)));
-        register(RenameMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new RenameMessage(getGame(), e)));
-        register(TrivialMessage.RETIRE_TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                TrivialMessage.RETIRE_MESSAGE));
-        register(ScoutIndianSettlementMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new ScoutIndianSettlementMessage(getGame(), e)));
-        register(ScoutSpeakToChiefMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new ScoutSpeakToChiefMessage(getGame(), e)));
-        register(SetBuildQueueMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new SetBuildQueueMessage(getGame(), e)));
-        register(SetCurrentStopMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new SetCurrentStopMessage(getGame(), e)));
-        register(SetDestinationMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new SetDestinationMessage(getGame(), e)));
-        register(SetGoodsLevelsMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new SetGoodsLevelsMessage(getGame(), e)));
-        register(SpySettlementMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new SpySettlementMessage(getGame(), e)));
-        register(TrainUnitInEuropeMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new TrainUnitInEuropeMessage(getGame(), e)));
-        register(UnloadGoodsMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new UnloadGoodsMessage(getGame(), e)));
-        register(UpdateTradeRouteMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new UpdateTradeRouteMessage(getGame(), e)));
-        register(WorkMessage.TAG,
-            (Connection conn, Element e) -> handler(true, conn,
-                new WorkMessage(getGame(), e)));
-
-        register(MultipleMessage.TAG,
-            (Connection connection, Element element) ->
-                new MultipleMessage(getGame(), element)
-                    .handle(freeColServer, connection));
+            default:
+                return super.handleElement(c, e);
+        }
     }
 }
diff --git a/src/net/sf/freecol/server/control/PreGameInputHandler.java 
b/src/net/sf/freecol/server/control/PreGameInputHandler.java
index 4a45a61320e..c19e4881fc2 100644
--- a/src/net/sf/freecol/server/control/PreGameInputHandler.java
+++ b/src/net/sf/freecol/server/control/PreGameInputHandler.java
@@ -19,6 +19,8 @@
 
 package net.sf.freecol.server.control;
 
+import java.net.UnknownServiceException;
+
 import net.sf.freecol.common.networking.Connection;
 import net.sf.freecol.common.networking.LogoutMessage;
 import net.sf.freecol.common.networking.ReadyMessage;
@@ -49,30 +51,39 @@ public final class PreGameInputHandler extends 
ServerInputHandler {
      */
     public PreGameInputHandler(FreeColServer freeColServer) {
         super(freeColServer);
+    }
+
+    @Override
+    public Element handleElement(Connection c, Element e)
+            throws UnknownServiceException {
+        String tag = e.getTagName().intern();
+        switch (tag) {
+            case ReadyMessage.TAG:
+                return handler(false, c, new ReadyMessage(getGame(), e));
+
+            case TrivialMessage.REQUEST_LAUNCH_TAG:
+                return handler(false, c, 
TrivialMessage.REQUEST_LAUNCH_MESSAGE);
+
+            case SetAvailableMessage.TAG:
+                return handler(false, c, new SetAvailableMessage(getGame(), 
e));
+
+            case SetColorMessage.TAG:
+                return handler(false, c, new SetColorMessage(getGame(), e));
+
+            case SetNationMessage.TAG:
+                return handler(false, c, new SetNationMessage(getGame(), e));
+
+            case SetNationTypeMessage.TAG:
+                return handler(false, c, new SetNationTypeMessage(getGame(), 
e));
+
+            case UpdateGameOptionsMessage.TAG:
+                return handler(false, c, new 
UpdateGameOptionsMessage(getGame(), e));
+
+            case UpdateMapGeneratorOptionsMessage.TAG:
+                return handler(false, c, new 
UpdateMapGeneratorOptionsMessage(getGame(), e));
 
-        register(ReadyMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new ReadyMessage(getGame(), e)));
-        register(TrivialMessage.REQUEST_LAUNCH_TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                TrivialMessage.REQUEST_LAUNCH_MESSAGE));
-        register(SetAvailableMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new SetAvailableMessage(getGame(), e)));
-        register(SetColorMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new SetColorMessage(getGame(), e)));
-        register(SetNationMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new SetNationMessage(getGame(), e)));
-        register(SetNationTypeMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new SetNationTypeMessage(getGame(), e)));
-        register(UpdateGameOptionsMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new UpdateGameOptionsMessage(getGame(), e)));
-        register(UpdateMapGeneratorOptionsMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new UpdateMapGeneratorOptionsMessage(getGame(), e)));
+            default:
+                return super.handleElement(c, e);
+        }
     }
 }
diff --git a/src/net/sf/freecol/server/control/ServerInputHandler.java 
b/src/net/sf/freecol/server/control/ServerInputHandler.java
index 1dab9bb0694..3e3ce43b326 100644
--- a/src/net/sf/freecol/server/control/ServerInputHandler.java
+++ b/src/net/sf/freecol/server/control/ServerInputHandler.java
@@ -19,6 +19,7 @@
 
 package net.sf.freecol.server.control;
 
+import java.net.UnknownServiceException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -44,7 +45,7 @@ import org.w3c.dom.Element;
 
 /**
  * Handles the network messages on the server side.
- * 
+ *
  * @see Controller
  */
 public abstract class ServerInputHandler extends FreeColServerHolder
@@ -53,59 +54,42 @@ public abstract class ServerInputHandler extends 
FreeColServerHolder
     private static final Logger logger = 
Logger.getLogger(ServerInputHandler.class.getName());
 
     /**
-     * A network request handler knows how to handle in a given request type.
-     */
-    public interface NetworkRequestHandler {
-
-        /**
-         * Handle a request represented by an {@link Element} and
-         * return another {@link Element} or null as the answer.
-         * 
-         * @param connection The message's {@code Connection}.
-         * @param element The root {@code Element} of the message.
-         * @return The reply {@code Element}, which may be null.
-         */
-        Element handle(Connection connection, Element element);
-    };
-
-    /**
-     * The handler map provides named handlers for network
-     * requests.  Each handler deals with a given request type.
-     */
-    private final Map<String, NetworkRequestHandler> handlerMap
-        = Collections.synchronizedMap(new HashMap<String, 
NetworkRequestHandler>());
-
-
-    /**
      * The constructor to use.
-     * 
+     *
      * @param freeColServer The main server object.
      */
     public ServerInputHandler(final FreeColServer freeColServer) {
         super(freeColServer);
-
-        register(ChatMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new ChatMessage(getGame(), e)));
-
-        register(TrivialMessage.DISCONNECT_TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                TrivialMessage.DISCONNECT_MESSAGE));
-
-        register(LogoutMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new LogoutMessage(getGame(), e)));
     }
 
-
     /**
-     * Register a network request handler.
-     * 
-     * @param name The handler name.
-     * @param handler The {@code NetworkRequestHandler} to register.
+     * Do the actual message handling.
+     *
+     * Common messages (applying to all game states) are handled here.
+     * Subclasses for individual game states will override it, but still call 
this
+     * one (super), in order to get the common messages handled.
+     *
+     * @param connection   The connection, where the messages coming in
+     * @param element      The message Element
+     * @return             Return element
+     * @throws UnknownServiceException if tag isn't handled
      */
-    protected final void register(String name, NetworkRequestHandler handler) {
-        this.handlerMap.put(name, handler);
+    public Element handleElement(Connection connection, Element element)
+            throws UnknownServiceException {
+        String tag = element.getTagName();
+        switch (tag) {
+            case ChatMessage.TAG:
+                return handler(false, connection, new ChatMessage(getGame(), 
element));
+
+            case TrivialMessage.DISCONNECT_TAG:
+                return handler(false, connection, 
TrivialMessage.DISCONNECT_MESSAGE);
+
+            case LogoutMessage.TAG:
+                return handler(false, connection, new LogoutMessage(getGame(), 
element));
+
+            default:
+                throw new UnknownServiceException("ServerInputHandler: 
unhandled tag: "+tag);
+        }
     }
 
     /**
@@ -138,27 +122,22 @@ public abstract class ServerInputHandler extends 
FreeColServerHolder
      */
     public final Element handle(Connection connection, Element element) {
         if (element == null) return null;
-        final FreeColServer freeColServer = getFreeColServer();
-        final String tag = element.getTagName();
-        final NetworkRequestHandler handler = handlerMap.get(tag);
-        Element ret = null;
-
-        if (handler == null) {
+        try {
+            Element ret = handleElement(connection, element);
+            logger.log(Level.FINEST, "Handling " + element.getTagName() + " ok 
= "
+                + ((ret == null) ? "null" : ret.getTagName()));
+            return ret;
+        } catch (UnknownServiceException e) {
             // Should we return an error here? The old handler returned null.
             logger.warning("No "
-                + freeColServer.getServerState().toString().toLowerCase()
-                + " handler for " + tag);
-        } else {
-            try {
-                ret = handler.handle(connection, element);
-                logger.log(Level.FINEST, "Handling " + tag + " ok = "
-                    + ((ret == null) ? "null" : ret.getTagName()));
-            } catch (Exception e) {
-                // FIXME: should we really catch Exception? The old code did.
-                logger.log(Level.WARNING, "Handling " + tag + " failed", e);
-                connection.sendReconnect();
-            }
+                + getFreeColServer().getServerState().toString().toLowerCase()
+                + " handler for " + element.getTagName()+" "+e);
+            return null;
+        } catch (Exception e) {
+            // FIXME: should we really catch Exception? The old code did.
+            logger.log(Level.WARNING, "Handling " + element.getTagName() + " 
failed", e);
+            connection.sendReconnect();
         }
-        return ret;
+        return null;
     }
 }
diff --git a/src/net/sf/freecol/server/control/UserConnectionHandler.java 
b/src/net/sf/freecol/server/control/UserConnectionHandler.java
index 6940f5a85d0..73d3d8ae00d 100644
--- a/src/net/sf/freecol/server/control/UserConnectionHandler.java
+++ b/src/net/sf/freecol/server/control/UserConnectionHandler.java
@@ -19,6 +19,7 @@
 
 package net.sf.freecol.server.control;
 
+import java.net.UnknownServiceException;
 import java.util.logging.Logger;
 
 import net.sf.freecol.common.model.Game;
@@ -50,16 +51,25 @@ public final class UserConnectionHandler extends 
ServerInputHandler {
      */
     public UserConnectionHandler(final FreeColServer freeColServer) {
         super(freeColServer);
+    }
+
+    @Override
+    public Element handleElement(Connection c, Element e)
+            throws UnknownServiceException {
+        String tag = e.getTagName();
+        switch (tag) {
+            case GameStateMessage.TAG:
+                return handler(false, c, new GameStateMessage(getGame(), e));
+
+            case LoginMessage.TAG:
+                return loginHandler(c, new LoginMessage(getGame(), e));
+
+            case VacantPlayersMessage.TAG:
+                return handler(false, c, new VacantPlayersMessage(getGame(), 
e));
 
-        register(GameStateMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new GameStateMessage(getGame(), e)));
-        register(LoginMessage.TAG,
-            (Connection conn, Element e) -> loginHandler(conn,
-                new LoginMessage(getGame(), e)));
-        register(VacantPlayersMessage.TAG,
-            (Connection conn, Element e) -> handler(false, conn,
-                new VacantPlayersMessage(getGame(), e)));
+            default:
+                return super.handleElement(c, e);
+        }
     }
 
     /**
-- 
2.11.0.rc0.7.gbe5a750


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, SlashDot.org! http://sdm.link/slashdot
_______________________________________________
Freecol-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/freecol-developers

Reply via email to