From 312bbaa5a6e8ad710d78fccb0202cfa0166c5119 Mon Sep 17 00:00:00 2001 From: Arnaud Vergnet Date: Wed, 16 Dec 2020 10:46:48 +0100 Subject: [PATCH] add debug logging --- .../java/fr/insa/clavardator/MainApp.java | 6 ++- .../clavardator/network/NetDiscoverer.java | 22 +++++---- .../clavardator/network/PeerConnection.java | 8 +++- .../insa/clavardator/ui/MainController.java | 6 ++- .../fr/insa/clavardator/users/PeerUser.java | 46 +++++++++++-------- .../java/fr/insa/clavardator/users/User.java | 2 +- .../fr/insa/clavardator/users/UserList.java | 16 +++---- 7 files changed, 63 insertions(+), 43 deletions(-) diff --git a/src/main/java/fr/insa/clavardator/MainApp.java b/src/main/java/fr/insa/clavardator/MainApp.java index 23c04d8..96717d3 100644 --- a/src/main/java/fr/insa/clavardator/MainApp.java +++ b/src/main/java/fr/insa/clavardator/MainApp.java @@ -1,8 +1,8 @@ package fr.insa.clavardator; import fr.insa.clavardator.ui.MainController; -import fr.insa.clavardator.users.User; import fr.insa.clavardator.users.UserList; +import fr.insa.clavardator.util.Log; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; @@ -21,6 +21,8 @@ public class MainApp extends Application { @Override public void start(Stage stage) throws Exception { + Log.verboseLevel = 4; + Log.v("START", "Application started"); final FXMLLoader mainLoader = new FXMLLoader(getClass().getResource("ui/scene.fxml")); final Parent content = mainLoader.load(); @@ -35,7 +37,7 @@ public class MainApp extends Application { stage.setTitle("Clavardator"); stage.setMinHeight(640); stage.setMinWidth(800); - stage.setMaximized(true); +// stage.setMaximized(true); stage.show(); } diff --git a/src/main/java/fr/insa/clavardator/network/NetDiscoverer.java b/src/main/java/fr/insa/clavardator/network/NetDiscoverer.java index c5395b2..2ece19d 100644 --- a/src/main/java/fr/insa/clavardator/network/NetDiscoverer.java +++ b/src/main/java/fr/insa/clavardator/network/NetDiscoverer.java @@ -1,6 +1,7 @@ package fr.insa.clavardator.network; import fr.insa.clavardator.util.ErrorCallback; +import fr.insa.clavardator.util.Log; import org.jetbrains.annotations.Nullable; import java.io.IOException; @@ -28,6 +29,7 @@ public class NetDiscoverer { * @param errorCallback function to call on error */ public void discoverActiveUsers(String broadcastMessage, ResponseReceivedCallback callback, ErrorCallback errorCallback) { + Log.v(this.getClass().getSimpleName(), "Starting user discovery"); if (responseListener != null) responseListener.stopListening(); responseListener = new ResponseListener(callback, errorCallback); @@ -44,6 +46,7 @@ public class NetDiscoverer { * @param errorCallback The function to call on error */ public void startDiscoveryListening(String responseMessage, @Nullable BroadcastReceivedCallback onBroadcastReceived, @Nullable ErrorCallback errorCallback) { + Log.v(this.getClass().getSimpleName(), "Starting broadcast listening"); if (broadcastListener != null) broadcastListener.stopListening(); @@ -94,10 +97,10 @@ public class NetDiscoverer { DatagramSocket broadcastSocket = new DatagramSocket(); broadcastSocket.setBroadcast(true); broadcastSocket.send(new DatagramPacket(buf, buf.length, broadcastAddr, DISCOVERY_PORT)); -// System.out.println("Broadcast sent with address " + broadcastAddr.toString()); + Log.v(this.getClass().getSimpleName(), "Broadcast sent on address " + broadcastAddr.toString()); } - } catch (IOException e) { + Log.e(this.getClass().getSimpleName(), "Error sending broadcast", e); errorCallback.onError(e); } } @@ -110,7 +113,7 @@ public class NetDiscoverer { private boolean shouldStop = false; /** - * Constructs a thread that sends a broadcast over the network, using all available interfaces + * Constructs a thread that receives broadcast messages over the network, on all available interfaces * * @param callback The function to call on success * @param errorCallback The function to call on error @@ -133,11 +136,12 @@ public class NetDiscoverer { DatagramPacket receivedPacket = new DatagramPacket(buffer, BROADCAST_BUFFER_SIZE); socket.receive(receivedPacket); -// System.out.println("broadcast received from " + receivedPacket.getAddress().toString()); + Log.v(this.getClass().getSimpleName(), "Broadcast received from ip " + receivedPacket.getAddress().toString()); callback.onBroadcastReceived(receivedPacket.getAddress(), new String(receivedPacket.getData())); } } catch (IOException e) { if (!shouldStop) { + Log.e(this.getClass().getSimpleName(), "Error receiving broadcast message", e); errorCallback.onError(e); } } @@ -155,7 +159,7 @@ public class NetDiscoverer { private final ErrorCallback errorCallback; /** - * Constructs a thread that sends a UDP response + * Constructs a thread that sends a UDP response to a broadcast * * @param address The address of the remote host * @param message The message to send @@ -173,8 +177,9 @@ public class NetDiscoverer { try { DatagramSocket responseSocket = new DatagramSocket(); responseSocket.send(new DatagramPacket(buf, buf.length, address, RESPONSE_PORT)); -// System.out.println("Response sent to " + address.toString()); + Log.v(this.getClass().getSimpleName(), "Broadcast response sent to ip " + address.toString()); } catch (IOException e) { + Log.e(this.getClass().getSimpleName(), "Error sending broadcast response to " + address.toString(), e); errorCallback.onError(e); } } @@ -187,7 +192,7 @@ public class NetDiscoverer { private boolean shouldStop = false; /** - * Constructs a thread that receives all UDP responses, until stopDiscovery() is called + * Constructs a thread that receives all UDP responses, until stopListening() is called * * @param callback The function to call on success * @param errorCallback The function to call on error @@ -209,11 +214,12 @@ public class NetDiscoverer { byte[] buffer = new byte[RESPONSE_BUFFER_SIZE]; DatagramPacket receivedPacket = new DatagramPacket(buffer, RESPONSE_BUFFER_SIZE); socket.receive(receivedPacket); -// System.out.println("response received from " + receivedPacket.getAddress().toString()); + Log.v(this.getClass().getSimpleName(), "Broadcast response received from ip " + receivedPacket.getAddress().toString()); callback.onResponseReceived(receivedPacket.getAddress(), new String(receivedPacket.getData())); } } catch (IOException e) { if (!shouldStop) { + Log.e(this.getClass().getSimpleName(), "Error receiving broadcast response", e); errorCallback.onError(e); } } diff --git a/src/main/java/fr/insa/clavardator/network/PeerConnection.java b/src/main/java/fr/insa/clavardator/network/PeerConnection.java index 9f56f3c..554a234 100644 --- a/src/main/java/fr/insa/clavardator/network/PeerConnection.java +++ b/src/main/java/fr/insa/clavardator/network/PeerConnection.java @@ -64,7 +64,7 @@ public class PeerConnection { } /** - * Subscibe to all incoming messages from the peer + * Subscribe to the first incoming message from the peer * * @param callback The function to call when a message is received * @param errorCallback The function to call on error @@ -75,7 +75,7 @@ public class PeerConnection { } /** - * Closes the socket, and silently cancel all running send and receive operations. + * Closes the socket, and silently cancels all running send and receive operations. */ public void close() { shouldStop = true; @@ -87,6 +87,10 @@ public class PeerConnection { } } + /** + * Checks if the current connection is open + * @return True if the socket isstill open + */ public boolean isOpen() { return socket != null && socket.isConnected() && !socket.isClosed(); } diff --git a/src/main/java/fr/insa/clavardator/ui/MainController.java b/src/main/java/fr/insa/clavardator/ui/MainController.java index cf0d37a..623a7a4 100644 --- a/src/main/java/fr/insa/clavardator/ui/MainController.java +++ b/src/main/java/fr/insa/clavardator/ui/MainController.java @@ -8,6 +8,7 @@ import fr.insa.clavardator.ui.dialogs.SnackbarController; import fr.insa.clavardator.ui.users.UserListController; import fr.insa.clavardator.users.CurrentUser; import fr.insa.clavardator.users.UserList; +import fr.insa.clavardator.util.Log; import javafx.application.Platform; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; @@ -90,8 +91,9 @@ public class MainController implements Initializable { } private void discoverActiveUsers() { - if (userList != null) + if (userList != null) { userList.discoverActiveUsers((e) -> CurrentUser.getInstance().setState(CurrentUser.State.INVALID)); + } } private void startChat() { @@ -124,7 +126,7 @@ public class MainController implements Initializable { try { currentUser.init(); - System.out.println(currentUser.getId()); + Log.v("INIT", "Current user: " + currentUser.getUsername() + " / " + currentUser.getId()); } catch (SocketException e) { showError(); } diff --git a/src/main/java/fr/insa/clavardator/users/PeerUser.java b/src/main/java/fr/insa/clavardator/users/PeerUser.java index 2f6a064..a7fdfeb 100644 --- a/src/main/java/fr/insa/clavardator/users/PeerUser.java +++ b/src/main/java/fr/insa/clavardator/users/PeerUser.java @@ -4,6 +4,7 @@ import fr.insa.clavardator.chat.ChatHistory; import fr.insa.clavardator.chat.Message; import fr.insa.clavardator.network.PeerConnection; import fr.insa.clavardator.util.ErrorCallback; +import fr.insa.clavardator.util.Log; import org.jetbrains.annotations.NotNull; import java.io.EOFException; @@ -11,11 +12,10 @@ import java.net.InetAddress; import java.net.Socket; public class PeerUser extends User implements Comparable { + protected transient ChatHistory history; private State state = State.DISCONNECTED; private transient PeerConnection connection; - protected transient ChatHistory history; - public PeerUser(int id, String username) { super(id, username); history = new ChatHistory(this); @@ -37,15 +37,17 @@ public class PeerUser extends User implements Comparable { if (connection != null && connection.isOpen()) { connection.close(); } - + Log.v(this.getClass().getSimpleName(), "Creating new TCP connection with " + id); // Connect to the peer setState(State.CONNECTING); - connection = new PeerConnection(ipAddr, (thisConnection) -> { - init(thisConnection, callback, errorCallback); - }, e -> { - disconnect(); - errorCallback.onError(e); - }); + connection = new PeerConnection( + ipAddr, + (thisConnection) -> init(thisConnection, callback, errorCallback), + e -> { + Log.e(this.getClass().getSimpleName(), "Could not create TCP connection with " + id, e); + disconnect(); + errorCallback.onError(e); + }); } /** @@ -101,16 +103,19 @@ public class PeerUser extends User implements Comparable { private void subscribeToMessages(ErrorCallback errorCallback) { connection.receive( msg -> { + Log.v(this.getClass().getSimpleName(), "Received message from " + id); if (msg.getClass().isInstance(UserInformation.class)) { assert ((UserInformation) msg).id == getId(); + Log.v(this.getClass().getSimpleName(), "Message username: " + ((UserInformation) msg).getUsername()); setUsername(((UserInformation) msg).getUsername()); - } else if (msg.getClass().isInstance(Message.class)) { assert ((Message) msg).getRecipient().id != id; + Log.v(this.getClass().getSimpleName(), "Message text: " + ((Message) msg).getText()); history.addMessage((Message) msg); } }, e -> { + Log.e(this.getClass().getSimpleName(), "Error receiving message from " + id, e); if (e.getClass().isInstance(EOFException.class)) { disconnect(); } else { @@ -121,6 +126,7 @@ public class PeerUser extends User implements Comparable { public void disconnect() { + Log.v(this.getClass().getSimpleName(), "Disconnecting from user: " + id); if (connection != null && connection.isOpen()) { connection.close(); connection = null; @@ -138,25 +144,19 @@ public class PeerUser extends User implements Comparable { return history; } + public State getState() { + return state; + } + private void setState(State state) { pcs.firePropertyChange("state", this.state, state); this.state = state; } - public State getState() { - return state; - } - public boolean isActive() { return state == State.CONNECTED; } - enum State { - CONNECTING, - CONNECTED, - DISCONNECTED, - } - @Override public int compareTo(@NotNull PeerUser peerUser) { if (peerUser.isActive() && !this.isActive()) { @@ -167,6 +167,12 @@ public class PeerUser extends User implements Comparable { return getUsername().compareTo(peerUser.getUsername()); } + enum State { + CONNECTING, + CONNECTED, + DISCONNECTED, + } + public interface UserConnectedCallback { void onUserConnected(); } diff --git a/src/main/java/fr/insa/clavardator/users/User.java b/src/main/java/fr/insa/clavardator/users/User.java index f8b2f8e..a5f3e13 100644 --- a/src/main/java/fr/insa/clavardator/users/User.java +++ b/src/main/java/fr/insa/clavardator/users/User.java @@ -8,7 +8,7 @@ import java.io.Serializable; public class User implements Serializable { private String username; - public int id; + protected int id; // Make this class observable protected final transient PropertyChangeSupport pcs = new PropertyChangeSupport(this); diff --git a/src/main/java/fr/insa/clavardator/users/UserList.java b/src/main/java/fr/insa/clavardator/users/UserList.java index 1728007..b8a6407 100644 --- a/src/main/java/fr/insa/clavardator/users/UserList.java +++ b/src/main/java/fr/insa/clavardator/users/UserList.java @@ -3,6 +3,7 @@ package fr.insa.clavardator.users; import fr.insa.clavardator.db.DatabaseController; import fr.insa.clavardator.network.NetDiscoverer; import fr.insa.clavardator.util.ErrorCallback; +import fr.insa.clavardator.util.Log; import java.net.InetAddress; import java.util.ArrayList; @@ -33,33 +34,32 @@ public class UserList { public void discoverActiveUsers(ErrorCallback errorCallback) { netDiscoverer.discoverActiveUsers("CLAVARDATOR_BROADCAST", (ipAddr, data) -> { int id = getIdFromIp(ipAddr); - + Log.v(this.getClass().getSimpleName(), "Discovered new user: " + id); // If already connected, do not modify if (activeUsers.containsKey(id)) { return; } - PeerUser user = inactiveUsers.get(id); if (user == null) { + // Username is set on TCP connection start user = new PeerUser(id, ""); } PeerUser finalUser = user; - user.connect(ipAddr, () -> { - notifyConnectionObservers(finalUser); - }, errorCallback); - + user.connect(ipAddr, () -> notifyConnectionObservers(finalUser), errorCallback); }, errorCallback); } public void startDiscoveryListening() { - netDiscoverer.startDiscoveryListening("", null, Throwable::printStackTrace); + netDiscoverer.startDiscoveryListening( + "CLAVARDATOR_RESPONSE", + null, + Throwable::printStackTrace); } private int getIdFromIp(InetAddress ipAddr) { return ipAddr.hashCode(); } - public void addActiveUsersObserver(UserConnectionCallback connectionCallback, UserDisconnectionCallback disconnectionCallback) { userConnectionObservers.add(connectionCallback); userDisconnectionObservers.add(disconnectionCallback);