From 32f972b7391c877ef90da4b6fc5c1dd806e1e9be Mon Sep 17 00:00:00 2001 From: WickedJack99 Date: Mon, 22 Apr 2024 16:01:21 +0200 Subject: [PATCH] Added Peer notification sendable and requestable. --- .../Data/ReceivedPeerNotification.java | 43 +++++++++++++++ .../src/Request/RequestExecuterThread.java | 4 +- .../src/Sending/Data/PeerNotification.java | 54 +++++++++++++++++++ 3 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 src/main/java/vslab1/src/Request/Data/ReceivedPeerNotification.java create mode 100644 src/main/java/vslab1/src/Sending/Data/PeerNotification.java diff --git a/src/main/java/vslab1/src/Request/Data/ReceivedPeerNotification.java b/src/main/java/vslab1/src/Request/Data/ReceivedPeerNotification.java new file mode 100644 index 0000000..57d46b1 --- /dev/null +++ b/src/main/java/vslab1/src/Request/Data/ReceivedPeerNotification.java @@ -0,0 +1,43 @@ +package vslab1.src.Request.Data; + +import java.util.HashMap; +import java.util.Map; + +import org.json.JSONArray; + +import vslab1.src.FileReaderWriter.FileReaderWriter; +import vslab1.src.Peers.EOnlineState; +import vslab1.src.Peers.Peer; +import vslab1.src.Sending.SendingQueue; +import vslab1.src.Sending.Data.EDataType; + +/** + * Received peer message from peers in network to this newly joined peer. This peer will update its + * peer list with received file list and set online state of the peer to online. + */ +public record ReceivedPeerNotification(Peer sender, Peer receiver, JSONArray sender_files) implements Requestable { + + @Override + public EDataType getType() { + return EDataType.PeerNotification; + } + + @Override + public Peer getSender() { + return sender; + } + + @Override + public Peer getReceiver() { + return receiver; + } + + @Override + public void execute(SendingQueue sendingQueue) { + Map filesMap = new HashMap(); + sender_files.forEach((file) -> { + filesMap.put(file.toString(), ""); + }); + FileReaderWriter.updatePeer(new Peer(sender.ipAddress(), sender.port(), filesMap, EOnlineState.Online)); + } +} \ No newline at end of file diff --git a/src/main/java/vslab1/src/Request/RequestExecuterThread.java b/src/main/java/vslab1/src/Request/RequestExecuterThread.java index 89f5521..6dbca7d 100644 --- a/src/main/java/vslab1/src/Request/RequestExecuterThread.java +++ b/src/main/java/vslab1/src/Request/RequestExecuterThread.java @@ -16,7 +16,7 @@ import vslab1.src.Request.Data.ReceivedLeaveNotification; import vslab1.src.Request.Data.ReceivedOnlineStateNotification; import vslab1.src.Request.Data.OnlineStateRequestRequest; import vslab1.src.Request.Data.ReceivedPeerJoinedNotification; -import vslab1.src.Request.Data.ReceivedPeerResponse; +import vslab1.src.Request.Data.ReceivedPeerNotification; import vslab1.src.Request.Data.PublishFileNameNotificationRequest; import vslab1.src.Request.Data.PullFileListRequestRequest; import vslab1.src.Request.Data.PullFileRequestRequest; @@ -92,7 +92,7 @@ public class RequestExecuterThread extends Thread implements Terminatable { } if (receivedData.has("peer")) { JSONArray files = receivedData.getJSONArray("files"); - return new ReceivedPeerResponse(parseIPPortField(receivedData), FileReaderWriter.getThisPeer(EUpdateFlag.DoNotUpdate), files); + return new ReceivedPeerNotification(parseIPPortField(receivedData), FileReaderWriter.getThisPeer(EUpdateFlag.DoNotUpdate), files); } if (receivedData.has("leave")) { return new ReceivedLeaveNotification(parseIPPortField(receivedData), FileReaderWriter.getThisPeer(EUpdateFlag.DoNotUpdate)); diff --git a/src/main/java/vslab1/src/Sending/Data/PeerNotification.java b/src/main/java/vslab1/src/Sending/Data/PeerNotification.java new file mode 100644 index 0000000..25836cb --- /dev/null +++ b/src/main/java/vslab1/src/Sending/Data/PeerNotification.java @@ -0,0 +1,54 @@ +package vslab1.src.Sending.Data; + +import java.util.Map; + +import vslab1.src.FileReaderWriter.FileReaderWriter; +import vslab1.src.FileReaderWriter.FileReaderWriter.EUpdateFlag; +import vslab1.src.Peers.Peer; + +/** + * Sent to peer that sent a join request to a friend in the network. + * The friend who received the join request, sends peerJoined to the + * other peers and they respond with this message, informing about their + * presence and file list. + */ +public record PeerNotification(Peer sender, Peer receiver) implements Sendable { + + @Override + public EDataType getType() { + return EDataType.PeerNotification; + } + + @Override + public Peer getSender() { + return sender; + } + + @Override + public Peer getReceiver() { + return receiver; + } + + @Override + public byte[] getMessage() { + String fileList = ""; + Map files = FileReaderWriter.getThisPeer(EUpdateFlag.Update).filesMap(); + for (Map.Entry file : files.entrySet()) { + fileList += file.getKey() + ","; + } + + // Remove last comma + fileList = fileList.substring(0, fileList.length() - 2); + + String response = + "{\"peer\":\"\"" + + "," + + "\"ipPort\":\"" + sender.ipAddress() + ":" + sender.port() + "\"" + + "," + + "\"files\":[" + + fileList + + "]}"; + return response.getBytes(); + } + +}