Attempt to send obj

This commit is contained in:
Andrin Fassbind
2022-04-16 21:04:51 +02:00
parent b67b9c84aa
commit 77e9cf6163
7 changed files with 109 additions and 176 deletions
@@ -1,7 +1,9 @@
package ch.zhaw.pm2.multichat.client;
import ch.zhaw.pm2.multichat.protocol.ConnectionHandler;
import ch.zhaw.pm2.multichat.protocol.ConnectionHandler.State;
import ch.zhaw.pm2.multichat.protocol.ChatProtocolException;
import ch.zhaw.pm2.multichat.protocol.Message;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
@@ -231,7 +233,7 @@ public class ChatWindowController {
* @param message String to be added as Error
*/
public void addError(String message) {
messages.addMessage(new Message(Message.MessageType.ERROR, null, null, message));
messages.addMessage(new Message(ConnectionHandler.DATA_TYPE.DATA_TYPE_ERROR, null, null, message));
}
/**
@@ -2,6 +2,7 @@ package ch.zhaw.pm2.multichat.client;
import ch.zhaw.pm2.multichat.protocol.ChatProtocolException;
import ch.zhaw.pm2.multichat.protocol.ConnectionHandler;
import ch.zhaw.pm2.multichat.protocol.Message;
import ch.zhaw.pm2.multichat.protocol.NetworkHandler;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleObjectProperty;
@@ -122,7 +123,7 @@ public class ClientConnectionHandler extends ConnectionHandler implements Runnab
try {
System.out.println("Start receiving data...");
while (getConnection().isAvailable()) {
String data = getConnection().receive();
Message data = (Message) getConnection().receive();
processData(data);
}
System.out.println("Stopped receiving data");
@@ -162,95 +163,76 @@ public class ClientConnectionHandler extends ConnectionHandler implements Runnab
*
* @param data that is received in a form of a String and then used depending on its determined cause.
*/
private void processData(String data) {
try {
Scanner scanner = new Scanner(data);
StringBuilder sender = new StringBuilder();
StringBuilder receiver = new StringBuilder();
StringBuilder type = new StringBuilder();
StringBuilder payload = new StringBuilder();
super.processData(scanner, sender, receiver, type, payload);
// dispatch operation based on type parameter
if (type.toString().equals(getDataTypeConnect())) {
System.err.println("Illegal connect request from server");
} else if (type.toString().equals(getDataTypeConfirm())) {
caseConfirm(sender.toString(), receiver.toString(), payload.toString());
} else if (type.toString().equals(getDataTypeDisconnect())) {
caseDisconnect(sender.toString(), receiver.toString(), payload.toString());
} else if (type.toString().equals(getDataTypeMessage())) {
caseMessage(sender.toString(), receiver.toString(), payload.toString());
} else if (type.toString().equals(getDataTypeError())) {
caseError(sender.toString(), receiver.toString(), payload.toString());
} else {
System.out.println("Unknown data type received: " + type);
}
} catch (ChatProtocolException e) {
System.err.println("Error while processing data: " + e.getMessage());
sendData(USER_NONE, userName.get(), getDataTypeError(), e.getMessage());
private void processData(Message data) {
// dispatch operation based on type parameter
if (data.getType() == DATA_TYPE.DATA_TYPE_CONNECT) {
System.err.println("Illegal connect request from server");
} else if (data.getType() == DATA_TYPE.DATA_TYPE_CONFIRM) {
caseConfirm(data);
} else if (data.getType() == DATA_TYPE.DATA_TYPE_DISCONNECT) {
caseDisconnect(data);
} else if (data.getType() == DATA_TYPE.DATA_TYPE_MESSAGE) {
caseMessage(data);
} else if (data.getType() == DATA_TYPE.DATA_TYPE_ERROR) {
caseError(data);
} else {
System.out.println("Unknown data type received: " + data.getType());
}
}
private void caseConfirm(String sender, String receiver, String payload) {
private void caseConfirm(Message data) {
if (state.get() == CONFIRM_CONNECT) {
this.userName.set(receiver);
this.userName.set(data.getReceiver());
this.serverPort.set(getConnection().getRemotePort());
this.serverAddress.set(getConnection().getRemoteHost());
messages.addMessage(new Message(Message.MessageType.INFO, sender, receiver, payload));
System.out.println("CONFIRM: " + payload);
messages.addMessage(data);
System.out.println("CONFIRM: " + data.getText());
this.setState(CONNECTED);
} else if (state.get() == CONFIRM_DISCONNECT) {
messages.addMessage(new Message(Message.MessageType.INFO, sender, receiver, payload));
System.out.println("CONFIRM: " + payload);
messages.addMessage(data);
System.out.println("CONFIRM: " + data.getText());
this.setState(DISCONNECTED);
} else {
System.err.println("Got unexpected confirm message: " + payload);
System.err.println("Got unexpected confirm message: " + data.getText());
}
}
/**
* Initiates the disconnect sequence and sends the message with all its info.
*
* @param sender the sender name of the message
* @param receiver the receiver name of the message
* @param payload the added payload that corresponds to the message
* @param data Data which has been transmitted
*/
private void caseDisconnect(String sender, String receiver, String payload) {
private void caseDisconnect(Message data) {
if (state.get() == DISCONNECTED) {
System.out.println("DISCONNECT: Already in disconnected: " + payload);
System.out.println("DISCONNECT: Already in disconnected: " + data.getText());
return;
}
messages.addMessage(new Message(Message.MessageType.INFO, sender, receiver, payload));
System.out.println("DISCONNECT: " + payload);
messages.addMessage(data);
System.out.println("DISCONNECT: " + data.getText());
this.setState(DISCONNECTED);
}
/**
* Initiates the procedure to send a new message and sends one as such.
*
* @param sender the sender name of the message
* @param receiver the receiver name of the message
* @param payload the added payload that corresponds to the message
* @param data Data which has been transmitted
*/
private void caseMessage(String sender, String receiver, String payload) {
private void caseMessage(Message data) {
if (state.get() != CONNECTED) {
System.out.println("MESSAGE: Illegal state " + state + " for message: " + payload);
System.out.println("MESSAGE: Illegal state " + state + " for message: " + data.getText());
return;
}
messages.addMessage(new Message(Message.MessageType.MESSAGE, sender, receiver, payload));
System.out.println("MESSAGE: From " + sender + " to " + receiver + ": " + payload);
messages.addMessage(data);
System.out.println("MESSAGE: From " + data.getSender() + " to " + data.getReceiver() + ": " + data.getText());
}
/**
* Stores the message as an error message and displays it as such as well.
*
* @param sender the sender name of the message
* @param receiver the receiver name of the message
* @param payload the added payload that corresponds to the message
* @param data Data which has been transmitted
*/
private void caseError(String sender, String receiver, String payload) {
messages.addMessage(new Message(Message.MessageType.ERROR, sender, receiver, payload));
System.out.println("ERROR: " + payload);
private void caseError(Message data) {
messages.addMessage(data);
System.out.println("ERROR: " + data.getText());
}
/**
@@ -1,5 +1,7 @@
package ch.zhaw.pm2.multichat.client;
import ch.zhaw.pm2.multichat.protocol.ConnectionHandler;
import ch.zhaw.pm2.multichat.protocol.Message;
import javafx.beans.property.SimpleBooleanProperty;
import java.util.ArrayList;
@@ -35,10 +37,10 @@ public class ClientMessageList {
for (Message message : messages) {
if (showAll || message.matchesFilter(filter)) {
switch (message.getType()) {
case MESSAGE ->
case DATA_TYPE_MESSAGE ->
result.append(String.format("[%s -> %s] %s\n", message.getSender(), message.getReceiver(), message.getText()));
case ERROR -> result.append(String.format("[ERROR] %s\n", message.getText()));
case INFO -> result.append(String.format("[INFO] %s\n", message.getText()));
case DATA_TYPE_ERROR -> result.append(String.format("[ERROR] %s\n", message.getText()));
case DATA_TYPE_CONFIRM, DATA_TYPE_DISCONNECT, DATA_TYPE_CONNECT -> result.append(String.format("[INFO] %s\n", message.getText()));
default ->
result.append(String.format("[ERROR] %s\n", "Unexpected message type: " + message.getType()));
}
@@ -1,73 +0,0 @@
package ch.zhaw.pm2.multichat.client;
/**
* A Message object represents one Message of a client. Can be stored in ClientMessageList.
*/
public class Message {
private final MessageType type;
private final String sender;
private final String receiver;
private final String text;
/**
* Constructor of Message. Needs all Information about a Message to save them.
*
* @param type Message (if it's a message typed by a user), Error or Information (if it is generated automatically, in this case sender and receiver will be null)
* @param sender The User who has sent the message.
* @param receiver The User who should receive the message.
* @param text The Text of the message.
*/
public Message(MessageType type, String sender, String receiver, String text) {
this.type = type;
this.sender = sender;
this.receiver = receiver;
this.text = text;
}
/**
* Checks if the Filter String is contained in one of the data fields sender, receiver or text
*
* @param filter The Filter String
* @return true if it is the Filter String is contained in a data field.
*/
public boolean matchesFilter(String filter) {
return (sender != null && sender.contains(filter)) ||
(receiver != null && receiver.contains(filter)) ||
(text != null && text.contains(filter));
}
/**
* @return The type of the message.
*/
public MessageType getType() {
return type;
}
/**
* @return The User who has sent the Message.
*/
public String getSender() {
return sender;
}
/**
* @return The Receiver who receives the Message.
*/
public String getReceiver() {
return receiver;
}
/**
* @return The Text of the Message.
*/
public String getText() {
return text;
}
/**
* Enumeration of Message Types.
*/
public enum MessageType {
INFO, MESSAGE, ERROR;
}
}