diff options
author | Valerij Fredriksen <valerijf@yahooinc.com> | 2022-03-14 23:28:54 +0100 |
---|---|---|
committer | Valerij Fredriksen <valerijf@yahooinc.com> | 2022-03-14 23:30:06 +0100 |
commit | 7c4fe97357fb5b4782bc56d631b6d11d8ce78664 (patch) | |
tree | f29a0705c0f2b9e6892670f11dafb65d6cf0f516 | |
parent | 9ad7ce1756ee6f5b3045b7f1aa0361d43ac6b80d (diff) |
Extend contact
4 files changed, 28 insertions, 46 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/TenantContacts.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/TenantContacts.java index 25e91fe0700..8573beefbab 100644 --- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/TenantContacts.java +++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/tenant/TenantContacts.java @@ -14,9 +14,9 @@ import java.util.Optional; * @author ogronnesby */ public class TenantContacts { - private final List<Contact<?>> contacts; + private final List<? extends Contact> contacts; - public TenantContacts(List<Contact<?>> contacts) { + public TenantContacts(List<? extends Contact> contacts) { this.contacts = List.copyOf(contacts); } @@ -24,7 +24,7 @@ public class TenantContacts { return new TenantContacts(List.of()); } - public List<Contact<?>> all() { + public List<? extends Contact> all() { return contacts; } @@ -52,55 +52,39 @@ public class TenantContacts { '}'; } - public static class Contact<T> { - private final Type type; + public abstract static class Contact { private final List<Audience> audiences; - protected final T data; - public Contact(Type type, List<Audience> audiences, T data) { - this.type = type; - this.audiences = audiences; - this.data = data; + public Contact(List<Audience> audiences) { + this.audiences = List.copyOf(audiences); if (audiences.isEmpty()) throw new IllegalArgumentException("audience cannot be empty"); } - public Type type() { return type; } public List<Audience> audiences() { return audiences; } - public T data() { return data; } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Contact<?> contact = (Contact<?>) o; - return type == contact.type && audiences.equals(contact.audiences) && data.equals(contact.data); - } - - @Override - public int hashCode() { - return Objects.hash(type, audiences, data); - } + public abstract Type type(); - @Override - public String toString() { - return "Contact{" + - "type=" + type + - ", audience=" + audiences + - ", data=" + data + - '}'; - } + public abstract boolean equals(Object o); + public abstract int hashCode(); + public abstract String toString(); } - public static class EmailContact { + public static class EmailContact extends Contact { private final String email; - public EmailContact(String email) { + public EmailContact(List<Audience> audiences, String email) { + super(audiences); this.email = email; } public String email() { return email; } @Override + public Type type() { + return Type.EMAIL; + } + + @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java index cf68ca034a7..00e38abcba7 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializer.java @@ -299,7 +299,7 @@ public class TenantSerializer { } private TenantContacts tenantContactsFrom(Inspector object) { - List<TenantContacts.Contact<?>> contacts = SlimeUtils.entriesStream(object) + List<TenantContacts.Contact> contacts = SlimeUtils.entriesStream(object) .map(this::readContact) .collect(Collectors.toUnmodifiableList()); return new TenantContacts(contacts); @@ -348,14 +348,14 @@ public class TenantSerializer { return personLists; } - private void writeContact(TenantContacts.Contact<?> contact, Cursor cursor) { + private void writeContact(TenantContacts.Contact contact, Cursor cursor) { cursor.setString("type", contact.type().value()); Cursor audiencesArray = cursor.setArray("audiences"); contact.audiences().forEach(audience -> audiencesArray.addString(toAudience(audience))); var data = cursor.setObject("data"); switch (contact.type()) { case EMAIL: - var email = (TenantContacts.EmailContact) contact.data(); + var email = (TenantContacts.EmailContact) contact; data.setString("email", email.email()); return; default: @@ -363,7 +363,7 @@ public class TenantSerializer { } } - private TenantContacts.Contact<?> readContact(Inspector inspector) { + private TenantContacts.Contact readContact(Inspector inspector) { var type = TenantContacts.Type.from(inspector.field("type").asString()) .orElseThrow(() -> new RuntimeException("Unknown type: " + inspector.field("type").asString())); var audiences = SlimeUtils.entriesStream(inspector.field("audiences")) @@ -371,8 +371,7 @@ public class TenantSerializer { .collect(Collectors.toUnmodifiableList()); switch (type) { case EMAIL: - var email = new TenantContacts.EmailContact(inspector.field("data").field("email").asString()); - return new TenantContacts.Contact<>(type, audiences, email); + return new TenantContacts.EmailContact(audiences, inspector.field("data").field("email").asString()); default: throw new IllegalArgumentException("Serialization for contact type not implemented: " + type); } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java index c55be24fcb4..f449a8d6bd2 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/application/ApplicationApiHandler.java @@ -544,7 +544,7 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { contact.audiences().forEach(audience -> audiencesArray.addString(toAudience(audience))); switch (contact.type()) { case EMAIL: - var email = (TenantContacts.EmailContact) contact.data(); + var email = (TenantContacts.EmailContact) contact; contactCursor.setString("email", email.email()); return; default: @@ -678,12 +678,11 @@ public class ApplicationApiHandler extends AuditLoggingRequestHandler { private TenantContacts updateTenantInfoContacts(Inspector insp, TenantContacts oldContacts) { if (!insp.valid()) return oldContacts; - List<TenantContacts.Contact<?>> contacts = SlimeUtils.entriesStream(insp).map(inspector -> { - TenantContacts.EmailContact email = new TenantContacts.EmailContact(inspector.field("email").asString()); + List<TenantContacts.Contact> contacts = SlimeUtils.entriesStream(insp).map(inspector -> { List<TenantContacts.Audience> audiences = SlimeUtils.entriesStream(inspector.field("audiences")) .map(audience -> fromAudience(audience.asString())) .collect(Collectors.toUnmodifiableList()); - return new TenantContacts.Contact<>(TenantContacts.Type.EMAIL, audiences, email); + return new TenantContacts.EmailContact(audiences, inspector.field("email").asString()); }).collect(toUnmodifiableList()); return new TenantContacts(contacts); diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java index d7a3be82968..e0d14f19f21 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/TenantSerializerTest.java @@ -175,8 +175,8 @@ public class TenantSerializerTest { public void cloud_tenant_with_tenant_info_contacts() { TenantInfo tenantInfo = TenantInfo.empty() .withContacts(new TenantContacts(List.of( - new TenantContacts.Contact<>(TenantContacts.Type.EMAIL, List.of(TenantContacts.Audience.TENANT), new TenantContacts.EmailContact("email1@email.com")), - new TenantContacts.Contact<>(TenantContacts.Type.EMAIL, List.of(TenantContacts.Audience.TENANT, TenantContacts.Audience.NOTIFICATIONS), new TenantContacts.EmailContact("email2@email.com"))))); + new TenantContacts.EmailContact(List.of(TenantContacts.Audience.TENANT), "email1@email.com"), + new TenantContacts.EmailContact(List.of(TenantContacts.Audience.TENANT, TenantContacts.Audience.NOTIFICATIONS), "email2@email.com")))); Slime slime = new Slime(); Cursor parentCursor = slime.setObject(); serializer.toSlime(tenantInfo, parentCursor); |