Merge branch 'stable-3.4'

* stable-3.4:
  Use null instead of "N/A" as default change-number
  RMQ: Follow new sepia standard for routing-key

Change-Id: I33c6e869e6658c2effa38b4f97ec11e256bd1e45
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/RabbitMqConfig.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/RabbitMqConfig.java
index 3811153..0de1b58 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/RabbitMqConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/RabbitMqConfig.java
@@ -84,7 +84,7 @@
   private static final String CHAR_ENCODING = StandardCharsets.UTF_8.name();
   private static final String CONTENT_TYPE = "application/json";
   private static final String DEFAULT_APP_ID = "Gerrit";
-  private static final String DEFAULT_ROUTING_KEY_TAG = "notag";
+  private static final String DEFAULT_ROUTING_KEY_TAG = "_";
   private static final int NON_PERSISTENT_DELIVERY_VAL = 1;
   private static final int PERSISTENT_DELIVERY_VAL = 2;
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EiffelEventFactory.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EiffelEventFactory.java
index ef3547c..df4f63c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EiffelEventFactory.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EiffelEventFactory.java
@@ -193,7 +193,7 @@
             .change(
                 EiffelChangeInfo.builder()
                     .details(commitUrl(repoName, commitSha1))
-                    .id(changeNbr != null ? String.valueOf(changeNbr) : "N/A")
+                    .id(changeNbr != null ? String.valueOf(changeNbr) : null)
                     .tracker(GERRIT))
             .meta(getMeta(epochMillisCreated));
     parentEventIds.stream()
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/mq/RabbitMqPublisher.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/mq/RabbitMqPublisher.java
index 7d45b66..baa1aae 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/mq/RabbitMqPublisher.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/mq/RabbitMqPublisher.java
@@ -31,12 +31,16 @@
 import java.util.concurrent.TimeoutException;
 
 public class RabbitMqPublisher implements EiffelEventPublisher, LifecycleListener {
-  /* https://github.com/eiffel-community/eiffel-sepia/pull/9 */
-  private static final String ROUTING_KEY = "eiffel.%s.%s.%s";
+  /* https://eiffel-community.github.io/eiffel-sepia/rabbitmq-message-broker.html */
+  private static final String ROUTING_KEY = "eiffel.%s.%s.%s.%s";
+  /* In Sepia "family" is part of the routing-key but the concept of event-family doesn't exist.
+   * https://eiffel-community.github.io/eiffel-sepia/rabbitmq-message-broker.html*/
+  private static final String DEFAULT_FAMILY = "_";
   public static FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private static String toRoutingKey(EiffelEvent event, String tag) {
-    return String.format(ROUTING_KEY, event.meta.type.getType(), tag, event.meta.source.domainId);
+    return String.format(
+        ROUTING_KEY, DEFAULT_FAMILY, event.meta.type.getType(), tag, event.meta.source.domainId);
   }
 
   private volatile Connection connection;
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EventMappingIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EventMappingIT.java
index 575e1aa..ee2b553 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EventMappingIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/mapping/EventMappingIT.java
@@ -102,7 +102,7 @@
     assertPersonInfo(event.data.author, AUTHOR_NAME, AUTHOR_EMAIL, null);
     assertGitIdentifier(
         event.data.gitIdentifier, project.get(), "master", accountlessAuthor.getName());
-    assertChangeInfo(event.data.change, "N/A", project.get(), accountlessAuthor.getName());
+    assertChangeInfo(event.data.change, null, project.get(), accountlessAuthor.getName());
     assertSccMeta(event.meta, commitTimeInEpochMillis(accountlessAuthor));
     assertSccLinks(event.links);
   }
@@ -118,7 +118,7 @@
     assertPersonInfo(event.data.author, admin.fullName(), admin.email(), admin.username());
     assertGitIdentifier(
         event.data.gitIdentifier, project.get(), "master", authorWithAccount.getName());
-    assertChangeInfo(event.data.change, "N/A", project.get(), authorWithAccount.getName());
+    assertChangeInfo(event.data.change, null, project.get(), authorWithAccount.getName());
     assertSccMeta(event.meta, commitTimeInEpochMillis(authorWithAccount));
     assertSccLinks(event.links);
   }