From f4f49627cfc5048bee1d478bec426d66c3ac0039 Mon Sep 17 00:00:00 2001 From: drdev Date: Sun, 31 May 2015 11:21:50 +0000 Subject: [PATCH] Refactor net connection logic to be reusable by app --- .gitattributes | 4 + .../src/main/java/forge/gui/FNetOverlay.java | 3 +- .../main/java/forge/screens/home/VLobby.java | 4 +- .../home/online/CSubmenuOnlineLobby.java | 140 +--------------- .../home/online/VSubmenuOnlineLobby.java | 8 +- .../java/forge/interfaces/ILobbyView.java | 5 + .../java/forge/net/IOnlineChatInterface.java | 6 + .../src/main/java/forge/net/IOnlineLobby.java | 10 ++ .../main/java/forge/net/NetConnectUtil.java | 149 ++++++++++++++++++ 9 files changed, 189 insertions(+), 140 deletions(-) create mode 100644 forge-gui/src/main/java/forge/interfaces/ILobbyView.java create mode 100644 forge-gui/src/main/java/forge/net/IOnlineChatInterface.java create mode 100644 forge-gui/src/main/java/forge/net/IOnlineLobby.java create mode 100644 forge-gui/src/main/java/forge/net/NetConnectUtil.java diff --git a/.gitattributes b/.gitattributes index 37e7894cc94..74ad0af7480 100644 --- a/.gitattributes +++ b/.gitattributes @@ -17635,6 +17635,7 @@ forge-gui/src/main/java/forge/interfaces/IGameController.java -text forge-gui/src/main/java/forge/interfaces/IGuiBase.java -text forge-gui/src/main/java/forge/interfaces/IGuiGame.java -text forge-gui/src/main/java/forge/interfaces/ILobbyListener.java -text +forge-gui/src/main/java/forge/interfaces/ILobbyView.java -text forge-gui/src/main/java/forge/interfaces/IMayViewCards.java -text forge-gui/src/main/java/forge/interfaces/IPlayerChangeListener.java -text forge-gui/src/main/java/forge/interfaces/IProgressBar.java -text @@ -17711,7 +17712,10 @@ forge-gui/src/main/java/forge/model/UnOpenedMeta.java -text forge-gui/src/main/java/forge/model/package-info.java svneol=native#text/plain forge-gui/src/main/java/forge/net/GameProtocolHandler.java -text forge-gui/src/main/java/forge/net/GameProtocolSender.java -text +forge-gui/src/main/java/forge/net/IOnlineChatInterface.java -text +forge-gui/src/main/java/forge/net/IOnlineLobby.java -text forge-gui/src/main/java/forge/net/IRemote.java -text +forge-gui/src/main/java/forge/net/NetConnectUtil.java -text forge-gui/src/main/java/forge/net/ProtocolMethod.java -text forge-gui/src/main/java/forge/net/ReplyPool.java -text forge-gui/src/main/java/forge/net/client/ClientGameLobby.java -text diff --git a/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java b/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java index 2c6dbde8240..19cb203d999 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java +++ b/forge-gui-desktop/src/main/java/forge/gui/FNetOverlay.java @@ -18,6 +18,7 @@ import org.apache.commons.lang3.StringUtils; import forge.Singletons; import forge.gui.framework.SDisplayUtil; import forge.model.FModel; +import forge.net.IOnlineChatInterface; import forge.net.IRemote; import forge.net.event.MessageEvent; import forge.properties.ForgePreferences; @@ -34,7 +35,7 @@ import forge.view.FDialog; import forge.view.FFrame; -public enum FNetOverlay { +public enum FNetOverlay implements IOnlineChatInterface { SINGLETON_INSTANCE; private static final String COORD_DELIM = ","; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java index c80377711b5..54cff3b133c 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/VLobby.java @@ -35,8 +35,8 @@ import forge.deckchooser.FDeckChooser; import forge.game.GameType; import forge.game.card.CardView; import forge.gui.CardDetailPanel; +import forge.interfaces.ILobbyView; import forge.interfaces.IPlayerChangeListener; -import forge.interfaces.IUpdateable; import forge.item.PaperCard; import forge.match.GameLobby; import forge.match.LobbySlot; @@ -66,7 +66,7 @@ import forge.util.storage.IStorage; * *

(V at beginning of class name denotes a view class.) */ -public class VLobby implements IUpdateable { +public class VLobby implements ILobbyView { static final int MAX_PLAYERS = 8; private static final ForgePreferences prefs = FModel.getPreferences(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java index 2446795ed0c..d8a33e042cc 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/online/CSubmenuOnlineLobby.java @@ -6,40 +6,18 @@ import java.util.List; import javax.swing.JMenu; import javax.swing.SwingUtilities; -import org.apache.commons.lang3.StringUtils; - import forge.FThreads; -import forge.GuiBase; -import forge.assets.FSkinProp; import forge.gui.FNetOverlay; import forge.gui.SOverlayUtils; import forge.gui.framework.EDocID; import forge.gui.framework.ICDoc; -import forge.interfaces.IGuiGame; -import forge.interfaces.ILobbyListener; -import forge.interfaces.IPlayerChangeListener; -import forge.interfaces.IUpdateable; -import forge.match.GameLobby.GameLobbyData; import forge.menus.IMenuProvider; import forge.menus.MenuUtil; -import forge.model.FModel; -import forge.net.IRemote; -import forge.net.client.ClientGameLobby; -import forge.net.client.FGameClient; -import forge.net.event.IdentifiableNetEvent; -import forge.net.event.MessageEvent; -import forge.net.event.NetEvent; -import forge.net.event.UpdateLobbyPlayerEvent; -import forge.net.server.FServerManager; -import forge.net.server.ServerGameLobby; -import forge.player.GamePlayerUtil; -import forge.properties.ForgePreferences.FPref; -import forge.properties.ForgeProfileProperties; +import forge.net.NetConnectUtil; import forge.screens.home.CHomeUI; import forge.screens.home.CLobby; import forge.screens.home.VLobby; import forge.screens.home.sanctioned.ConstructedGameMenu; -import forge.util.gui.SOptionPane; public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider { SINGLETON_INSTANCE; @@ -52,14 +30,9 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider { } void connectToServer() { - final String url = SOptionPane.showInputDialog("Enter URL of server to join. Leave blank to host your own server.", "Connect to Server"); + final String url = NetConnectUtil.getServerUrl(); if (url == null) { return; } - //prompt user for player one name if needed - if (StringUtils.isBlank(FModel.getPreferences().getPref(FPref.PLAYER_NAME))) { - GamePlayerUtil.setPlayerName(); - } - FThreads.invokeInBackgroundThread(new Runnable() { @Override public void run() { @@ -82,66 +55,13 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider { } }); - final int port = ForgeProfileProperties.getServerPort(); - final FServerManager server = FServerManager.getInstance(); - final ServerGameLobby lobby = new ServerGameLobby(); - final VLobby view = VSubmenuOnlineLobby.SINGLETON_INSTANCE.setLobby(lobby); - - server.startServer(port); - server.setLobby(lobby); - - lobby.setListener(new IUpdateable() { - @Override - public final void update(final boolean fullUpdate) { - view.update(fullUpdate); - server.updateLobbyState(); - } - }); - view.setPlayerChangeListener(new IPlayerChangeListener() { - @Override - public final void update(final int index, final UpdateLobbyPlayerEvent event) { - server.updateSlot(index, event); - server.updateLobbyState(); - } - }); - - server.setLobbyListener(new ILobbyListener() { - @Override - public final void update(final GameLobbyData state, final int slot) { - // NO-OP, lobby connected directly - } - @Override - public final void message(final String source, final String message) { - FNetOverlay.SINGLETON_INSTANCE.addMessage(source, message); - } - @Override - public final void close() { - // NO-OP, server can't receive close message - } - }); - FNetOverlay.SINGLETON_INSTANCE.setGameClient(new IRemote() { - @Override - public final void send(final NetEvent event) { - if (event instanceof MessageEvent) { - final MessageEvent message = (MessageEvent) event; - FNetOverlay.SINGLETON_INSTANCE.addMessage(message.getSource(), message.getMessage()); - server.broadcast(event); - } - } - @Override - public final Object sendAndWait(final IdentifiableNetEvent event) { - send(event); - return null; - } - }); - - view.update(true); + final String result = NetConnectUtil.host(VSubmenuOnlineLobby.SINGLETON_INSTANCE, FNetOverlay.SINGLETON_INSTANCE); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { SOverlayUtils.hideOverlay(); - FNetOverlay.SINGLETON_INSTANCE.show(String.format("Hosting on port %d", port)); + FNetOverlay.SINGLETON_INSTANCE.show(result); if (CHomeUI.SINGLETON_INSTANCE.getCurrentDocID() == EDocID.HOME_NETWORK) { VSubmenuOnlineLobby.SINGLETON_INSTANCE.populate(); } @@ -158,61 +78,13 @@ public enum CSubmenuOnlineLobby implements ICDoc, IMenuProvider { } }); - final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); - final FGameClient client = new FGameClient(FModel.getPreferences().getPref(FPref.PLAYER_NAME), "0", gui); - VSubmenuOnlineLobby.SINGLETON_INSTANCE.setClient(client); - FNetOverlay.SINGLETON_INSTANCE.setGameClient(client); - final ClientGameLobby lobby = new ClientGameLobby(); - final VLobby view = VSubmenuOnlineLobby.SINGLETON_INSTANCE.setLobby(lobby); - lobby.setListener(view); - client.addLobbyListener(new ILobbyListener() { - @Override - public final void message(final String source, final String message) { - FNetOverlay.SINGLETON_INSTANCE.addMessage(source, message); - } - @Override - public final void update(final GameLobbyData state, final int slot) { - lobby.setLocalPlayer(slot); - lobby.setData(state); - } - @Override - public final void close() { - SOptionPane.showMessageDialog("Connection to the host was interrupted.", "Error", FSkinProp.ICO_WARNING); - VSubmenuOnlineLobby.SINGLETON_INSTANCE.setClient(null); - } - }); - view.setPlayerChangeListener(new IPlayerChangeListener() { - @Override - public final void update(final int index, final UpdateLobbyPlayerEvent event) { - client.send(event); - } - }); - - final String hostname; - int port0 = ForgeProfileProperties.getServerPort(); - - //see if port specified in URL - int index = url.indexOf(':'); - if (index >= 0) { - hostname = url.substring(0, index); - String portStr = url.substring(index + 1); - try { - port0 = Integer.parseInt(portStr); - } - catch (Exception ex) {} - } - else { - hostname = url; - } - final int port = port0; - - client.connect(hostname, port); + final String result = NetConnectUtil.join(url, VSubmenuOnlineLobby.SINGLETON_INSTANCE, FNetOverlay.SINGLETON_INSTANCE); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { SOverlayUtils.hideOverlay(); - FNetOverlay.SINGLETON_INSTANCE.show(String.format("Connected to %s:%d", hostname, port)); + FNetOverlay.SINGLETON_INSTANCE.show(result); if (CHomeUI.SINGLETON_INSTANCE.getCurrentDocID() == EDocID.HOME_NETWORK) { VSubmenuOnlineLobby.SINGLETON_INSTANCE.populate(); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java b/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java index 5686fd1e147..7d95c67e468 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/online/VSubmenuOnlineLobby.java @@ -15,7 +15,9 @@ import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; import forge.gui.framework.FScreen; import forge.gui.framework.IVTopLevelUI; +import forge.interfaces.ILobbyView; import forge.match.GameLobby; +import forge.net.IOnlineLobby; import forge.net.client.FGameClient; import forge.net.server.FServerManager; import forge.screens.home.EMenuGroup; @@ -26,7 +28,7 @@ import forge.toolbox.FButton; import forge.toolbox.FSkin; import forge.util.gui.SOptionPane; -public enum VSubmenuOnlineLobby implements IVSubmenu, IVTopLevelUI { +public enum VSubmenuOnlineLobby implements IVSubmenu, IOnlineLobby, IVTopLevelUI { SINGLETON_INSTANCE; private DragCell parentCell; @@ -37,13 +39,13 @@ public enum VSubmenuOnlineLobby implements IVSubmenu, IVTop private VSubmenuOnlineLobby() { } - VLobby setLobby(final GameLobby lobby) { + public ILobbyView setLobby(final GameLobby lobby) { this.lobby = new VLobby(lobby); getLayoutControl().setLobby(this.lobby); return this.lobby; } - void setClient(final FGameClient client) { + public void setClient(final FGameClient client) { this.client = client; } diff --git a/forge-gui/src/main/java/forge/interfaces/ILobbyView.java b/forge-gui/src/main/java/forge/interfaces/ILobbyView.java new file mode 100644 index 00000000000..cc6af34040b --- /dev/null +++ b/forge-gui/src/main/java/forge/interfaces/ILobbyView.java @@ -0,0 +1,5 @@ +package forge.interfaces; + +public interface ILobbyView extends IUpdateable { + void setPlayerChangeListener(IPlayerChangeListener iPlayerChangeListener); +} diff --git a/forge-gui/src/main/java/forge/net/IOnlineChatInterface.java b/forge-gui/src/main/java/forge/net/IOnlineChatInterface.java new file mode 100644 index 00000000000..f5b09d88c22 --- /dev/null +++ b/forge-gui/src/main/java/forge/net/IOnlineChatInterface.java @@ -0,0 +1,6 @@ +package forge.net; + +public interface IOnlineChatInterface { + void setGameClient(IRemote iRemote); + void addMessage(String source, String message); +} diff --git a/forge-gui/src/main/java/forge/net/IOnlineLobby.java b/forge-gui/src/main/java/forge/net/IOnlineLobby.java new file mode 100644 index 00000000000..af92e023774 --- /dev/null +++ b/forge-gui/src/main/java/forge/net/IOnlineLobby.java @@ -0,0 +1,10 @@ +package forge.net; + +import forge.interfaces.ILobbyView; +import forge.match.GameLobby; +import forge.net.client.FGameClient; + +public interface IOnlineLobby { + ILobbyView setLobby(GameLobby lobby); + void setClient(FGameClient client); +} diff --git a/forge-gui/src/main/java/forge/net/NetConnectUtil.java b/forge-gui/src/main/java/forge/net/NetConnectUtil.java new file mode 100644 index 00000000000..5cac06cf781 --- /dev/null +++ b/forge-gui/src/main/java/forge/net/NetConnectUtil.java @@ -0,0 +1,149 @@ +package forge.net; + +import org.apache.commons.lang3.StringUtils; + +import forge.GuiBase; +import forge.assets.FSkinProp; +import forge.interfaces.IGuiGame; +import forge.interfaces.ILobbyListener; +import forge.interfaces.ILobbyView; +import forge.interfaces.IPlayerChangeListener; +import forge.interfaces.IUpdateable; +import forge.match.GameLobby.GameLobbyData; +import forge.model.FModel; +import forge.net.client.ClientGameLobby; +import forge.net.client.FGameClient; +import forge.net.event.IdentifiableNetEvent; +import forge.net.event.MessageEvent; +import forge.net.event.NetEvent; +import forge.net.event.UpdateLobbyPlayerEvent; +import forge.net.server.FServerManager; +import forge.net.server.ServerGameLobby; +import forge.player.GamePlayerUtil; +import forge.properties.ForgeProfileProperties; +import forge.properties.ForgePreferences.FPref; +import forge.util.gui.SOptionPane; + +public class NetConnectUtil { + private NetConnectUtil() { } + + public static String getServerUrl() { + final String url = SOptionPane.showInputDialog("Enter URL of server to join. Leave blank to host your own server.", "Connect to Server"); + if (url == null) { return null; } + + //prompt user for player one name if needed + if (StringUtils.isBlank(FModel.getPreferences().getPref(FPref.PLAYER_NAME))) { + GamePlayerUtil.setPlayerName(); + } + return url; + } + + public static String host(final IOnlineLobby onlineLobby, final IOnlineChatInterface chatInterface) { + final int port = ForgeProfileProperties.getServerPort(); + final FServerManager server = FServerManager.getInstance(); + final ServerGameLobby lobby = new ServerGameLobby(); + final ILobbyView view = onlineLobby.setLobby(lobby); + + server.startServer(port); + server.setLobby(lobby); + + lobby.setListener(new IUpdateable() { + @Override + public final void update(final boolean fullUpdate) { + view.update(fullUpdate); + server.updateLobbyState(); + } + }); + view.setPlayerChangeListener(new IPlayerChangeListener() { + @Override + public final void update(final int index, final UpdateLobbyPlayerEvent event) { + server.updateSlot(index, event); + server.updateLobbyState(); + } + }); + + server.setLobbyListener(new ILobbyListener() { + @Override + public final void update(final GameLobbyData state, final int slot) { + // NO-OP, lobby connected directly + } + @Override + public final void message(final String source, final String message) { + chatInterface.addMessage(source, message); + } + @Override + public final void close() { + // NO-OP, server can't receive close message + } + }); + chatInterface.setGameClient(new IRemote() { + @Override + public final void send(final NetEvent event) { + if (event instanceof MessageEvent) { + final MessageEvent message = (MessageEvent) event; + chatInterface.addMessage(message.getSource(), message.getMessage()); + server.broadcast(event); + } + } + @Override + public final Object sendAndWait(final IdentifiableNetEvent event) { + send(event); + return null; + } + }); + + view.update(true); + + return String.format("Hosting on port %d", port); + } + + public static String join(final String url, final IOnlineLobby onlineLobby, final IOnlineChatInterface chatInterface) { + final IGuiGame gui = GuiBase.getInterface().getNewGuiGame(); + final FGameClient client = new FGameClient(FModel.getPreferences().getPref(FPref.PLAYER_NAME), "0", gui); + onlineLobby.setClient(client); + chatInterface.setGameClient(client); + final ClientGameLobby lobby = new ClientGameLobby(); + final ILobbyView view = onlineLobby.setLobby(lobby); + lobby.setListener(view); + client.addLobbyListener(new ILobbyListener() { + @Override + public final void message(final String source, final String message) { + chatInterface.addMessage(source, message); + } + @Override + public final void update(final GameLobbyData state, final int slot) { + lobby.setLocalPlayer(slot); + lobby.setData(state); + } + @Override + public final void close() { + SOptionPane.showMessageDialog("Connection to the host was interrupted.", "Error", FSkinProp.ICO_WARNING); + onlineLobby.setClient(null); + } + }); + view.setPlayerChangeListener(new IPlayerChangeListener() { + @Override + public final void update(final int index, final UpdateLobbyPlayerEvent event) { + client.send(event); + } + }); + + String hostname = url; + int port = ForgeProfileProperties.getServerPort(); + + //see if port specified in URL + int index = url.indexOf(':'); + if (index >= 0) { + hostname = url.substring(0, index); + String portStr = url.substring(index + 1); + try { + port = Integer.parseInt(portStr); + } + catch (Exception ex) {} + } + + client.connect(hostname, port); + + return String.format("Connected to %s:%d", hostname, port); + } +}