client registration is now a blocking call on the client side + added server messages handlers

This commit is contained in:
betasteward 2015-05-24 22:56:11 -04:00
parent d2ae55fff6
commit b68cd765b7
11 changed files with 194 additions and 31 deletions

View file

@ -1002,20 +1002,25 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
this.tablesPane.hideTables();
}
public void showGames(boolean setActive) {
MagePane topPanebefore = getTopMost(tablesPane);
if (!tablesPane.isVisible()) {
this.tablesPane.setVisible(true);
this.tablesPane.showTables();
}
if (setActive) {
setActive(tablesPane);
} else {
// if other panel was already shown, mamke sure it's topmost again
if (topPanebefore != null) {
setActive(topPanebefore);
public void showGames(final boolean setActive) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
MagePane topPanebefore = getTopMost(tablesPane);
if (!tablesPane.isVisible()) {
tablesPane.setVisible(true);
tablesPane.showTables();
}
if (setActive) {
setActive(tablesPane);
} else {
// if other panel was already shown, mamke sure it's topmost again
if (topPanebefore != null) {
setActive(topPanebefore);
}
}
}
}
});
}
public void hideGames() {
@ -1372,13 +1377,13 @@ public class MageFrame extends javax.swing.JFrame implements MageClient {
@Override
public void clientRegistered(ServerState state) {
this.serverState = state;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
setWindowTitle();
showGames(false);
}
});
// SwingUtilities.invokeLater(new Runnable() {
// @Override
// public void run() {
// setWindowTitle();
// showGames(false);
// }
// });
}
@Override

View file

@ -366,7 +366,7 @@ public class ConnectDialog extends MageDialog {
if (result) {
lblStatus.setText("");
connected();
// MageFrame.getInstance().showGames(false);
MageFrame.getInstance().showGames(false);
} else {
lblStatus.setText("Could not connect");
}

View file

@ -15,7 +15,6 @@ import java.util.Collection;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.logging.Level;
import mage.cards.decks.DeckCardLists;
import mage.constants.ManaType;
import mage.constants.PlayerAction;
@ -37,13 +36,10 @@ import org.mage.network.handlers.client.ChatMessageHandler;
import org.mage.network.handlers.client.ChatRoomHandler;
import org.mage.network.handlers.client.ClientRegisteredMessageHandler;
import org.mage.network.handlers.client.InformClientMessageHandler;
import org.mage.network.handlers.client.MessageHandler;
import org.mage.network.handlers.client.ServerMessageHandler;
import org.mage.network.interfaces.MageClient;
import org.mage.network.model.JoinChatMessage;
import org.mage.network.model.LeaveChatMessage;
import org.mage.network.model.MessageType;
import org.mage.network.model.RegisterClientMessage;
import org.mage.network.model.SendChatMessage;
/**
*
@ -62,6 +58,7 @@ public class Client {
private final ChatMessageHandler chatMessageHandler;
private final InformClientMessageHandler informClientMessageHandler;
private final ClientRegisteredMessageHandler clientRegisteredMessageHandler;
private final ServerMessageHandler serverMessageHandler;
private Channel channel;
private EventLoopGroup group;
@ -74,6 +71,7 @@ public class Client {
chatMessageHandler = new ChatMessageHandler(client);
informClientMessageHandler = new InformClientMessageHandler(client);
clientRegisteredMessageHandler = new ClientRegisteredMessageHandler(client);
serverMessageHandler = new ServerMessageHandler();
}
public boolean connect(String userName, String host, int port, MageVersion version) {
@ -87,8 +85,10 @@ public class Client {
.channel(NioSocketChannel.class)
.handler(new ClientInitializer());
clientRegisteredMessageHandler.setUserName(userName);
clientRegisteredMessageHandler.setVersion(version);
channel = b.connect(host, port).sync().channel();
channel.writeAndFlush(new RegisterClientMessage(userName, version));
clientRegisteredMessageHandler.registerClient();
client.connected(userName + "@" + host + ":" + port + " ");
return true;
} catch (InterruptedException ex) {
@ -116,6 +116,7 @@ public class Client {
ch.pipeline().addLast("informClientMessageHandler", informClientMessageHandler);
ch.pipeline().addLast("clientRegisteredMessageHandler", clientRegisteredMessageHandler);
ch.pipeline().addLast("chatRoomHandler", chatRoomHandler);
ch.pipeline().addLast("serverMessageHandler", serverMessageHandler);
}
}
@ -279,7 +280,12 @@ public class Client {
}
public List<String> getServerMessages() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
try {
return serverMessageHandler.getServerMessages();
} catch (Exception ex) {
logger.error("Error getting server messages", ex);
}
return null;
}
public Collection<TableView> getTables(UUID roomId) {

View file

@ -29,6 +29,7 @@ import org.mage.network.handlers.server.ConnectionHandler;
import org.mage.network.handlers.server.JoinChatMessageHandler;
import org.mage.network.handlers.server.LeaveChatMessageHandler;
import org.mage.network.handlers.server.RegisterClientMessageHandler;
import org.mage.network.handlers.server.ServerMessageHandler;
import org.mage.network.interfaces.MageServer;
import org.mage.network.model.InformClientMessage;
import org.mage.network.model.MessageType;
@ -56,6 +57,7 @@ public class Server {
private final ChatMessageHandler chatMessageHandler;
private final JoinChatMessageHandler joinChatMessageHandler;
private final LeaveChatMessageHandler leaveChatMessageHandler;
private final ServerMessageHandler serverMessageHandler;
public Server(MageServer server) {
registerClientMessageHandler = new RegisterClientMessageHandler(server);
@ -63,6 +65,7 @@ public class Server {
joinChatMessageHandler = new JoinChatMessageHandler(server);
leaveChatMessageHandler = new LeaveChatMessageHandler(server);
chatRoomIdHandler = new ChatRoomIdHandler(server);
serverMessageHandler = new ServerMessageHandler(server);
}
public void start(int port) {
@ -105,6 +108,7 @@ public class Server {
ch.pipeline().addLast(handlersExecutor, chatMessageHandler);
ch.pipeline().addLast(handlersExecutor, joinChatMessageHandler);
ch.pipeline().addLast(handlersExecutor, leaveChatMessageHandler);
ch.pipeline().addLast(handlersExecutor, serverMessageHandler);
}
}

View file

@ -2,8 +2,14 @@ package org.mage.network.handlers.client;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import java.util.UUID;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import mage.interfaces.ServerState;
import mage.utils.MageVersion;
import org.mage.network.interfaces.MageClient;
import org.mage.network.model.ClientRegisteredMessage;
import org.mage.network.model.RegisterClientMessage;
/**
*
@ -11,15 +17,38 @@ import org.mage.network.model.ClientRegisteredMessage;
*/
public class ClientRegisteredMessageHandler extends SimpleChannelInboundHandler<ClientRegisteredMessage> {
private final MageClient client;
private final MageClient client;
// private ChannelHandlerContext ctx;
private final BlockingQueue<ServerState> queue = new LinkedBlockingQueue<>();
private String userName;
private MageVersion version;
public ClientRegisteredMessageHandler (MageClient client) {
this.client = client;
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
// this.ctx = ctx;
ctx.writeAndFlush(new RegisterClientMessage(userName, version));
super.channelActive(ctx);
}
@Override
protected void messageReceived(ChannelHandlerContext ctx, ClientRegisteredMessage msg) throws Exception {
client.clientRegistered(msg.getServerState());
queue.offer(msg.getServerState());
}
public void setUserName(String userName) {
this.userName = userName;
}
public void setVersion(MageVersion version) {
this.version = version;
}
public void registerClient() throws InterruptedException {
client.clientRegistered(queue.take());
}
}

View file

@ -0,0 +1,37 @@
package org.mage.network.handlers.client;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import org.mage.network.model.ServerMessagesMessage;
import org.mage.network.model.ServerMessagesRequest;
/**
*
* @author BetaSteward
*/
public class ServerMessageHandler extends SimpleChannelInboundHandler<ServerMessagesMessage> {
private ChannelHandlerContext ctx;
private final BlockingQueue<List<String>> queue = new LinkedBlockingQueue<>();
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
this.ctx = ctx;
super.channelActive(ctx);
}
@Override
protected void messageReceived(ChannelHandlerContext ctx, ServerMessagesMessage msg) throws Exception {
queue.offer(msg.getMessages());
}
public List<String> getServerMessages() throws Exception {
ctx.writeAndFlush(new ServerMessagesRequest());
return queue.take();
}
}

View file

@ -0,0 +1,39 @@
package org.mage.network.handlers.server;
import io.netty.channel.ChannelHandler.Sharable;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import org.mage.network.interfaces.MageServer;
import org.mage.network.model.ServerMessagesMessage;
import org.mage.network.model.ServerMessagesRequest;
/**
*
* @author BetaSteward
*/
@Sharable
public class ServerMessageHandler extends SimpleChannelInboundHandler<ServerMessagesRequest> {
private final MageServer server;
public ServerMessageHandler (MageServer server) {
this.server = server;
}
@Override
public void messageReceived(ChannelHandlerContext ctx, ServerMessagesRequest msg) {
ctx.writeAndFlush(new ServerMessagesMessage(server.getServerMessages()));
}
@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
ctx.flush();
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
cause.printStackTrace();
ctx.close();
}
}

View file

@ -1,5 +1,6 @@
package org.mage.network.interfaces;
import java.util.List;
import java.util.UUID;
import mage.interfaces.ServerState;
import mage.utils.MageVersion;
@ -19,5 +20,7 @@ public interface MageServer {
void receiveBroadcastMessage(String message, String sessionId);
ServerState getServerState();
public List<String> getServerMessages();
}

View file

@ -0,0 +1,22 @@
package org.mage.network.model;
import java.io.Serializable;
import java.util.List;
/**
*
* @author BetaSteward
*/
public class ServerMessagesMessage implements Serializable {
private List<String> messages;
public ServerMessagesMessage(List<String> messages) {
this.messages = messages;
}
public List<String> getMessages() {
return messages;
}
}

View file

@ -0,0 +1,12 @@
package org.mage.network.model;
import java.io.Serializable;
/**
*
* @author BetaSteward
*/
public class ServerMessagesRequest implements Serializable {
}

View file

@ -1152,6 +1152,12 @@ public class Main implements MageServer {
// });
// }
//
@Override
public List<String> getServerMessages() {
return ServerMessagesUtil.getInstance().getMessages();
}
// @Override
// public Object getServerMessagesCompressed(String sessionId) throws MageException {
// return executeWithResult("getGameView", sessionId, new ActionWithNullNegativeResult<Object>() {