diff --git a/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/EmailAction.java b/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/EmailAction.java index a5fda286fe5..dfa375d05f2 100644 --- a/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/EmailAction.java +++ b/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/EmailAction.java @@ -24,6 +24,7 @@ import org.elasticsearch.watcher.support.xcontent.WatcherXContentParser; import java.io.IOException; import java.util.Locale; +import java.util.Objects; /** * @@ -84,23 +85,17 @@ public class EmailAction implements Action { EmailAction action = (EmailAction) o; - if (!email.equals(action.email)) return false; - if (account != null ? !account.equals(action.account) : action.account != null) return false; - if (auth != null ? !auth.equals(action.auth) : action.auth != null) return false; - if (profile != action.profile) return false; - if (emailAttachments != null && !emailAttachments.equals(action.emailAttachments)) return false; - return !(dataAttachment != null ? !dataAttachment.equals(action.dataAttachment) : action.dataAttachment != null); + return Objects.equals(email, action.email) && + Objects.equals(account, action.account) && + Objects.equals(auth, action.auth) && + Objects.equals(profile, action.profile) && + Objects.equals(emailAttachments, action.emailAttachments) && + Objects.equals(dataAttachment, action.dataAttachment); } @Override public int hashCode() { - int result = email.hashCode(); - result = 31 * result + (account != null ? account.hashCode() : 0); - result = 31 * result + (auth != null ? auth.hashCode() : 0); - result = 31 * result + (profile != null ? profile.hashCode() : 0); - result = 31 * result + (dataAttachment != null ? dataAttachment.hashCode() : 0); - result = 31 * result + (emailAttachments != null ? emailAttachments.hashCode() : 0); - return result; + return Objects.hash(email, account, auth, profile, dataAttachment, emailAttachments); } @Override @@ -135,7 +130,7 @@ public class EmailAction implements Action { Secret password = null; Profile profile = Profile.STANDARD; DataAttachment dataAttachment = null; - EmailAttachments attachments = null; + EmailAttachments attachments = EmailAttachments.EMPTY_ATTACHMENTS; String currentFieldName = null; XContentParser.Token token; diff --git a/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/service/attachment/DataAttachment.java b/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/service/attachment/DataAttachment.java index f7a478dc8df..70cb76e3d1e 100644 --- a/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/service/attachment/DataAttachment.java +++ b/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/service/attachment/DataAttachment.java @@ -8,6 +8,7 @@ package org.elasticsearch.watcher.actions.email.service.attachment; import org.elasticsearch.common.xcontent.XContentBuilder; import java.io.IOException; +import java.util.Objects; public class DataAttachment implements EmailAttachmentParser.EmailAttachment { @@ -40,6 +41,20 @@ public class DataAttachment implements EmailAttachmentParser.EmailAttachment { return DataAttachmentParser.TYPE; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + DataAttachment otherDataAttachment = (DataAttachment) o; + return Objects.equals(id, otherDataAttachment.id) && Objects.equals(dataAttachment, otherDataAttachment.dataAttachment); + } + + @Override + public int hashCode() { + return Objects.hash(id, dataAttachment); + } + public static Builder builder(String id) { return new Builder(id); } diff --git a/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/service/attachment/EmailAttachments.java b/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/service/attachment/EmailAttachments.java index 8cb54bb25fd..dcb29097ebc 100644 --- a/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/service/attachment/EmailAttachments.java +++ b/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/service/attachment/EmailAttachments.java @@ -10,10 +10,14 @@ import org.elasticsearch.common.xcontent.ToXContent; import org.elasticsearch.common.xcontent.XContentBuilder; import java.io.IOException; +import java.util.Collections; import java.util.List; +import java.util.Objects; public class EmailAttachments implements ToXContent { + public static final EmailAttachments EMPTY_ATTACHMENTS = new EmailAttachments(Collections.emptyList()); + public interface Fields { ParseField ATTACHMENTS = new ParseField("attachments"); } @@ -40,4 +44,18 @@ public class EmailAttachments implements ToXContent { return builder; } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + EmailAttachments other = (EmailAttachments) o; + return Objects.equals(attachments, other.attachments); + } + + @Override + public int hashCode() { + return Objects.hash(attachments); + } } diff --git a/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/service/attachment/HttpRequestAttachment.java b/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/service/attachment/HttpRequestAttachment.java index 49776cd098d..65cd3a5df11 100644 --- a/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/service/attachment/HttpRequestAttachment.java +++ b/elasticsearch/x-pack/watcher/src/main/java/org/elasticsearch/watcher/actions/email/service/attachment/HttpRequestAttachment.java @@ -11,6 +11,7 @@ import org.elasticsearch.common.xcontent.XContentBuilder; import org.elasticsearch.watcher.support.http.HttpRequestTemplate; import java.io.IOException; +import java.util.Objects; public class HttpRequestAttachment implements EmailAttachmentParser.EmailAttachment { @@ -56,6 +57,21 @@ public class HttpRequestAttachment implements EmailAttachmentParser.EmailAttachm return HttpEmailAttachementParser.TYPE; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + HttpRequestAttachment otherDataAttachment = (HttpRequestAttachment) o; + return Objects.equals(id, otherDataAttachment.id) && Objects.equals(requestTemplate, otherDataAttachment.requestTemplate) + && Objects.equals(contentType, otherDataAttachment.contentType); + } + + @Override + public int hashCode() { + return Objects.hash(id, requestTemplate, contentType); + } + public static class Builder { private String id; diff --git a/elasticsearch/x-pack/watcher/src/test/java/org/elasticsearch/watcher/actions/email/EmailActionTests.java b/elasticsearch/x-pack/watcher/src/test/java/org/elasticsearch/watcher/actions/email/EmailActionTests.java index 33f079742d7..ee4066843bd 100644 --- a/elasticsearch/x-pack/watcher/src/test/java/org/elasticsearch/watcher/actions/email/EmailActionTests.java +++ b/elasticsearch/x-pack/watcher/src/test/java/org/elasticsearch/watcher/actions/email/EmailActionTests.java @@ -24,15 +24,18 @@ import org.elasticsearch.watcher.actions.email.service.EmailService; import org.elasticsearch.watcher.actions.email.service.EmailTemplate; import org.elasticsearch.watcher.actions.email.service.HtmlSanitizer; import org.elasticsearch.watcher.actions.email.service.Profile; +import org.elasticsearch.watcher.actions.email.service.attachment.DataAttachmentParser; import org.elasticsearch.watcher.actions.email.service.attachment.EmailAttachmentParser; import org.elasticsearch.watcher.actions.email.service.attachment.EmailAttachments; import org.elasticsearch.watcher.actions.email.service.attachment.EmailAttachmentsParser; import org.elasticsearch.watcher.actions.email.service.attachment.HttpEmailAttachementParser; +import org.elasticsearch.watcher.actions.email.service.attachment.HttpRequestAttachment; import org.elasticsearch.watcher.execution.WatchExecutionContext; import org.elasticsearch.watcher.execution.Wid; import org.elasticsearch.watcher.support.http.HttpClient; import org.elasticsearch.watcher.support.http.HttpRequest; import org.elasticsearch.watcher.support.http.HttpRequestTemplate; +import org.elasticsearch.watcher.support.http.HttpRequestTemplateTests; import org.elasticsearch.watcher.support.http.HttpResponse; import org.elasticsearch.watcher.support.http.auth.HttpAuthRegistry; import org.elasticsearch.watcher.support.http.auth.basic.BasicAuthFactory; @@ -46,12 +49,15 @@ import org.elasticsearch.watcher.watch.Payload; import org.jboss.netty.handler.codec.http.HttpHeaders; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; +import org.junit.Before; +import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import static java.util.Collections.emptyMap; @@ -79,7 +85,15 @@ public class EmailActionTests extends ESTestCase { private SecretService secretService = mock(SecretService.class); private HttpAuthRegistry registry = new HttpAuthRegistry(singletonMap("basic", new BasicAuthFactory(secretService))); private HttpClient httpClient = mock(HttpClient.class); - private static final EmailAttachmentsParser EMPTY_EMAIL_ATTACHMENTS_PARSER = new EmailAttachmentsParser(Collections.emptyMap()); + private EmailAttachmentsParser emailAttachmentParser; + private Map emailAttachmentParsers = new HashMap<>(); + + @Before + public void addEmailAttachmentParsers() { + emailAttachmentParsers.put(HttpEmailAttachementParser.TYPE, new HttpEmailAttachementParser(httpClient, new HttpRequestTemplate.Parser(registry), new HttpRequestTemplateTests.MockTextTemplateEngine())); + emailAttachmentParsers.put(DataAttachmentParser.TYPE, new DataAttachmentParser()); + emailAttachmentParser = new EmailAttachmentsParser(emailAttachmentParsers); + } public void testExecute() throws Exception { final String account = "account1"; @@ -119,11 +133,10 @@ public class EmailActionTests extends ESTestCase { Profile profile = randomFrom(Profile.values()); DataAttachment dataAttachment = randomDataAttachment(); - // TODO RANDOMIZE ME - EmailAttachments emailAttachments = new EmailAttachments(new ArrayList<>()); + EmailAttachments emailAttachments = randomEmailAttachments(); EmailAction action = new EmailAction(email, account, auth, profile, dataAttachment, emailAttachments); - ExecutableEmailAction executable = new ExecutableEmailAction(action, logger, service, engine, htmlSanitizer, Collections.emptyMap()); + ExecutableEmailAction executable = new ExecutableEmailAction(action, logger, service, engine, htmlSanitizer, emailAttachmentParsers); Map data = new HashMap<>(); Payload payload = new Payload.Simple(data); @@ -282,7 +295,7 @@ public class EmailActionTests extends ESTestCase { XContentParser parser = JsonXContent.jsonXContent.createParser(bytes); parser.nextToken(); - ExecutableEmailAction executable = new EmailActionFactory(Settings.EMPTY, emailService, engine, htmlSanitizer, EMPTY_EMAIL_ATTACHMENTS_PARSER, Collections.emptyMap()) + ExecutableEmailAction executable = new EmailActionFactory(Settings.EMPTY, emailService, engine, htmlSanitizer, emailAttachmentParser, Collections.emptyMap()) .parseExecutable(randomAsciiOfLength(8), randomAsciiOfLength(3), parser); assertThat(executable, notNullValue()); @@ -360,11 +373,10 @@ public class EmailActionTests extends ESTestCase { Profile profile = randomFrom(Profile.values()); String account = randomAsciiOfLength(6); DataAttachment dataAttachment = randomDataAttachment(); - // TODO randomize - EmailAttachments emailAttachments = new EmailAttachments(new ArrayList<>()); + EmailAttachments emailAttachments = randomEmailAttachments(); EmailAction action = new EmailAction(email, account, auth, profile, dataAttachment, emailAttachments); - ExecutableEmailAction executable = new ExecutableEmailAction(action, logger, service, engine, htmlSanitizer, Collections.emptyMap()); + ExecutableEmailAction executable = new ExecutableEmailAction(action, logger, service, engine, htmlSanitizer, emailAttachmentParsers); boolean hideSecrets = randomBoolean(); ToXContent.Params params = WatcherParams.builder().hideSecrets(hideSecrets).build(); @@ -376,7 +388,7 @@ public class EmailActionTests extends ESTestCase { XContentParser parser = JsonXContent.jsonXContent.createParser(bytes); parser.nextToken(); - ExecutableEmailAction parsed = new EmailActionFactory(Settings.EMPTY, service, engine, htmlSanitizer, EMPTY_EMAIL_ATTACHMENTS_PARSER, Collections.emptyMap()) + ExecutableEmailAction parsed = new EmailActionFactory(Settings.EMPTY, service, engine, htmlSanitizer, emailAttachmentParser, emailAttachmentParsers) .parseExecutable(randomAsciiOfLength(4), randomAsciiOfLength(10), parser); if (!hideSecrets) { @@ -429,7 +441,7 @@ public class EmailActionTests extends ESTestCase { HttpResponse mockResponse = new HttpResponse(200, content, headers); when(httpClient.execute(any(HttpRequest.class))).thenReturn(mockResponse); - // setup email parsers + // setup email attachment parsers HttpRequestTemplate.Parser httpRequestTemplateParser = new HttpRequestTemplate.Parser(registry); Map attachmentParsers = new HashMap<>(); attachmentParsers.put(HttpEmailAttachementParser.TYPE, new HttpEmailAttachementParser(httpClient, httpRequestTemplateParser, engine)); @@ -485,16 +497,23 @@ public class EmailActionTests extends ESTestCase { return randomFrom(DataAttachment.JSON, DataAttachment.YAML, null); } - private HttpRequest randomExternalAttachment() throws Exception { - if (randomBoolean()) { + private EmailAttachments randomEmailAttachments() throws IOException { + List attachments = new ArrayList<>(); + + String attachmentType = randomFrom("http", "data", null); + if ("http".equals(attachmentType)) { Map headers = new HashMap<>(1); headers.put(HttpHeaders.Names.CONTENT_TYPE, new String[]{"plain/text"}); String content = "My wonderful text"; HttpResponse mockResponse = new HttpResponse(200, content, headers); when(httpClient.execute(any(HttpRequest.class))).thenReturn(mockResponse); - return HttpRequest.builder("_host", 443).build(); - } else { - return null; + + HttpRequestTemplate template = HttpRequestTemplate.builder("localhost", 1234).build(); + attachments.add(new HttpRequestAttachment(randomAsciiOfLength(10), template, randomFrom("my/custom-type", null))); + } else if ("data".equals(attachmentType)) { + attachments.add(new org.elasticsearch.watcher.actions.email.service.attachment.DataAttachment(randomAsciiOfLength(10), randomFrom(DataAttachment.JSON, DataAttachment.YAML))); } + + return new EmailAttachments(attachments); } }