From 98ec32765bd769b457561dd9fdf34fee544dd54b Mon Sep 17 00:00:00 2001
From: Marcin Chrzanowski <marcin.j.chrzanowski@gmail.com>
Date: Thu, 9 Jan 2020 22:41:11 +0100
Subject: Send info from gossip initiator

---
 .../agent/messages/GossipGirlMessage.java          |  3 +-
 .../cloudatlas/agent/messages/QueryMessage.java    | 29 ++++++++++++++++++++
 .../mimuw/cloudatlas/agent/modules/GossipGirl.java |  9 +++++-
 .../cloudatlas/agent/modules/GossipGirlState.java  | 32 +++++++++++++++++++++-
 4 files changed, 70 insertions(+), 3 deletions(-)
 create mode 100644 src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/QueryMessage.java

(limited to 'src/main/java/pl/edu/mimuw/cloudatlas')

diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/GossipGirlMessage.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/GossipGirlMessage.java
index 2016447..508fe88 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/GossipGirlMessage.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/GossipGirlMessage.java
@@ -8,7 +8,8 @@ public abstract class GossipGirlMessage extends AgentMessage {
         ATTRIBUTES,
         HEJKA,
         INITIATE,
-        NO_CO_TAM
+        NO_CO_TAM,
+        QUERY
     }
 
     private Type type;
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/QueryMessage.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/QueryMessage.java
new file mode 100644
index 0000000..2b3b064
--- /dev/null
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/messages/QueryMessage.java
@@ -0,0 +1,29 @@
+package pl.edu.mimuw.cloudatlas.agent.messages;
+
+import pl.edu.mimuw.cloudatlas.model.Attribute;
+import pl.edu.mimuw.cloudatlas.model.ValueQuery;
+
+public class QueryMessage extends RemoteGossipGirlMessage {
+    private Attribute name;
+    private ValueQuery query;
+    private long receiverGossipId;
+
+    public QueryMessage(String messageId, long timestamp, Attribute name, ValueQuery query, long receiverGossipId) {
+        super(messageId, timestamp, Type.QUERY);
+        this.name = name;
+        this.query = query;
+        this.receiverGossipId = receiverGossipId;
+    }
+
+    public Attribute getName() {
+        return name;
+    }
+
+    public ValueQuery getQuery() {
+        return query;
+    }
+
+    public long getReceiverGossipId() {
+        return receiverGossipId;
+    }
+}
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java
index ccc7ee5..73aef8b 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirl.java
@@ -10,6 +10,7 @@ import pl.edu.mimuw.cloudatlas.agent.messages.GossipGirlMessage;
 import pl.edu.mimuw.cloudatlas.agent.messages.HejkaMessage;
 import pl.edu.mimuw.cloudatlas.agent.messages.InitiateGossipMessage;
 import pl.edu.mimuw.cloudatlas.agent.messages.NoCoTamMessage;
+import pl.edu.mimuw.cloudatlas.agent.messages.QueryMessage;
 import pl.edu.mimuw.cloudatlas.agent.messages.ResponseMessage;
 import pl.edu.mimuw.cloudatlas.agent.messages.StateMessage;
 import pl.edu.mimuw.cloudatlas.agent.messages.UDUPMessage;
@@ -36,6 +37,7 @@ public class GossipGirl extends Module {
                 break;
             case NO_CO_TAM:
                 handleNoCoTam((NoCoTamMessage) message);
+                break;
             default:
                 throw new InvalidMessageType("This type of message cannot be handled by GossipGirl");
         }
@@ -90,7 +92,12 @@ public class GossipGirl extends Module {
                 UDUPMessage udupMessage = new UDUPMessage("", 0, state.theirContact, attributesMessage);
                 sendMessage(udupMessage);
             }
-            // TODO: send queries
+
+            for (Entry<Attribute, ValueQuery> query : state.getQueriesToSend()) {
+                QueryMessage queryMessage = new QueryMessage("", 0, query.getKey(), query.getValue(), state.theirGossipId);
+                UDUPMessage udupMessage = new UDUPMessage("", 0, state.theirContact, queryMessage);
+                sendMessage(udupMessage);
+            }
             state.sentInfo();
         } else {
             System.out.println("ERROR: GossipGirl got state for a nonexistent gossip");
diff --git a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlState.java b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlState.java
index 8ec8ed2..df17957 100644
--- a/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlState.java
+++ b/src/main/java/pl/edu/mimuw/cloudatlas/agent/modules/GossipGirlState.java
@@ -1,5 +1,6 @@
 package pl.edu.mimuw.cloudatlas.agent.modules;
 
+import java.util.AbstractMap.SimpleImmutableEntry;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -13,6 +14,7 @@ import pl.edu.mimuw.cloudatlas.model.PathName;
 import pl.edu.mimuw.cloudatlas.model.ValueContact;
 import pl.edu.mimuw.cloudatlas.model.ValueQuery;
 import pl.edu.mimuw.cloudatlas.model.ValueTime;
+import pl.edu.mimuw.cloudatlas.model.ValueUtils;
 import pl.edu.mimuw.cloudatlas.model.ZMI;
 
 public class GossipGirlState {
@@ -113,7 +115,35 @@ public class GossipGirlState {
     }
 
     public List<ZMI> getZMIsToSend() {
-        return new LinkedList();
+        List<ZMI> zmis = new LinkedList();
+        for (Entry<PathName, ValueTime> timestampedPath : getZoneTimestampsToSend().entrySet()) {
+            ValueTime theirTimestamp = theirZoneTimestamps.get(timestampedPath.getKey());
+            if (theirTimestamp == null || ValueUtils.valueLower(theirTimestamp, timestampedPath.getValue())) {
+                System.out.println("going to send " + timestampedPath.getKey().toString());
+                try {
+                    zmis.add(hierarchy.findDescendant(timestampedPath.getKey()));
+                } catch (ZMI.NoSuchZoneException e) {
+                    System.out.println("ERROR: didn't find a zone we wanted to send in getZMIsToSend");
+                }
+            }
+        }
+        return zmis;
+    }
+
+    public List<Entry<Attribute, ValueQuery>> getQueriesToSend() {
+        List<Entry<Attribute, ValueQuery>> queryList = new LinkedList();
+        for (Entry<Attribute, ValueTime> timestampedQuery : getQueryTimestampsToSend().entrySet()) {
+            ValueTime theirTimestamp = theirQueryTimestamps.get(timestampedQuery.getKey());
+            if (theirTimestamp == null || ValueUtils.valueLower(theirTimestamp, timestampedQuery.getValue())) {
+                queryList.add(
+                    new SimpleImmutableEntry(
+                        timestampedQuery.getKey(),
+                        queries.get(timestampedQuery.getKey()).getKey()
+                    )
+                );
+            }
+        }
+        return queryList;
     }
 
     public void collectZoneTimestamps(Map<PathName, ValueTime> timestamps, ZMI currentZMI, PathName recipientPath) {
-- 
cgit v1.2.3