Refactor ConnectionControl

git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@475 72836036-5685-4462-b002-a69064685172
This commit is contained in:
Matthias Schiffer 2011-06-19 00:58:06 +02:00
parent 71f1f20d35
commit 7396a4ee85
2 changed files with 57 additions and 72 deletions

View file

@ -68,14 +68,14 @@ public class ConnectionControl implements IConnectionControl {
@Override @Override
public void connect() { public void connect() {
new Thread(new ConnectRunner()).start(); run(new ConnectRunner());
} }
@Override @Override
public void disconnect() { public void disconnect() {
connectedEvent = new Event(); connectedEvent = new Event();
connectionFailedEvent = new Event(); connectionFailedEvent = new Event();
new Thread(new Runnable() { run(new Runnable() {
@Override @Override
public void run() { public void run() {
synchronized (ConnectionControl.this) { synchronized (ConnectionControl.this) {
@ -85,7 +85,7 @@ public class ConnectionControl implements IConnectionControl {
} }
} }
} }
}).start(); });
} }
@Override @Override
@ -140,17 +140,13 @@ public class ConnectionControl implements IConnectionControl {
offeredGame = null; offeredGame = null;
final UUID uuid = currentGame.getGameID(); final UUID uuid = currentGame.getGameID();
currentGame = null; currentGame = null;
new Thread(new SendRunner() { run(new SendRunner() {
@Override @Override
public Message send() { protected void addData(DefaultPacketExtension extension) {
DefaultPacketExtension extension = createJRummikubExtension();
extension.setValue("messageType", "game_withdrawal"); extension.setValue("messageType", "game_withdrawal");
extension.setValue("uuid", uuid.toString()); extension.setValue("uuid", uuid.toString());
return createMessage(extension);
} }
}).start(); });
} }
@Override @Override
@ -163,104 +159,86 @@ public class ConnectionControl implements IConnectionControl {
this.currentGame = game; this.currentGame = game;
} }
private void run(Runnable runner) {
new Thread(runner).start();
}
@Override @Override
public void joinGame(final GameData game) { public void joinGame(final GameData game) {
setCurrentGame(game); setCurrentGame(game);
new Thread(new SendRunner() { run(new SendRunner() {
@Override @Override
public Message send() { protected void addData(DefaultPacketExtension extension) {
DefaultPacketExtension extension = createJRummikubExtension();
extension.setValue("messageType", "game_join"); extension.setValue("messageType", "game_join");
extension.setValue("uuid", game.getGameID().toString()); extension.setValue("uuid", game.getGameID().toString());
return createMessage(extension);
} }
}).start(); });
} }
@Override @Override
public void leaveGame() { public void leaveGame() {
final UUID uuid = currentGame.getGameID(); final UUID uuid = currentGame.getGameID();
currentGame = null; currentGame = null;
new Thread(new SendRunner() { run(new SendRunner() {
@Override @Override
public Message send() { protected void addData(DefaultPacketExtension extension) {
DefaultPacketExtension extension = createJRummikubExtension();
extension.setValue("messageType", "game_leave"); extension.setValue("messageType", "game_leave");
extension.setValue("uuid", uuid.toString()); extension.setValue("uuid", uuid.toString());
return createMessage(extension);
} }
}).start(); });
} }
@Override @Override
public void ackJoinGame(final String recipient, final boolean ack) { public void ackJoinGame(final String recipient, final boolean ack) {
final UUID uuid = currentGame.getGameID(); final UUID uuid = currentGame.getGameID();
new Thread(new SendRunner() { run(new SendRunner() {
@Override @Override
public Message send() { protected void addData(DefaultPacketExtension extension) {
DefaultPacketExtension extension = createJRummikubExtension();
extension.setValue("messageType", "game_join_ack"); extension.setValue("messageType", "game_join_ack");
extension.setValue("uuid", uuid.toString()); extension.setValue("uuid", uuid.toString());
extension.setValue("ack", Boolean.toString(ack)); extension.setValue("ack", Boolean.toString(ack));
}
Message message = createMessage(extension); @Override
protected void modifyMessage(Message message) {
message.setType(Message.Type.normal); message.setType(Message.Type.normal);
message.setTo(muc.getRoom() + "/" + recipient); message.setTo(muc.getRoom() + "/" + recipient);
return message;
} }
}).start(); });
} }
@Override @Override
public void changeColor(final Color color) { public void changeColor(final Color color) {
final UUID uuid = currentGame.getGameID(); final UUID uuid = currentGame.getGameID();
new Thread(new SendRunner() { run(new SendRunner() {
@Override @Override
public Message send() { protected void addData(DefaultPacketExtension extension) {
DefaultPacketExtension extension = createJRummikubExtension();
extension.setValue("messageType", "change_color"); extension.setValue("messageType", "change_color");
extension.setValue("uuid", uuid.toString()); extension.setValue("uuid", uuid.toString());
extension.setValue("color", extension.setValue("color", Base64.encodeObject(color, Base64.GZIP));
Base64.encodeObject(color, Base64.GZIP));
return createMessage(extension);
} }
}).start(); });
} }
private void sendGameOffer() { private void sendGameOffer() {
final GameData data = offeredGame; final GameData data = offeredGame;
new Thread(new SendRunner() { run(new SendRunner() {
@Override @Override
public Message send() { protected void addData(DefaultPacketExtension extension) {
DefaultPacketExtension extension = createJRummikubExtension();
extension.setValue("messageType", "game_offer"); extension.setValue("messageType", "game_offer");
extension.setValue("uuid", data.getGameID().toString()); extension.setValue("uuid", data.getGameID().toString());
extension.setValue("gameSettings", Base64.encodeObject( extension.setValue("gameSettings",
data.getGameSettings(), Base64.GZIP)); Base64.encodeObject(data.getGameSettings(), Base64.GZIP));
return createMessage(extension);
} }
}).start(); });
} }
private void requestGames() { private void requestGames() {
new Thread(new SendRunner() { run(new SendRunner() {
@Override @Override
public Message send() { protected void addData(DefaultPacketExtension extension) {
DefaultPacketExtension extension = createJRummikubExtension();
extension.setValue("messageType", "game_request"); extension.setValue("messageType", "game_request");
return createMessage(extension);
} }
}); });
} }
@ -289,8 +267,8 @@ public class ConnectionControl implements IConnectionControl {
.getExtension(ELEMENT_NAME, NAMESPACE); .getExtension(ELEMENT_NAME, NAMESPACE);
if (((Message) packet).getType() == Message.Type.error) { if (((Message) packet).getType() == Message.Type.error) {
System.err.println("Received error message from '" System.err.println("Received error message from '" + packet.getFrom()
+ packet.getFrom() + "'"); + "'");
return; return;
} }
@ -306,14 +284,13 @@ public class ConnectionControl implements IConnectionControl {
String sender, String messageType) { String sender, String messageType) {
if (messageType.equals("game_offer")) { if (messageType.equals("game_offer")) {
UUID uuid = UUID.fromString(extension.getValue("uuid")); UUID uuid = UUID.fromString(extension.getValue("uuid"));
GameSettings settings = (GameSettings) Base64 GameSettings settings = (GameSettings) Base64.decodeToObject(extension
.decodeToObject(extension.getValue("gameSettings")); .getValue("gameSettings"));
GameData gameData = new GameData(uuid, settings, sender); GameData gameData = new GameData(uuid, settings, sender);
gameOfferEvent.emit(gameData); gameOfferEvent.emit(gameData);
} else if (messageType.equals("game_withdrawal")) { } else if (messageType.equals("game_withdrawal")) {
gameWithdrawalEvent gameWithdrawalEvent.emit(UUID.fromString(extension.getValue("uuid")));
.emit(UUID.fromString(extension.getValue("uuid")));
} else if (messageType.equals("game_request")) { } else if (messageType.equals("game_request")) {
if (offeredGame != null) { if (offeredGame != null) {
sendGameOffer(); sendGameOffer();
@ -334,11 +311,10 @@ public class ConnectionControl implements IConnectionControl {
} else if (messageType.equals("game_leave")) { } else if (messageType.equals("game_leave")) {
gameLeaveEvent.emit(sender); gameLeaveEvent.emit(sender);
} else if (messageType.equals("game_join_ack")) { } else if (messageType.equals("game_join_ack")) {
gameJoinAckEvent gameJoinAckEvent.emit(Boolean.valueOf(extension.getValue("ack")));
.emit(Boolean.valueOf(extension.getValue("ack")));
} else if (messageType.equals("change_color")) { } else if (messageType.equals("change_color")) {
changeColorEvent.emit(sender, (Color) Base64 changeColorEvent.emit(sender,
.decodeToObject(extension.getValue("color"))); (Color) Base64.decodeToObject(extension.getValue("color")));
} else { } else {
System.err.println("Received unrecognized message of type '" System.err.println("Received unrecognized message of type '"
+ messageType + "'"); + messageType + "'");
@ -395,8 +371,7 @@ public class ConnectionControl implements IConnectionControl {
break; // Join was successful, break the loop break; // Join was successful, break the loop
} catch (XMPPException e) { } catch (XMPPException e) {
XMPPError error = e.getXMPPError(); XMPPError error = e.getXMPPError();
if (error.getType() == Type.CANCEL if (error.getType() == Type.CANCEL && error.getCode() == 409) {
&& error.getCode() == 409) {
// There was a conflict, try again with another // There was a conflict, try again with another
// nickname // nickname
nickname += "_"; nickname += "_";
@ -419,11 +394,18 @@ public class ConnectionControl implements IConnectionControl {
public void run() { public void run() {
synchronized (ConnectionControl.this) { synchronized (ConnectionControl.this) {
if (connection != null) { if (connection != null) {
connection.sendPacket(send()); DefaultPacketExtension extension = createJRummikubExtension();
addData(extension);
Message message = createMessage(extension);
modifyMessage(message);
connection.sendPacket(message);
} }
} }
} }
abstract public Message send(); abstract protected void addData(DefaultPacketExtension extension);
protected void modifyMessage(Message message) {
}
} }
} }

View file

@ -19,16 +19,19 @@ public class GameJoinControl extends AbstractGameBeginControl {
* Creates new game join control * Creates new game join control
* *
* @param connectionControl * @param connectionControl
* the current connection control for events and messages * the current connection control for events and messages
* @param gameData * @param gameData
* the game data for settings, game id * the game data for settings, game id
* @param view * @param view
* the view * the view
*/ */
public GameJoinControl(final IConnectionControl connectionControl, public GameJoinControl(final IConnectionControl connectionControl,
final GameData gameData, final IView view) { final GameData gameData, final IView view) {
super(connectionControl, view, gameData, SettingsMode.NETWORK_JOIN); super(connectionControl, view, gameData, SettingsMode.NETWORK_JOIN);
fixGameSettings(gameData.getGameSettings());
updateSettingsPanel();
connections.add(connectionControl.getGameOfferEvent().add( connections.add(connectionControl.getGameOfferEvent().add(
new IListener1<GameData>() { new IListener1<GameData>() {
@Override @Override