diff --git a/.gitignore b/.gitignore index b947989..82809fc 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ target .classpath .project *.iml -.idea \ No newline at end of file +.idea +atlassian-ide-plugin.xml \ No newline at end of file diff --git a/pom.xml b/pom.xml index 17038f4..76041c2 100644 --- a/pom.xml +++ b/pom.xml @@ -41,15 +41,48 @@ + + org.apache.maven.plugins + maven-antrun-plugin + 1.7 + + + org.apache.maven.plugins + maven-assembly-plugin + 2.4 + org.apache.maven.plugins maven-compiler-plugin ${version.maven-compiler} + + 1.7 + 1.7 + + + + org.apache.maven.plugins + maven-dependency-plugin + 2.8 + + + org.apache.maven.plugins + maven-release-plugin + 2.5 org.apache.maven.plugins maven-source-plugin ${version.maven-source} + + + attach-sources + verify + + jar-no-fork + + + org.apache.maven.plugins @@ -61,24 +94,51 @@ org.apache.maven.plugins - maven-compiler-plugin - - 1.6 - 1.6 - + maven-clean-plugin + 2.5 org.apache.maven.plugins - maven-source-plugin - - - attach-sources - verify - - jar-no-fork - - - + maven-deploy-plugin + 2.8.1 + + + org.apache.maven.plugins + maven-enforcer-plugin + 1.3.1 + + + org.apache.maven.plugins + maven-install-plugin + 2.5.1 + + + org.apache.maven.plugins + maven-jar-plugin + 2.4 + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + + org.apache.maven.plugins + maven-site-plugin + 3.3 + + + org.apache.maven.plugins + maven-surefire-plugin + 2.17 + + + + mandrill.apikey + ${mandrill.apikey} + + + org.apache.maven.plugins @@ -110,59 +170,100 @@ - com.fasterxml.jackson.core - jackson-databind + org.glassfish.jersey.core + jersey-client - org.spockframework - spock-core - test - - - org.apache.httpcomponents - httpclient + org.glassfish.jersey.media + jersey-media-json-jackson org.slf4j slf4j-api + + junit + junit + + + org.mockito + mockito-all + UTF-8 3.1 - 2.2.1 2.9.1 2.0.2 + 2.3 0.6-groovy-1.8 4.2.1 - 1.6.4 + 2.11 + 1.7.7 + 4.11 - com.fasterxml.jackson.core - jackson-databind - ${version.jackson} - - - org.spockframework - spock-core - ${version.spock} - test + org.glassfish.jersey.core + jersey-client + ${version.jersey} - org.apache.httpcomponents - httpclient - ${version.httpclient} + org.glassfish.jersey.media + jersey-media-json-jackson + ${version.jersey} org.slf4j slf4j-api ${version.slf4j} + + junit + junit + ${version.junit} + test + + + org.mockito + mockito-all + 1.9.5 + test + + + + + + org.apache.maven.plugins + maven-pmd-plugin + 3.1 + + + org.codehaus.mojo + versions-maven-plugin + 2.1 + + + + diff --git a/src/main/java/io/sprucehill/mandrill/data/error/Error.java b/src/main/java/io/sprucehill/mandrill/data/error/Error.java index 2f743b6..7075e2e 100644 --- a/src/main/java/io/sprucehill/mandrill/data/error/Error.java +++ b/src/main/java/io/sprucehill/mandrill/data/error/Error.java @@ -68,35 +68,31 @@ protected static abstract class Init, U extends Error> { protected U object; - protected Init(U object) { + protected Init(final U object) { this.object = object; } - protected abstract T self(); - - protected void postInit() { } - protected void preBuild() { - } - - public T withStatus(String status) { + public T withStatus(final String status) { object.status = status; return self(); } - public T withCode(Integer code) { + protected abstract T self(); + + public T withCode(final Integer code) { object.code = code; return self(); } - public T withName(String name) { + public T withName(final String name) { object.name = name; return self(); } - public T withMessage(String message) { + public T withMessage(final String message) { object.message = message; return self(); } @@ -105,9 +101,12 @@ public U build() { preBuild(); return object; } + + protected void preBuild() { + } } - public static class Builder extends Init { + public static class Builder extends Init { public Builder() { super(new Error()); diff --git a/src/main/java/io/sprucehill/mandrill/data/error/MessageError.java b/src/main/java/io/sprucehill/mandrill/data/error/MessageError.java index f24d027..fb83d53 100644 --- a/src/main/java/io/sprucehill/mandrill/data/error/MessageError.java +++ b/src/main/java/io/sprucehill/mandrill/data/error/MessageError.java @@ -25,7 +25,7 @@ */ public class MessageError extends Error { - protected static abstract class Init, U extends MessageError> extends Error.Init { + protected static abstract class Init, U extends MessageError> extends Error.Init { private static final Set names; @@ -37,7 +37,7 @@ protected static abstract class Init, U extends MessageError names = Collections.unmodifiableSet(namesTmp); } - protected Init(U object) { + protected Init(final U object) { super(object); } @@ -50,7 +50,7 @@ public T withName(String name) { } } - public static class Builder extends Init { + public static class Builder extends Init { public Builder() { super(new MessageError()); diff --git a/src/main/java/io/sprucehill/mandrill/data/error/PreBuildError.java b/src/main/java/io/sprucehill/mandrill/data/error/PreBuildError.java index 49dd5c9..d453a6b 100644 --- a/src/main/java/io/sprucehill/mandrill/data/error/PreBuildError.java +++ b/src/main/java/io/sprucehill/mandrill/data/error/PreBuildError.java @@ -24,28 +24,27 @@ */ public class PreBuildError extends Exception { - private Map preBuildErrors; + private Map preBuildErrors; - public PreBuildError(Map preBuildErrors) { + public PreBuildError(final Map preBuildErrors) { super(concatPreBuildErrors(preBuildErrors)); this.preBuildErrors = Collections.unmodifiableMap(preBuildErrors); } - public Map getPreBuildErrors() { - return preBuildErrors; - } - - private static String concatPreBuildErrors(Map preBuildErrors) { + private static String concatPreBuildErrors(final Map preBuildErrors) { StringBuilder builder = null; - for (Map.Entry preBuildError : preBuildErrors.entrySet()) { + for (final Map.Entry preBuildError : preBuildErrors.entrySet()) { if (null == builder) { builder = new StringBuilder(); - } - else { + } else { builder.append(", "); } builder.append(preBuildError.getKey()); } return null == builder ? "" : builder.toString(); } + + public Map getPreBuildErrors() { + return preBuildErrors; + } } diff --git a/src/main/java/io/sprucehill/mandrill/data/error/RenderTemplateError.java b/src/main/java/io/sprucehill/mandrill/data/error/RenderTemplateError.java index 3faf1ec..2f7b727 100644 --- a/src/main/java/io/sprucehill/mandrill/data/error/RenderTemplateError.java +++ b/src/main/java/io/sprucehill/mandrill/data/error/RenderTemplateError.java @@ -25,7 +25,7 @@ */ public class RenderTemplateError extends Error { - protected static abstract class Init, U extends RenderTemplateError> extends Error.Init { + protected static abstract class Init, U extends RenderTemplateError> extends Error.Init { private static final Set names; @@ -38,12 +38,12 @@ protected static abstract class Init, U extends RenderTempla names = Collections.unmodifiableSet(namesTmp); } - protected Init(U object) { + protected Init(final U object) { super(object); } @Override - public T withName(String name) { + public T withName(final String name) { if (names.contains(name)) { return super.withName(name); } @@ -51,7 +51,7 @@ public T withName(String name) { } } - public static class Builder extends Init { + public static class Builder extends Init { public Builder() { super(new RenderTemplateError()); diff --git a/src/main/java/io/sprucehill/mandrill/data/error/TemplateMessageError.java b/src/main/java/io/sprucehill/mandrill/data/error/TemplateMessageError.java index 32fcdc8..73ae051 100644 --- a/src/main/java/io/sprucehill/mandrill/data/error/TemplateMessageError.java +++ b/src/main/java/io/sprucehill/mandrill/data/error/TemplateMessageError.java @@ -25,7 +25,7 @@ */ public class TemplateMessageError extends MessageError { - protected static abstract class Init, U extends TemplateMessageError> extends MessageError.Init { + protected static abstract class Init, U extends TemplateMessageError> extends MessageError.Init { private static final Set names; @@ -35,12 +35,12 @@ protected static abstract class Init, U extends TemplateMess names = Collections.unmodifiableSet(namesTmp); } - protected Init(U object) { + protected Init(final U object) { super(object); } @Override - public T withName(String name) { + public T withName(final String name) { if (names.contains(name)) { return super.withName(name); } @@ -48,7 +48,7 @@ public T withName(String name) { } } - public static class Builder extends Init { + public static class Builder extends Init { public Builder() { super(new TemplateMessageError()); diff --git a/src/main/java/io/sprucehill/mandrill/data/request/AbstractPayload.java b/src/main/java/io/sprucehill/mandrill/data/request/AbstractPayload.java index e86dcf8..239bcda 100644 --- a/src/main/java/io/sprucehill/mandrill/data/request/AbstractPayload.java +++ b/src/main/java/io/sprucehill/mandrill/data/request/AbstractPayload.java @@ -1,5 +1,5 @@ /* -Copyright 2013-2014 SpruceHill.io GmbH +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,32 +16,29 @@ package io.sprucehill.mandrill.data.request; +import java.util.HashMap; +import java.util.Map; + import com.fasterxml.jackson.annotation.JsonProperty; + import io.sprucehill.mandrill.data.AbstractJsonBase; import io.sprucehill.mandrill.data.error.PreBuildError; -import java.util.HashMap; -import java.util.Map; - /** * @author Michael Duergner */ public abstract class AbstractPayload extends AbstractJsonBase { public static final String PRE_BUILD_KEY_NOT_SET = "KET_NOT_SET"; - - public abstract String getPath(); - @JsonProperty protected String key; - public static abstract class Init, U extends AbstractPayload> { + public abstract String getPath(); - private Map preBuildErrors = new HashMap(); + public static abstract class Init, U extends AbstractPayload> { protected U object; - - protected abstract T self(); + private Map preBuildErrors = new HashMap(); protected Init(U object) { this.object = object; @@ -50,14 +47,33 @@ protected Init(U object) { protected void postInit() { } + public T withKey(final String key) { + object.key = key; + return self(); + } + + protected abstract T self(); + + public boolean hasKey() { + return null != object.key && !object.key.isEmpty(); + } + + public U build() throws PreBuildError { + preBuild(); + if (0 < preBuildErrors.size()) { + throw new PreBuildError(preBuildErrors); + } + return object; + } + /** * Override this method to add additional pre build validation to your payload object; - * + *

* NOTE: always call super.preBuild() as first statement in you own implementation! */ protected void preBuild() { if (null == object.key || object.key.isEmpty()) { - addPreBuildError(PRE_BUILD_KEY_NOT_SET,"'key' must be set and may not be empty!"); + addPreBuildError(PRE_BUILD_KEY_NOT_SET, "'key' must be set and may not be empty!"); } } @@ -68,30 +84,13 @@ protected void preBuild() { * @param preBuildErrorMessage */ protected final void addPreBuildError(String preBuildErrorKey, String preBuildErrorMessage) { - preBuildErrors.put(preBuildErrorKey,preBuildErrorMessage); - } - - public T withKey(String key) { - object.key = key; - return self(); - } - - public boolean hasKey() { - return null != object.key && !object.key.isEmpty(); - } - - public U build() throws PreBuildError { - preBuild(); - if (0 < preBuildErrors.size()) { - throw new PreBuildError(preBuildErrors); - } - return object; + preBuildErrors.put(preBuildErrorKey, preBuildErrorMessage); } } - public static abstract class Builder extends Init { + public static abstract class Builder extends Init { - protected Builder(AbstractPayload object) { + protected Builder(final AbstractPayload object) { super(object); } @@ -100,4 +99,4 @@ protected Builder self() { return this; } } -} \ No newline at end of file +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/AbstractRejectsPayload.java b/src/main/java/io/sprucehill/mandrill/data/request/AbstractRejectsPayload.java new file mode 100644 index 0000000..ba24e72 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/AbstractRejectsPayload.java @@ -0,0 +1,71 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Stephan Wienczny + */ +public abstract class AbstractRejectsPayload extends AbstractPayload { + + @JsonProperty + protected String email; + + @JsonProperty + protected String subaccount; + + public static abstract class Init, U extends AbstractRejectsPayload> + extends AbstractPayload.Init { + + protected Init(U object) { + super(object); + } + + public T withEmail(final String email) { + object.email = email; + return self(); + } + + public T withSubaccount(final String subaccount) { + object.subaccount = subaccount; + return self(); + } + + protected abstract T self(); + + public boolean hasEmail() { + return null != object.email && !object.email.isEmpty(); + } + + public boolean hasSubaccount() { + return null != object.subaccount && !object.subaccount.isEmpty(); + } + } + + public static abstract class Builder extends Init { + + protected Builder(final AbstractRejectsPayload object) { + super(object); + } + + @Override + protected Builder self() { + return this; + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/AbstractWhitelistsPayload.java b/src/main/java/io/sprucehill/mandrill/data/request/AbstractWhitelistsPayload.java new file mode 100644 index 0000000..2c763f8 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/AbstractWhitelistsPayload.java @@ -0,0 +1,61 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Stephan Wienczny + */ +public abstract class AbstractWhitelistsPayload extends AbstractPayload { + + @JsonProperty + protected String email; + + public abstract String getPath(); + + public static abstract class Init, U extends AbstractWhitelistsPayload> + extends AbstractPayload.Init { + + protected Init(U object) { + super(object); + } + + public T withEmail(final String email) { + object.email = email; + return self(); + } + + protected abstract T self(); + + public boolean hasEmail() { + return null != object.email && !object.email.isEmpty(); + } + } + + public static abstract class Builder extends Init { + + protected Builder(final AbstractWhitelistsPayload object) { + super(object); + } + + @Override + protected Builder self() { + return this; + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/IWithFromEmailPayloadBuilder.java b/src/main/java/io/sprucehill/mandrill/data/request/IWithFromEmailPayloadBuilder.java new file mode 100644 index 0000000..b8dda6d --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/IWithFromEmailPayloadBuilder.java @@ -0,0 +1,26 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +/** + * @author Stephan Wienczny + * @param + */ +public interface IWithFromEmailPayloadBuilder { + T withFromEmail(final String email); + +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/IWithFromNamePayloadBuilder.java b/src/main/java/io/sprucehill/mandrill/data/request/IWithFromNamePayloadBuilder.java new file mode 100644 index 0000000..f02a14a --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/IWithFromNamePayloadBuilder.java @@ -0,0 +1,26 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +/** + * @author Stephan Wienczny + * @param + */ +public interface IWithFromNamePayloadBuilder { + T withFromName(final String name); + +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/IWithFromPayloadBuilder.java b/src/main/java/io/sprucehill/mandrill/data/request/IWithFromPayloadBuilder.java new file mode 100644 index 0000000..18fce5d --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/IWithFromPayloadBuilder.java @@ -0,0 +1,25 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +/** + * @author Stephan Wienczny + * @param + */ +public interface IWithFromPayloadBuilder extends IWithFromEmailPayloadBuilder, + IWithFromNamePayloadBuilder { +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/IWithLabelPayloadBuilder.java b/src/main/java/io/sprucehill/mandrill/data/request/IWithLabelPayloadBuilder.java new file mode 100644 index 0000000..6a3d497 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/IWithLabelPayloadBuilder.java @@ -0,0 +1,26 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +/* + * @author Stephan Wienczny + * @param + */ +public interface IWithLabelPayloadBuilder { + + T withLabel(final String label); +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/IWithMergeVarPayloadBuilder.java b/src/main/java/io/sprucehill/mandrill/data/request/IWithMergeVarPayloadBuilder.java index dda4716..4b0c08b 100644 --- a/src/main/java/io/sprucehill/mandrill/data/request/IWithMergeVarPayloadBuilder.java +++ b/src/main/java/io/sprucehill/mandrill/data/request/IWithMergeVarPayloadBuilder.java @@ -21,5 +21,5 @@ */ public interface IWithMergeVarPayloadBuilder { - T withMergeVar(String name, String content); + T withMergeVar(final String name, final String content); } diff --git a/src/main/java/io/sprucehill/mandrill/data/request/IWithMergeVarRecipientAwarePayloadBuilder.java b/src/main/java/io/sprucehill/mandrill/data/request/IWithMergeVarRecipientAwarePayloadBuilder.java index 80a62ed..2738af1 100644 --- a/src/main/java/io/sprucehill/mandrill/data/request/IWithMergeVarRecipientAwarePayloadBuilder.java +++ b/src/main/java/io/sprucehill/mandrill/data/request/IWithMergeVarRecipientAwarePayloadBuilder.java @@ -21,5 +21,5 @@ */ public interface IWithMergeVarRecipientAwarePayloadBuilder extends IWithMergeVarPayloadBuilder { - T withMergeVar(String recipient, String name, String content); + T withMergeVar(final String recipient, final String name, final String content); } diff --git a/src/main/java/io/sprucehill/mandrill/data/request/IWithNamePayloadBuilder.java b/src/main/java/io/sprucehill/mandrill/data/request/IWithNamePayloadBuilder.java new file mode 100644 index 0000000..b0ad3da --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/IWithNamePayloadBuilder.java @@ -0,0 +1,27 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +/** + * @author Stephan Wienczny + * + * @param + */ +public interface IWithNamePayloadBuilder { + + T withName(final String name); +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/IWithTemplateContentPayloadBuilder.java b/src/main/java/io/sprucehill/mandrill/data/request/IWithTemplateContentPayloadBuilder.java index 5b7323b..ac4a518 100644 --- a/src/main/java/io/sprucehill/mandrill/data/request/IWithTemplateContentPayloadBuilder.java +++ b/src/main/java/io/sprucehill/mandrill/data/request/IWithTemplateContentPayloadBuilder.java @@ -21,5 +21,5 @@ */ public interface IWithTemplateContentPayloadBuilder { - T withTemplateContent(String name, String content); + T withTemplateContent(final String name, final String content); } diff --git a/src/main/java/io/sprucehill/mandrill/data/request/IWithTemplateNamePayloadBuilder.java b/src/main/java/io/sprucehill/mandrill/data/request/IWithTemplateNamePayloadBuilder.java index 4112e4b..76a5f08 100644 --- a/src/main/java/io/sprucehill/mandrill/data/request/IWithTemplateNamePayloadBuilder.java +++ b/src/main/java/io/sprucehill/mandrill/data/request/IWithTemplateNamePayloadBuilder.java @@ -21,5 +21,5 @@ */ public interface IWithTemplateNamePayloadBuilder { - T withTemplateName(String templateName); + T withTemplateName(final String templateName); } diff --git a/src/main/java/io/sprucehill/mandrill/data/request/LabelPayload.java b/src/main/java/io/sprucehill/mandrill/data/request/LabelPayload.java new file mode 100644 index 0000000..706c4bb --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/LabelPayload.java @@ -0,0 +1,39 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Stephan Wienczny + */ +public abstract class LabelPayload extends AbstractPayload { + @JsonProperty(value = "label") + protected String label; + + protected static abstract class Init, U extends LabelPayload> extends AbstractPayload.Init implements IWithLabelPayloadBuilder { + + protected Init(U object) { + super(object); + } + + public T withLabel(String label) { + object.label = label; + return self(); + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/MessagePayload.java b/src/main/java/io/sprucehill/mandrill/data/request/MessageSendPayload.java similarity index 79% rename from src/main/java/io/sprucehill/mandrill/data/request/MessagePayload.java rename to src/main/java/io/sprucehill/mandrill/data/request/MessageSendPayload.java index 80688cb..67809fb 100644 --- a/src/main/java/io/sprucehill/mandrill/data/request/MessagePayload.java +++ b/src/main/java/io/sprucehill/mandrill/data/request/MessageSendPayload.java @@ -1,5 +1,5 @@ /* -Copyright 2013-2014 SpruceHill.io GmbH +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,16 +16,23 @@ package io.sprucehill.mandrill.data.request; -import com.fasterxml.jackson.annotation.JsonProperty; -import io.sprucehill.mandrill.data.AbstractJsonBase; - import java.util.ArrayList; import java.util.List; +import com.fasterxml.jackson.annotation.JsonProperty; + +import io.sprucehill.mandrill.data.AbstractJsonBase; + /** * @author Michael Duergner + * @author Stephan Wienczny */ -public class MessagePayload extends AbstractPayload { +public class MessageSendPayload extends AbstractPayload { + + @JsonProperty + protected Message message = new Message(); + @JsonProperty + protected boolean async = Boolean.FALSE; @Override public String getPath() { @@ -75,7 +82,7 @@ public int hashCode() { } @Override - public boolean equals(Object o) { + public boolean equals(final Object o) { if (null == o) { return false; } @@ -83,7 +90,7 @@ public boolean equals(Object o) { return false; } - return null == email ? super.equals(o) : email.equals(((Recipient)o).email); + return null == email ? super.equals(o) : email.equals(((Recipient) o).email); } } @@ -95,9 +102,10 @@ public static final class Variable extends AbstractJsonBase { @JsonProperty protected String content; - protected Variable() {} + protected Variable() { + } - protected Variable(String name, String content) { + protected Variable(final String name, final String content) { this.name = name; this.content = content; } @@ -108,7 +116,7 @@ public int hashCode() { } @Override - public boolean equals(Object o) { + public boolean equals(final Object o) { if (null == o) { return false; } @@ -116,7 +124,7 @@ public boolean equals(Object o) { return false; } - return null == name ? super.equals(o) : name.equals(((Variable)o).name); + return null == name ? super.equals(o) : name.equals(((Variable) o).name); } } @@ -129,13 +137,14 @@ public static final class RecipientMergeVars extends AbstractJsonBase { @JsonProperty protected List vars = new ArrayList(); - protected RecipientMergeVars() {} + protected RecipientMergeVars() { + } - protected RecipientMergeVars(String recipient) { + protected RecipientMergeVars(final String recipient) { this.recipient = recipient; } - protected RecipientMergeVars(String recipient, List vars) { + protected RecipientMergeVars(final String recipient, final List vars) { this.recipient = recipient; this.vars = vars; } @@ -146,7 +155,7 @@ public int hashCode() { } @Override - public boolean equals(Object o) { + public boolean equals(final Object o) { if (null == o) { return false; } @@ -155,7 +164,7 @@ public boolean equals(Object o) { return false; } - return null == recipient ? super.equals(o) : recipient.equals(((RecipientMergeVars)o).recipient); + return null == recipient ? super.equals(o) : recipient.equals(((RecipientMergeVars) o).recipient); } } @@ -168,13 +177,14 @@ public static final class RecipientMetadata extends AbstractJsonBase { @JsonProperty protected List values = new ArrayList(); - protected RecipientMetadata() {} + protected RecipientMetadata() { + } - protected RecipientMetadata(String recipient) { + protected RecipientMetadata(final String recipient) { this.recipient = recipient; } - protected RecipientMetadata(String recipient, List values) { + protected RecipientMetadata(final String recipient, final List values) { this.recipient = recipient; this.values = values; } @@ -185,7 +195,7 @@ public int hashCode() { } @Override - public boolean equals(Object o) { + public boolean equals(final Object o) { if (null == o) { return false; } @@ -194,7 +204,7 @@ public boolean equals(Object o) { return false; } - return null == recipient ? super.equals(o) : recipient.equals(((RecipientMetadata)o).recipient); + return null == recipient ? super.equals(o) : recipient.equals(((RecipientMetadata) o).recipient); } } @@ -207,11 +217,12 @@ public static final class Attachment extends AbstractJsonBase { protected String name; @JsonProperty - protected String content; + protected byte[] content; - protected Attachment() {} + protected Attachment() { + } - protected Attachment(String type, String name, String content) { + protected Attachment(final String type, final String name, final byte[] content) { this.type = type; this.name = name; this.content = content; @@ -223,7 +234,7 @@ public int hashCode() { } @Override - public boolean equals(Object o) { + public boolean equals(final Object o) { if (null == o) { return false; } @@ -231,7 +242,7 @@ public boolean equals(Object o) { return false; } - return null == name ? super.equals(o) : name.equals(((Attachment)o).name); + return null == name ? super.equals(o) : name.equals(((Attachment) o).name); } } @@ -258,11 +269,11 @@ public static final class Message extends AbstractJsonBase { protected List to = new ArrayList(); @JsonProperty( - value = "inline_css") + value = "inline_css") protected boolean inlineCss = Boolean.FALSE; @JsonProperty( - value = "track_opens") + value = "track_opens") protected boolean trackOpens = Boolean.FALSE; @JsonProperty( @@ -315,43 +326,39 @@ public static final class Message extends AbstractJsonBase { protected List attachments = new ArrayList(); } - @JsonProperty - protected Message message = new Message(); - - @JsonProperty - protected boolean async = Boolean.FALSE; - - public static abstract class Init, U extends MessagePayload> extends AbstractPayload.Init implements IWithMergeVarRecipientAwarePayloadBuilder { + public static abstract class Init, U extends MessageSendPayload> + extends AbstractPayload.Init + implements IWithMergeVarRecipientAwarePayloadBuilder { protected Init(U object) { super(object); } - public T withHtml(String html) { + public T withHtml(final String html) { object.message.html = html; return self(); } - public T withText(String text) { + public T withText(final String text) { object.message.text = text; return self(); } - public T withSubject(String subject) { + public T withSubject(final String subject) { object.message.subject = subject; return self(); } - public T withFromEmail(String fromEmail) { + public T withFromEmail(final String fromEmail) { object.message.fromEmail = fromEmail; - return self(); + return self(); } public boolean hasFromEmail() { return null != object.message.fromEmail && !object.message.fromEmail.isEmpty(); } - public T withFromName(String fromName) { + public T withFromName(final String fromName) { object.message.fromName = fromName; return self(); } @@ -360,17 +367,17 @@ public boolean hasFromName() { return null != object.message.fromName && !object.message.fromName.isEmpty(); } - private T withRecipient(Recipient recipient) { + public T withTo(final String email) { + return withRecipient(new Recipient(email)); + } + + private T withRecipient(final Recipient recipient) { if (!object.message.to.contains(recipient)) { object.message.to.add(recipient); } return self(); } - public T withTo(String email) { - return withRecipient(new Recipient(email)); - } - public T withCc(String email) { return withRecipient(new Recipient(email, Recipient.Type.cc)); } @@ -396,11 +403,11 @@ public T withInlineCss(){ return self(); } - public T withoutInlineCss(){ - object.message.inlineCss = Boolean.FALSE; - return self(); + public T withoutInlineCss() { + object.message.inlineCss = Boolean.FALSE; + return self(); } - + public T withTrackOpens() { object.message.trackOpens = Boolean.TRUE; return self(); @@ -451,77 +458,75 @@ public T withoutPreserveRecipients() { return self(); } - public T withBccAddress(String bccAddress){ + public T withBccAddress(final String bccAddress) { object.message.bccAddress = bccAddress; return self(); } - public T withGlobalMergeVar(String name, String content) { - Variable var = new Variable(name,content); + public T withMergeVar(final String name, final String content) { + return withGlobalMergeVar(name, content); + } + + public T withGlobalMergeVar(final String name, final String content) { + Variable var = new Variable(name, content); if (!object.message.globalMergeVars.contains(var)) { object.message.globalMergeVars.add(var); } return self(); } - public T withMergeVar(String name, String content) { - return withGlobalMergeVar(name,content); - } - - public T withMergeVar(String recipient, String name, String content) { + public T withMergeVar(final String recipient, final String name, final String content) { RecipientMergeVars mergeVars = new RecipientMergeVars(recipient); int index = object.message.mergeVars.indexOf(mergeVars); if (-1 != index) { mergeVars = object.message.mergeVars.get(index); - } - else { + } else { object.message.mergeVars.add(mergeVars); } - mergeVars.vars.add(new Variable(name,content)); + mergeVars.vars.add(new Variable(name, content)); return self(); } - public T withTag(String tag) { + public T withTag(final String tag) { if (!object.message.tags.contains(tag)) { object.message.tags.add(tag); } return self(); } - public T withGoogleAnalyticsDomain(String googleAnalyticsDomain) { + public T withGoogleAnalyticsDomain(final String googleAnalyticsDomain) { if (!object.message.googleAnalyticsDomains.contains(googleAnalyticsDomain)) { object.message.googleAnalyticsDomains.add(googleAnalyticsDomain); } return self(); } - public T withGoogleAnalyticsCampaign(String googleAnalyticsCampaign) { + public T withGoogleAnalyticsCampaign(final String googleAnalyticsCampaign) { object.message.googleAnalyticsCampaign = googleAnalyticsCampaign; return self(); } - public T withMetadata(String metadata) { + public T withMetadata(final String metadata) { if (!object.message.metadata.contains(metadata)) { object.message.metadata.add(metadata); } return self(); } - public T withRecipientMetadata(String recipient, String metadata) { + public T withRecipientMetadata(final String recipient, final String metadata) { RecipientMetadata recipientMetadata = new RecipientMetadata(recipient); int index = object.message.recipientMetadata.indexOf(recipientMetadata); if (-1 != index) { recipientMetadata = object.message.recipientMetadata.get(index); - } - else { + } else { object.message.recipientMetadata.add(recipientMetadata); } recipientMetadata.values.add(metadata); return self(); } - public T withAttachment(String type, String name, String content) { - Attachment attachment = new Attachment(type,name,content); + public T withAttachment(final String type, final String name, final byte[] content) { + Attachment attachment = new Attachment(type, name, content); if (!object.message.attachments.contains(attachment)) { object.message.attachments.add(attachment); } @@ -539,13 +544,13 @@ public T doSynchronous() { } } - public static class Builder extends Init { + public static class Builder extends Init { public Builder() { - super(new MessagePayload()); + super(new MessageSendPayload()); } - protected Builder(MessagePayload object) { + protected Builder(final MessageSendPayload object) { super(object); } @@ -554,4 +559,4 @@ protected Builder self() { return this; } } -} \ No newline at end of file +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/TemplateMessagePayload.java b/src/main/java/io/sprucehill/mandrill/data/request/MessageSendTemplatePayload.java similarity index 78% rename from src/main/java/io/sprucehill/mandrill/data/request/TemplateMessagePayload.java rename to src/main/java/io/sprucehill/mandrill/data/request/MessageSendTemplatePayload.java index 01581b3..974c09f 100644 --- a/src/main/java/io/sprucehill/mandrill/data/request/TemplateMessagePayload.java +++ b/src/main/java/io/sprucehill/mandrill/data/request/MessageSendTemplatePayload.java @@ -16,35 +16,35 @@ package io.sprucehill.mandrill.data.request; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; - import java.util.ArrayList; import java.util.List; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; + /** * @author Michael Duergner */ -public class TemplateMessagePayload extends MessagePayload { +public class MessageSendTemplatePayload extends MessageSendPayload { public static final String PRE_BUILD_TEMPLATE_NAME_NOT_SET = "TEMPLATE_NAME_NOT_SET"; - - @Override - public String getPath() { - return "/messages/send-template.json"; - } - @JsonProperty( value = "template_name") protected String templateName; - @JsonProperty( value = "template_content") @JsonInclude( value = JsonInclude.Include.NON_NULL) protected List templateContent = new ArrayList(); - protected static abstract class Init, U extends TemplateMessagePayload> extends MessagePayload.Init implements IWithTemplateNamePayloadBuilder, IWithTemplateContentPayloadBuilder { + @Override + public String getPath() { + return "/messages/send-template.json"; + } + + protected static abstract class Init, U extends MessageSendTemplatePayload> + extends MessageSendPayload.Init implements IWithTemplateNamePayloadBuilder, + IWithTemplateContentPayloadBuilder { protected Init(U object) { super(object); @@ -56,7 +56,7 @@ public T withTemplateName(String templateName) { } public T withTemplateContent(String name, String content) { - Variable variable = new Variable(name,content); + Variable variable = new Variable(name, content); if (!object.templateContent.contains(variable)) { object.templateContent.add(variable); } @@ -67,15 +67,16 @@ public T withTemplateContent(String name, String content) { protected void preBuild() { super.preBuild(); if (null == object.templateName || object.templateName.isEmpty()) { - addPreBuildError(PRE_BUILD_TEMPLATE_NAME_NOT_SET,"'template_name' must be set and may not be empty!"); + addPreBuildError(PRE_BUILD_TEMPLATE_NAME_NOT_SET, + "'template_name' must be set and may not be empty!"); } } } - public static class Builder extends Init { + public static class Builder extends Init { public Builder() { - super(new TemplateMessagePayload()); + super(new MessageSendTemplatePayload()); } @Override diff --git a/src/main/java/io/sprucehill/mandrill/data/request/RejectsAddPayload.java b/src/main/java/io/sprucehill/mandrill/data/request/RejectsAddPayload.java new file mode 100644 index 0000000..25a802e --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/RejectsAddPayload.java @@ -0,0 +1,66 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Stephan Wienczny + */ +public class RejectsAddPayload extends AbstractRejectsPayload { + + @JsonProperty + protected String comment; + + @Override + public String getPath() { + return "/rejects/add.json"; + } + + public static abstract class Init, U extends RejectsAddPayload> + extends AbstractRejectsPayload.Init { + + protected Init(final U object) { + super(object); + } + + public T withComment(final String comment) { + object.comment = comment; + return self(); + } + + public boolean hasComment() { + return null != object.comment && !object.comment.isEmpty(); + } + } + + public static class Builder extends Init { + + public Builder() { + super(new RejectsAddPayload()); + } + + protected Builder(final RejectsAddPayload object) { + super(object); + } + + @Override + protected Builder self() { + return this; + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/RejectsDeletePayload.java b/src/main/java/io/sprucehill/mandrill/data/request/RejectsDeletePayload.java new file mode 100644 index 0000000..f7feb4f --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/RejectsDeletePayload.java @@ -0,0 +1,52 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +/** + * @author Stephan Wienczny + */ +public class RejectsDeletePayload extends AbstractRejectsPayload { + + @Override + public String getPath() { + return "/rejects/delete.json"; + } + + public static abstract class Init, U extends RejectsDeletePayload> + extends AbstractRejectsPayload.Init { + + protected Init(final U object) { + super(object); + } + } + + public static class Builder extends Init { + + public Builder() { + super(new RejectsDeletePayload()); + } + + protected Builder(final RejectsDeletePayload object) { + super(object); + } + + @Override + protected Builder self() { + return this; + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/RejectsListPayload.java b/src/main/java/io/sprucehill/mandrill/data/request/RejectsListPayload.java new file mode 100644 index 0000000..4bc27b2 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/RejectsListPayload.java @@ -0,0 +1,67 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Stephan Wienczny + */ +public class RejectsListPayload extends AbstractRejectsPayload { + + @JsonProperty("include_expired") + protected boolean includeExpired = Boolean.FALSE; + + @Override + public String getPath() { + return "/rejects/list.json"; + } + + public static abstract class Init, U extends RejectsListPayload> + extends AbstractRejectsPayload.Init { + + protected Init(final U object) { + super(object); + } + + public T withIncludeExpired() { + object.includeExpired = Boolean.TRUE; + return self(); + } + + public T withoutIncludeExpired() { + object.includeExpired = Boolean.FALSE; + return self(); + } + } + + public static class Builder extends Init { + + public Builder() { + super(new RejectsListPayload()); + } + + protected Builder(final RejectsListPayload object) { + super(object); + } + + @Override + protected Builder self() { + return this; + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/TemplateAddOrUpdatePayload.java b/src/main/java/io/sprucehill/mandrill/data/request/TemplateAddOrUpdatePayload.java new file mode 100644 index 0000000..ad1a072 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/TemplateAddOrUpdatePayload.java @@ -0,0 +1,95 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Stephan Wienczny + */ +public abstract class TemplateAddOrUpdatePayload extends TemplatePayload { + + public static final String PRE_BUILD_TEMPLATE_NAME_NOT_SET = "TEMPLATE_NAME_NOT_SET"; + @JsonProperty(value = "from_email") + protected String fromEmail; + @JsonProperty(value = "from_name") + protected String fromName; + @JsonProperty(value = "subject") + protected String subject; + @JsonProperty(value = "code") + protected String code; + @JsonProperty(value = "text") + protected String text; + @JsonProperty(value = "publish") + protected boolean publish; + @JsonProperty(value = "labels") + protected List labels; + + protected static abstract class Init, U extends TemplateAddOrUpdatePayload> extends TemplatePayload.Init implements IWithFromPayloadBuilder { + + protected Init(U object) { + super(object); + } + + public T withFromEmail(String fromEmail) { + object.fromEmail = fromEmail; + return self(); + } + + public T withFromName(String name) { + object.fromName = name; + return self(); + } + + public T withSubject(String subject) { + object.subject = subject; + return self(); + } + + public T withCode(String code) { + object.code = code; + return self(); + } + + public T withText(String text) { + object.text = text; + return self(); + } + + public T withPublish(boolean publish) { + object.publish = publish; + return self(); + } + + public T withLabel(String label) { + if (!object.labels.contains(label)) { + object.labels.add(label); + } + return self(); + } + + @Override + protected void preBuild() { + super.preBuild(); + if (null == object.name || object.name.isEmpty()) { + addPreBuildError(PRE_BUILD_TEMPLATE_NAME_NOT_SET, "'template_name' must be set and may not be empty!"); + } + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/TemplateAddPayload.java b/src/main/java/io/sprucehill/mandrill/data/request/TemplateAddPayload.java new file mode 100644 index 0000000..18ba926 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/TemplateAddPayload.java @@ -0,0 +1,40 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +/** + * @author Stephan Wienczny + */ +public class TemplateAddPayload extends TemplateAddOrUpdatePayload { + @Override + public String getPath() { + return "/templates/add.json"; + } + + public static class Builder extends Init { + + public Builder() { + super(new TemplateAddPayload()); + } + + @Override + protected Builder self() { + return this; + } + } + +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/TemplateDeletePayload.java b/src/main/java/io/sprucehill/mandrill/data/request/TemplateDeletePayload.java new file mode 100644 index 0000000..311627e --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/TemplateDeletePayload.java @@ -0,0 +1,39 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +/** + * @author Stephan Wienczny + */ +public class TemplateDeletePayload extends TemplatePayload { + @Override + public String getPath() { + return "/templates/delete.json"; + } + + public static class Builder extends Init { + + public Builder() { + super(new TemplateDeletePayload()); + } + + @Override + protected Builder self() { + return this; + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/TemplateInfoPayload.java b/src/main/java/io/sprucehill/mandrill/data/request/TemplateInfoPayload.java new file mode 100644 index 0000000..3f962e9 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/TemplateInfoPayload.java @@ -0,0 +1,39 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +/** + * @author Stephan Wienczny + */ +public class TemplateInfoPayload extends TemplatePayload { + @Override + public String getPath() { + return "/templates/info.json"; + } + + public static class Builder extends Init { + + public Builder() { + super(new TemplateInfoPayload()); + } + + @Override + protected Builder self() { + return this; + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/TemplateListPayload.java b/src/main/java/io/sprucehill/mandrill/data/request/TemplateListPayload.java new file mode 100644 index 0000000..34b9724 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/TemplateListPayload.java @@ -0,0 +1,39 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +/** + * @author Stephan Wienczny + */ +public class TemplateListPayload extends LabelPayload { + @Override + public String getPath() { + return "/templates/list.json"; + } + + public static class Builder extends Init { + + public Builder() { + super(new TemplateListPayload()); + } + + @Override + protected Builder self() { + return this; + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/TemplatePayload.java b/src/main/java/io/sprucehill/mandrill/data/request/TemplatePayload.java new file mode 100644 index 0000000..cf7fe78 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/TemplatePayload.java @@ -0,0 +1,87 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + + +package io.sprucehill.mandrill.data.request; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import io.sprucehill.mandrill.data.AbstractJsonBase; + +/** + * @author Stephan Wienczny + */ +public abstract class TemplatePayload extends AbstractPayload { + + public static final String PRE_BUILD_TEMPLATE_NAME_NOT_SET = "TEMPLATE_NAME_NOT_SET"; + + @JsonProperty(value = "name") + protected String name; + + public static final class Variable extends AbstractJsonBase { + + @JsonProperty + protected String name; + + @JsonProperty + protected String content; + + protected Variable() { + } + + protected Variable(final String name, final String content) { + this.name = name; + this.content = content; + } + + @Override + public int hashCode() { + return null == name ? super.hashCode() : name.hashCode(); + } + + @Override + public boolean equals(final Object o) { + if (null == o) { + return false; + } + if (!Variable.class.isAssignableFrom(o.getClass())) { + return false; + } + + return null == name ? super.equals(o) : name.equals(((Variable) o).name); + } + } + + protected static abstract class Init, U extends TemplatePayload> extends AbstractPayload.Init implements IWithNamePayloadBuilder { + + protected Init(U object) { + super(object); + } + + public T withName(final String name) { + object.name = name; + return self(); + } + + @Override + protected void preBuild() { + super.preBuild(); + if (null == object.name || object.name.isEmpty()) { + addPreBuildError(PRE_BUILD_TEMPLATE_NAME_NOT_SET, "'template_name' must be set and may not be empty!"); + } + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/TemplatePublishPayload.java b/src/main/java/io/sprucehill/mandrill/data/request/TemplatePublishPayload.java new file mode 100644 index 0000000..12d797e --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/TemplatePublishPayload.java @@ -0,0 +1,39 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +/** + * @author Stephan Wienczny + */ +public class TemplatePublishPayload extends TemplatePayload { + @Override + public String getPath() { + return "/templates/publish.json"; + } + + public static class Builder extends Init { + + public Builder() { + super(new TemplatePublishPayload()); + } + + @Override + protected Builder self() { + return this; + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/RenderTemplatePayload.java b/src/main/java/io/sprucehill/mandrill/data/request/TemplateRenderPayload.java similarity index 76% rename from src/main/java/io/sprucehill/mandrill/data/request/RenderTemplatePayload.java rename to src/main/java/io/sprucehill/mandrill/data/request/TemplateRenderPayload.java index 5f68f3c..fdaf36d 100644 --- a/src/main/java/io/sprucehill/mandrill/data/request/RenderTemplatePayload.java +++ b/src/main/java/io/sprucehill/mandrill/data/request/TemplateRenderPayload.java @@ -16,19 +16,28 @@ package io.sprucehill.mandrill.data.request; +import java.util.ArrayList; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; -import io.sprucehill.mandrill.data.AbstractJsonBase; -import java.util.ArrayList; -import java.util.List; +import io.sprucehill.mandrill.data.AbstractJsonBase; /** * @author Michael Duergner + * @author Stephan Wienczny */ -public class RenderTemplatePayload extends AbstractPayload { +public class TemplateRenderPayload extends AbstractPayload { public static final String PRE_BUILD_TEMPLATE_NAME_NOT_SET = "TEMPLATE_NAME_NOT_SET"; + @JsonProperty(value = "template_name") + protected String templateName; + @JsonProperty(value = "template_content") + @JsonInclude(value = JsonInclude.Include.NON_NULL) + protected List templateContent = new ArrayList(); + @JsonProperty(value = "merge_vars") + protected List mergeVars = new ArrayList(); @Override public String getPath() { @@ -43,7 +52,8 @@ public static final class Variable extends AbstractJsonBase { @JsonProperty protected String content; - protected Variable() {} + protected Variable() { + } protected Variable(String name, String content) { this.name = name; @@ -64,25 +74,13 @@ public boolean equals(Object o) { return false; } - return null == name ? super.equals(o) : name.equals(((Variable)o).name); + return null == name ? super.equals(o) : name.equals(((Variable) o).name); } } - @JsonProperty( - value = "template_name") - protected String templateName; - - @JsonProperty( - value = "template_content") - @JsonInclude( - value = JsonInclude.Include.NON_NULL) - protected List templateContent = new ArrayList(); - - @JsonProperty( - value = "merge_vars") - protected List mergeVars = new ArrayList(); - - protected static abstract class Init, U extends RenderTemplatePayload> extends AbstractPayload.Init implements IWithTemplateNamePayloadBuilder, IWithTemplateContentPayloadBuilder, IWithMergeVarPayloadBuilder { + protected static abstract class Init, U extends TemplateRenderPayload> + extends AbstractPayload.Init implements IWithTemplateNamePayloadBuilder, + IWithTemplateContentPayloadBuilder, IWithMergeVarPayloadBuilder { protected Init(U object) { super(object); @@ -94,7 +92,7 @@ public T withTemplateName(String templateName) { } public T withTemplateContent(String name, String content) { - Variable variable = new Variable(name,content); + Variable variable = new Variable(name, content); if (!object.templateContent.contains(variable)) { object.templateContent.add(variable); } @@ -102,7 +100,7 @@ public T withTemplateContent(String name, String content) { } public T withMergeVar(String name, String content) { - Variable variable = new Variable(name,content); + Variable variable = new Variable(name, content); if (!object.mergeVars.contains(variable)) { object.mergeVars.add(variable); } @@ -113,15 +111,15 @@ public T withMergeVar(String name, String content) { protected void preBuild() { super.preBuild(); if (null == object.templateName || object.templateName.isEmpty()) { - addPreBuildError(PRE_BUILD_TEMPLATE_NAME_NOT_SET,"'template_name' must be set and may not be empty!"); + addPreBuildError(PRE_BUILD_TEMPLATE_NAME_NOT_SET, "'template_name' must be set and may not be empty!"); } } } - public static class Builder extends Init { + public static class Builder extends Init { public Builder() { - super(new RenderTemplatePayload()); + super(new TemplateRenderPayload()); } @Override diff --git a/src/main/java/io/sprucehill/mandrill/data/request/TemplateUpdatePayload.java b/src/main/java/io/sprucehill/mandrill/data/request/TemplateUpdatePayload.java new file mode 100644 index 0000000..397621e --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/TemplateUpdatePayload.java @@ -0,0 +1,40 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +/** + * @author Stephan Wienczny + */ +public class TemplateUpdatePayload extends TemplateAddOrUpdatePayload { + @Override + public String getPath() { + return "/templates/update.json"; + } + + public static class Builder extends Init { + + public Builder() { + super(new TemplateUpdatePayload()); + } + + @Override + protected Builder self() { + return this; + } + } + +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/WhitelistsAddPayload.java b/src/main/java/io/sprucehill/mandrill/data/request/WhitelistsAddPayload.java new file mode 100644 index 0000000..ed39289 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/WhitelistsAddPayload.java @@ -0,0 +1,65 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Stephan Wienczny + */ +public class WhitelistsAddPayload extends AbstractWhitelistsPayload { + @JsonProperty + protected String comment; + + @Override + public String getPath() { + return "/whitelists/add.json"; + } + + public static abstract class Init, U extends WhitelistsAddPayload> + extends AbstractWhitelistsPayload.Init { + + protected Init(final U object) { + super(object); + } + + public T withComment(final String comment) { + object.comment = comment; + return self(); + } + + public boolean hasComment() { + return null != object.comment && !object.comment.isEmpty(); + } + } + + public static class Builder extends Init { + + public Builder() { + super(new WhitelistsAddPayload()); + } + + protected Builder(final WhitelistsAddPayload object) { + super(object); + } + + @Override + protected Builder self() { + return this; + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/WhitelistsDeletePayload.java b/src/main/java/io/sprucehill/mandrill/data/request/WhitelistsDeletePayload.java new file mode 100644 index 0000000..0bddfa0 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/WhitelistsDeletePayload.java @@ -0,0 +1,51 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +/** + * @author Stephan Wienczny + */ +public class WhitelistsDeletePayload extends AbstractWhitelistsPayload { + @Override + public String getPath() { + return "/whitelists/delete.json"; + } + + public static abstract class Init, U extends WhitelistsDeletePayload> + extends AbstractWhitelistsPayload.Init { + + protected Init(final U object) { + super(object); + } + } + + public static class Builder extends Init { + + public Builder() { + super(new WhitelistsDeletePayload()); + } + + protected Builder(final WhitelistsDeletePayload object) { + super(object); + } + + @Override + protected Builder self() { + return this; + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/request/WhitelistsListPayload.java b/src/main/java/io/sprucehill/mandrill/data/request/WhitelistsListPayload.java new file mode 100644 index 0000000..2d8b7ad --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/request/WhitelistsListPayload.java @@ -0,0 +1,51 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.request; + +/** + * @author Stephan Wienczny + */ +public class WhitelistsListPayload extends AbstractWhitelistsPayload { + @Override + public String getPath() { + return "/whitelists/list.json"; + } + + public static abstract class Init, U extends WhitelistsListPayload> + extends AbstractWhitelistsPayload.Init { + + protected Init(final U object) { + super(object); + } + } + + public static class Builder extends Init { + + public Builder() { + super(new WhitelistsListPayload()); + } + + protected Builder(final WhitelistsListPayload object) { + super(object); + } + + @Override + protected Builder self() { + return this; + } + } +} diff --git a/src/main/java/io/sprucehill/mandrill/data/response/AnyListAddResponse.java b/src/main/java/io/sprucehill/mandrill/data/response/AnyListAddResponse.java new file mode 100644 index 0000000..38a93e8 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/response/AnyListAddResponse.java @@ -0,0 +1,45 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.response; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import jersey.repackaged.com.google.common.base.Objects; + +/** + * @author Stephan Wienczny + */ +public class AnyListAddResponse extends Response { + + @JsonProperty + protected String email; + @JsonProperty + protected boolean added; + + public String getEmail() { + return email; + } + + public boolean isAdded() { + return added; + } + + @Override + public String toString() { + return Objects.toStringHelper(this).add("email", email).add("added", added).toString(); + } +} \ No newline at end of file diff --git a/src/main/java/io/sprucehill/mandrill/data/response/AnyListDeleteResponse.java b/src/main/java/io/sprucehill/mandrill/data/response/AnyListDeleteResponse.java new file mode 100644 index 0000000..def69c2 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/response/AnyListDeleteResponse.java @@ -0,0 +1,46 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.response; + +import com.fasterxml.jackson.annotation.JsonProperty; + +import jersey.repackaged.com.google.common.base.Objects; + +/** + * @author Stephan Wienczny + */ +public class AnyListDeleteResponse extends Response { + + @JsonProperty + protected String email; + @JsonProperty + protected boolean deleted; + + public String getEmail() { + return email; + } + + public boolean isDeleted() { + return deleted; + } + + @Override + public String toString() { + return Objects.toStringHelper(this).add("email", email).add("deleted", deleted).toString(); + } + +} \ No newline at end of file diff --git a/src/main/java/io/sprucehill/mandrill/data/response/AnyListListResponse.java b/src/main/java/io/sprucehill/mandrill/data/response/AnyListListResponse.java new file mode 100644 index 0000000..ea4d558 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/response/AnyListListResponse.java @@ -0,0 +1,55 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.response; + +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; + +/** + * @author Stephan Wienczny + */ +public class AnyListListResponse extends Response { + + @JsonProperty + protected String email; + @JsonProperty + protected String detail; + @JsonProperty("created_at") + @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT") + protected Date createdAt; + + public String getEmail() { + return email; + } + + public String getDetail() { + return detail; + } + + public Date getCreatedAt() { + return createdAt; + } + + @Override + public String toString() { + return jersey.repackaged.com.google.common.base.Objects.toStringHelper(this) + .add("email", email).add("detail", detail).add("createdAt", createdAt).toString(); + } + +} \ No newline at end of file diff --git a/src/main/java/io/sprucehill/mandrill/data/response/AnyListListResponseGenericType.java b/src/main/java/io/sprucehill/mandrill/data/response/AnyListListResponseGenericType.java new file mode 100644 index 0000000..99423e3 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/response/AnyListListResponseGenericType.java @@ -0,0 +1,27 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.response; + +import java.util.List; + +import javax.ws.rs.core.GenericType; + +/** + * @author Stephan Wienczny + */ +public class AnyListListResponseGenericType extends GenericType> { +} diff --git a/src/main/java/io/sprucehill/mandrill/data/response/MessageResponse.java b/src/main/java/io/sprucehill/mandrill/data/response/MessageResponse.java index ea1c480..bb37388 100644 --- a/src/main/java/io/sprucehill/mandrill/data/response/MessageResponse.java +++ b/src/main/java/io/sprucehill/mandrill/data/response/MessageResponse.java @@ -1,5 +1,5 @@ /* -Copyright 2013-2014 SpruceHill.io GmbH +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -19,25 +19,20 @@ import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import jersey.repackaged.com.google.common.base.Objects; + /** * @author Michael Duergner + * @author Stephan Wienczny */ public class MessageResponse extends Response { - public static enum Status { - SENT,QUEUED,REJECTED,INVALID; - - @JsonCreator - public static Status parse(String value) { - return valueOf(value.toUpperCase()); - } - } - @JsonProperty protected String email; - @JsonProperty protected Status status; + @JsonProperty("reject_reason") + protected String rejectReason; public String getEmail() { return email; @@ -47,13 +42,22 @@ public Status getStatus() { return status; } + public String getRejectReason() { + return rejectReason; + } + @Override public String toString() { - return new StringBuilder("MessageResponse [email: "). - append(email). - append(", status: "). - append(status). - append("]"). - toString(); + return Objects.toStringHelper(this).add("email", email).add("status", status) + .add("rejectReaseon", rejectReason).toString(); + } + + public static enum Status { + SENT, QUEUED, REJECTED, INVALID; + + @JsonCreator + public static Status parse(String value) { + return valueOf(value.toUpperCase()); + } } } \ No newline at end of file diff --git a/src/main/java/io/sprucehill/mandrill/data/response/MessageResponseListGenericType.java b/src/main/java/io/sprucehill/mandrill/data/response/MessageResponseListGenericType.java new file mode 100644 index 0000000..16bb663 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/response/MessageResponseListGenericType.java @@ -0,0 +1,27 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.response; + +import java.util.List; + +import javax.ws.rs.core.GenericType; + +/** + * @author Stephan Wienczny + */ +public class MessageResponseListGenericType extends GenericType> { +} diff --git a/src/main/java/io/sprucehill/mandrill/data/response/Response.java b/src/main/java/io/sprucehill/mandrill/data/response/Response.java index e9b51bc..53685b5 100644 --- a/src/main/java/io/sprucehill/mandrill/data/response/Response.java +++ b/src/main/java/io/sprucehill/mandrill/data/response/Response.java @@ -1,5 +1,5 @@ /* -Copyright 2013-2014 SpruceHill.io GmbH +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/src/main/java/io/sprucehill/mandrill/data/response/RenderTemplateResponse.java b/src/main/java/io/sprucehill/mandrill/data/response/TemplateRenderResponse.java similarity index 73% rename from src/main/java/io/sprucehill/mandrill/data/response/RenderTemplateResponse.java rename to src/main/java/io/sprucehill/mandrill/data/response/TemplateRenderResponse.java index 1bc61e2..167f116 100644 --- a/src/main/java/io/sprucehill/mandrill/data/response/RenderTemplateResponse.java +++ b/src/main/java/io/sprucehill/mandrill/data/response/TemplateRenderResponse.java @@ -1,5 +1,5 @@ /* -Copyright 2013-2014 SpruceHill.io GmbH +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -18,10 +18,13 @@ import com.fasterxml.jackson.annotation.JsonProperty; +import jersey.repackaged.com.google.common.base.Objects; + /** * @author Michael Duergner + * @author Stephan Wienczny */ -public class RenderTemplateResponse extends Response { +public class TemplateRenderResponse extends Response { @JsonProperty private String html; @@ -32,9 +35,6 @@ public String getHtml() { @Override public String toString() { - return new StringBuilder("RenderTemplateResponse [html: "). - append(html). - append("]"). - toString(); + return Objects.toStringHelper(this).add("html", html).toString(); } } \ No newline at end of file diff --git a/src/main/java/io/sprucehill/mandrill/data/response/TemplateResponse.java b/src/main/java/io/sprucehill/mandrill/data/response/TemplateResponse.java new file mode 100644 index 0000000..79d55cc --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/response/TemplateResponse.java @@ -0,0 +1,164 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.response; + +import java.util.Date; +import java.util.List; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonProperty; + +import jersey.repackaged.com.google.common.base.Objects; + +/** + * @author Stephan Wienczny + */ +public class TemplateResponse extends Response { + + @JsonProperty + private String slug; + + @JsonProperty + private String name; + + @JsonProperty + private List labels; + + @JsonProperty + private String code; + + @JsonProperty + private String subject; + + @JsonProperty("from_email") + private String fromEmail; + + @JsonProperty("from_name") + private String fromName; + + @JsonProperty + private String text; + + @JsonProperty("publish_name") + private String publishName; + + @JsonProperty("publish_code") + private String publishCode; + + @JsonProperty("publish_subject") + private String publishSubject; + + @JsonProperty("publish_from_email") + private String publishFromEmail; + + @JsonProperty("publish_from_name") + private String publishFromName; + + @JsonProperty("publish_text") + private String publishText; + + @JsonProperty("published_at") + @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT") + private Date publishedAt; + + @JsonProperty("created_at") + @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT") + private Date createdAt; + + @JsonProperty("updated_at") + @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT") + private Date updatedAt; + + public String getSlug() { + return slug; + } + + public String getName() { + return name; + } + + public List getLabels() { + return labels; + } + + public String getCode() { + return code; + } + + public String getSubject() { + return subject; + } + + public String getFromEmail() { + return fromEmail; + } + + public String getFromName() { + return fromName; + } + + public String getText() { + return text; + } + + public String getPublishName() { + return publishName; + } + + public String getPublishCode() { + return publishCode; + } + + public String getPublishSubject() { + return publishSubject; + } + + public String getPublishFromEmail() { + return publishFromEmail; + } + + public String getPublishFromName() { + return publishFromName; + } + + public String getPublishText() { + return publishText; + } + + public Date getPublishedAt() { + return publishedAt; + } + + public Date getCreatedAt() { + return createdAt; + } + + public Date getUpdatedAt() { + return updatedAt; + } + + @Override + public String toString() { + return Objects.toStringHelper(this).add("slug", slug).add("name", name).add("label", labels) + .add("code", code).add("subject", subject).add("fromEmail", fromEmail) + .add("fromName", fromName).add("text", text).add("publishName", publishName) + .add("publishCode", publishCode).add("publishSubject", publishSubject) + .add("publishFromEmail", publishFromEmail).add("publishFromName", publishFromName) + .add("publish_text", publishText).add("published_at", publishedAt) + .add("created_at", createdAt).add("updated_at", updatedAt).toString(); + } +} \ No newline at end of file diff --git a/src/main/java/io/sprucehill/mandrill/data/response/TemplateResponseGenericType.java b/src/main/java/io/sprucehill/mandrill/data/response/TemplateResponseGenericType.java new file mode 100644 index 0000000..5ca2b09 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/data/response/TemplateResponseGenericType.java @@ -0,0 +1,27 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.data.response; + +import java.util.List; + +import javax.ws.rs.core.GenericType; + +/** + * @author Stephan Wienczny + */ +public class TemplateResponseGenericType extends GenericType> { +} diff --git a/src/main/java/io/sprucehill/mandrill/service/AbstractService.java b/src/main/java/io/sprucehill/mandrill/service/AbstractService.java index 2d04080..f95ab53 100644 --- a/src/main/java/io/sprucehill/mandrill/service/AbstractService.java +++ b/src/main/java/io/sprucehill/mandrill/service/AbstractService.java @@ -1,5 +1,5 @@ /* -Copyright 2013-2014 SpruceHill.io GmbH +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,108 +16,116 @@ package io.sprucehill.mandrill.service; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.sprucehill.mandrill.data.request.AbstractPayload; -import org.apache.http.HttpResponse; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.entity.StringEntity; -import org.apache.http.impl.client.DefaultHttpClient; -import org.apache.http.impl.conn.PoolingClientConnectionManager; +import java.io.IOException; + +import javax.ws.rs.client.Entity; +import javax.ws.rs.core.GenericType; +import javax.ws.rs.core.Response; + +import org.glassfish.jersey.client.JerseyClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.PostConstruct; -import java.io.IOException; +import io.sprucehill.mandrill.data.request.AbstractPayload; /** * @author Michael Duergner + * @author Stephan Wienczny */ public abstract class AbstractService { - final Logger logger = LoggerFactory.getLogger(getClass()); + protected final Logger LOGGER = LoggerFactory.getLogger(getClass()); - String baseUrl = "https://mandrillapp.com/api/1.0"; + private String baseUrl = "https://mandrillapp.com/api/1.0"; - HttpClient httpClient; + private JerseyClient jerseyClient; - ObjectMapper objectMapper; - - String key; + private String key; /** - * - * @param baseUrl + * @param baseUrl set by {@link MandrillServiceFactory} or by user */ - public void setBaseUrl(String baseUrl) { + public void setBaseUrl(final String baseUrl) { this.baseUrl = baseUrl; } /** - * - * @param httpClient + * @return base url currently set */ - public void setHttpClient(HttpClient httpClient) { - this.httpClient = httpClient; + public String getBaseUrl() { + return baseUrl; } /** - * - * @param objectMapper + * @param jerseyClient set by {@link MandrillServiceFactory} or by user */ - public void setObjectMapper(ObjectMapper objectMapper) { - this.objectMapper = objectMapper; + public void setClient(final JerseyClient jerseyClient) { + this.jerseyClient = jerseyClient; } /** * - * @param key + * @return {@link org.glassfish.jersey.client.JerseyClient} currently set */ - public void setKey(String key) { - this.key = key; + public JerseyClient getJerseyClient() { + return jerseyClient; } - @PostConstruct - public final void postConstruct() { - onPostConstruct(); + /** + * @param key set by {@link MandrillServiceFactory} or by user + */ + public void setKey(final String key) { + this.key = key; } - void onPostConstruct() { - if (null == httpClient) { - httpClient = new DefaultHttpClient(new PoolingClientConnectionManager()); - } - if (null == objectMapper) { - objectMapper = new ObjectMapper(); - } + /** + * + * @return current key for api + */ + public String getKey() { + return key; } - ,U extends AbstractPayload> void integrateDefaultValues(AbstractPayload.Init payloadBuilder) { + , U extends AbstractPayload> void integrateDefaultValues(AbstractPayload.Init payloadBuilder) { if (!payloadBuilder.hasKey() && null != key && !key.isEmpty()) { payloadBuilder.withKey(key); } } - T send(final AbstractPayload payload, TypeReference responseClass, Class errorClass) throws E, IOException { - try { - HttpPost request = new HttpPost(baseUrl+payload.getPath()); - String body = objectMapper.writeValueAsString(payload); - logger.info(body); - request.setEntity(new StringEntity(body,"UTF-8")); - HttpResponse response = httpClient.execute(request); - if (200 == response.getStatusLine().getStatusCode()) { - T result = objectMapper.readValue(response.getEntity().getContent(),responseClass); - return result; - } - else { - E error = objectMapper.readValue(response.getEntity().getContent(),errorClass); - logger.debug("Got error {} while calling {}.", error.toString(), payload.getPath()); - throw error; - } + T send(final AbstractPayload payload, final Class responseClass, + final Class errorClass) throws E, IOException { + final Response response = getJerseyClient() + .target(getBaseUrl()) + .path(payload.getPath()) + .request() + .post(Entity.json(payload)); + + if (200 == response.getStatus()) { + final T result = response.readEntity(responseClass); + return result; + } else { + final E error = response.readEntity(errorClass); + LOGGER.debug("Got error {} while calling {}.", error.toString(), payload.getPath()); + throw error; } - catch (IOException e) { - logger.debug("Got {} while calling {}.",e.getClass().getSimpleName(),payload.getPath()); - throw e; + } + + T send(final AbstractPayload payload, final GenericType responseClass, + final Class errorClass) throws E, IOException { + final Response response = getJerseyClient() + .target(getBaseUrl()) + .path(payload.getPath()) + .request() + .post(Entity.json(payload)); + + if (200 == response.getStatus()) { + final T result = response.readEntity(responseClass); + return result; + } else { + final E error = response.readEntity(errorClass); + LOGGER.debug("Got error {} while calling {}.", error.toString(), payload.getPath()); + throw error; } } -} \ No newline at end of file + +} diff --git a/src/main/java/io/sprucehill/mandrill/service/IMessageService.java b/src/main/java/io/sprucehill/mandrill/service/IMessageService.java index cf48507..386fb79 100644 --- a/src/main/java/io/sprucehill/mandrill/service/IMessageService.java +++ b/src/main/java/io/sprucehill/mandrill/service/IMessageService.java @@ -1,5 +1,5 @@ /* -Copyright 2013-2014 SpruceHill.io GmbH +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,56 +16,63 @@ package io.sprucehill.mandrill.service; +import java.io.IOException; +import java.util.List; + import io.sprucehill.mandrill.data.error.MessageError; import io.sprucehill.mandrill.data.error.PreBuildError; import io.sprucehill.mandrill.data.error.TemplateMessageError; -import io.sprucehill.mandrill.data.request.MessagePayload; -import io.sprucehill.mandrill.data.request.TemplateMessagePayload; +import io.sprucehill.mandrill.data.request.MessageSendPayload; +import io.sprucehill.mandrill.data.request.MessageSendTemplatePayload; import io.sprucehill.mandrill.data.response.MessageResponse; -import java.io.IOException; -import java.util.List; - /** * @author Michael Duergner + * @author Stephan Wienczny */ public interface IMessageService { /** - * - * @param payload * @return * @throws MessageError * @throws IOException */ - List sendMessage(MessagePayload payload) throws MessageError, IOException; + List sendMessage(final MessageSendPayload payload) + throws MessageError, IOException; /** - * - * @param payloadBuilder * @return * @throws PreBuildError * @throws MessageError * @throws IOException */ - List sendMessage(MessagePayload.Builder payloadBuilder) throws PreBuildError, MessageError, IOException; + List sendMessage(final MessageSendPayload.Builder payloadBuilder) + throws PreBuildError, MessageError, IOException; /** - * - * @param payload * @return * @throws TemplateMessageError * @throws IOException */ - List sendTemplateMessage(TemplateMessagePayload payload) throws TemplateMessageError, IOException; + List sendTemplateMessage(final MessageSendTemplatePayload payload) + throws TemplateMessageError, IOException; /** - * - * @param payloadBuilder * @return * @throws PreBuildError * @throws TemplateMessageError * @throws IOException */ - List sendTemplateMessage(TemplateMessagePayload.Builder payloadBuilder) throws PreBuildError, TemplateMessageError, IOException; + List sendTemplateMessage(final MessageSendTemplatePayload.Builder payloadBuilder) + throws PreBuildError, TemplateMessageError, IOException; + + /** + * @param fromEmail email set if missing from builder + */ + void setFromEmail(final String fromEmail); + + /** + * @param fromName name set if missing from builder + */ + void setFromName(final String fromName); } \ No newline at end of file diff --git a/src/main/java/io/sprucehill/mandrill/service/IRejectsService.java b/src/main/java/io/sprucehill/mandrill/service/IRejectsService.java new file mode 100644 index 0000000..911c1b9 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/service/IRejectsService.java @@ -0,0 +1,92 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.service; + +import java.io.IOException; +import java.util.List; + +import io.sprucehill.mandrill.data.error.MessageError; +import io.sprucehill.mandrill.data.error.PreBuildError; +import io.sprucehill.mandrill.data.request.RejectsAddPayload; +import io.sprucehill.mandrill.data.request.RejectsDeletePayload; +import io.sprucehill.mandrill.data.request.RejectsListPayload; +import io.sprucehill.mandrill.data.response.AnyListAddResponse; +import io.sprucehill.mandrill.data.response.AnyListDeleteResponse; +import io.sprucehill.mandrill.data.response.AnyListListResponse; + +/** + * @author Stephan Wienczny + */ +public interface IRejectsService { + /** + * @param payload + * @return + * @throws io.sprucehill.mandrill.data.error.MessageError + * @throws java.io.IOException + */ + AnyListAddResponse add(final RejectsAddPayload payload) + throws MessageError, IOException; + + /** + * @param payloadBuilder + * @return + * @throws io.sprucehill.mandrill.data.error.PreBuildError + * @throws io.sprucehill.mandrill.data.error.MessageError + * @throws java.io.IOException + */ + AnyListAddResponse add(final RejectsAddPayload.Builder payloadBuilder) + throws PreBuildError, MessageError, IOException; + + /** + * @param payload + * @return + * @throws io.sprucehill.mandrill.data.error.MessageError + * @throws java.io.IOException + */ + AnyListDeleteResponse delete(final RejectsDeletePayload payload) + throws MessageError, IOException; + + /** + * @param payloadBuilder + * @return + * @throws io.sprucehill.mandrill.data.error.PreBuildError + * @throws io.sprucehill.mandrill.data.error.MessageError + * @throws java.io.IOException + */ + AnyListDeleteResponse delete(final RejectsDeletePayload.Builder payloadBuilder) + throws PreBuildError, MessageError, IOException; + + /** + * @param payload + * @return + * @throws io.sprucehill.mandrill.data.error.MessageError + * @throws java.io.IOException + */ + List list(final RejectsListPayload payload) + throws MessageError, IOException; + + /** + * @param payloadBuilder + * @return + * @throws io.sprucehill.mandrill.data.error.PreBuildError + * @throws io.sprucehill.mandrill.data.error.MessageError + * @throws java.io.IOException + */ + List list(final RejectsListPayload.Builder payloadBuilder) + throws PreBuildError, MessageError, IOException; + +} \ No newline at end of file diff --git a/src/main/java/io/sprucehill/mandrill/service/ITemplateService.java b/src/main/java/io/sprucehill/mandrill/service/ITemplateService.java index 3730f54..2668deb 100644 --- a/src/main/java/io/sprucehill/mandrill/service/ITemplateService.java +++ b/src/main/java/io/sprucehill/mandrill/service/ITemplateService.java @@ -1,5 +1,5 @@ /* -Copyright 2013-2014 SpruceHill.io GmbH +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,33 +16,145 @@ package io.sprucehill.mandrill.service; +import java.io.IOException; +import java.util.List; + import io.sprucehill.mandrill.data.error.PreBuildError; import io.sprucehill.mandrill.data.error.RenderTemplateError; -import io.sprucehill.mandrill.data.request.RenderTemplatePayload; - -import java.io.IOException; +import io.sprucehill.mandrill.data.request.*; +import io.sprucehill.mandrill.data.response.TemplateResponse; /** * @author Michael Duergner + * @author Stephan Wienczny */ public interface ITemplateService { /** - * * @param payload * @return * @throws RenderTemplateError * @throws IOException */ - String render(RenderTemplatePayload payload) throws RenderTemplateError,IOException; + String render(final TemplateRenderPayload payload) throws RenderTemplateError, IOException; + + /** + * @param payloadBuilder + * @return + * @throws PreBuildError + * @throws RenderTemplateError + * @throws IOException + */ + String render(final TemplateRenderPayload.Builder payloadBuilder) + throws PreBuildError, RenderTemplateError, IOException; + + /** + * @param payload + * @return + * @throws RenderTemplateError + * @throws IOException + */ + TemplateResponse add(final TemplateAddPayload payload) throws RenderTemplateError, IOException; + + /** + * @param payloadBuilder + * @return + * @throws PreBuildError + * @throws RenderTemplateError + * @throws IOException + */ + TemplateResponse add(final TemplateAddPayload.Builder payloadBuilder) + throws PreBuildError, RenderTemplateError, IOException; + + /** + * @param payload + * @return + * @throws RenderTemplateError + * @throws IOException + */ + TemplateResponse update(final TemplateUpdatePayload payload) throws RenderTemplateError, IOException; + + /** + * @param payloadBuilder + * @return + * @throws PreBuildError + * @throws RenderTemplateError + * @throws IOException + */ + TemplateResponse update(final TemplateUpdatePayload.Builder payloadBuilder) + throws PreBuildError, RenderTemplateError, IOException; + + /** + * @param payload + * @return + * @throws RenderTemplateError + * @throws IOException + */ + TemplateResponse publish(final TemplatePublishPayload payload) throws RenderTemplateError, IOException; + + /** + * @param payloadBuilder + * @return + * @throws PreBuildError + * @throws RenderTemplateError + * @throws IOException + */ + TemplateResponse publish(final TemplatePublishPayload.Builder payloadBuilder) + throws PreBuildError, RenderTemplateError, IOException; + + /** + * @param payload + * @return + * @throws RenderTemplateError + * @throws IOException + */ + TemplateResponse delete(final TemplateDeletePayload payload) throws RenderTemplateError, IOException; + + /** + * @param payloadBuilder + * @return + * @throws PreBuildError + * @throws RenderTemplateError + * @throws IOException + */ + TemplateResponse delete(final TemplateDeletePayload.Builder payloadBuilder) + throws PreBuildError, RenderTemplateError, IOException; + + /** + * @param payload + * @return + * @throws RenderTemplateError + * @throws IOException + */ + TemplateResponse info(final TemplateInfoPayload payload) throws RenderTemplateError, IOException; + + /** + * @param payloadBuilder + * @return + * @throws PreBuildError + * @throws RenderTemplateError + * @throws IOException + */ + TemplateResponse info(final TemplateInfoPayload.Builder payloadBuilder) + throws PreBuildError, RenderTemplateError, IOException; + + /** + * @param payload + * @return + * @throws RenderTemplateError + * @throws IOException + */ + List list(final TemplateListPayload payload) throws RenderTemplateError, IOException; /** - * * @param payloadBuilder * @return * @throws PreBuildError * @throws RenderTemplateError * @throws IOException */ - String render(RenderTemplatePayload.Builder payloadBuilder) throws PreBuildError, RenderTemplateError,IOException; + List list(final TemplateListPayload.Builder payloadBuilder) + throws PreBuildError, RenderTemplateError, IOException; + + } diff --git a/src/main/java/io/sprucehill/mandrill/service/IWhitelistsService.java b/src/main/java/io/sprucehill/mandrill/service/IWhitelistsService.java new file mode 100644 index 0000000..d9a9937 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/service/IWhitelistsService.java @@ -0,0 +1,92 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.service; + +import java.io.IOException; +import java.util.List; + +import io.sprucehill.mandrill.data.error.MessageError; +import io.sprucehill.mandrill.data.error.PreBuildError; +import io.sprucehill.mandrill.data.request.WhitelistsAddPayload; +import io.sprucehill.mandrill.data.request.WhitelistsDeletePayload; +import io.sprucehill.mandrill.data.request.WhitelistsListPayload; +import io.sprucehill.mandrill.data.response.AnyListAddResponse; +import io.sprucehill.mandrill.data.response.AnyListDeleteResponse; +import io.sprucehill.mandrill.data.response.AnyListListResponse; + +/** + * @author Stephan Wienczny + */ +public interface IWhitelistsService { + /** + * @param payload + * @return + * @throws io.sprucehill.mandrill.data.error.MessageError + * @throws java.io.IOException + */ + AnyListAddResponse add(final WhitelistsAddPayload payload) + throws MessageError, IOException; + + /** + * @param payloadBuilder + * @return + * @throws io.sprucehill.mandrill.data.error.PreBuildError + * @throws io.sprucehill.mandrill.data.error.MessageError + * @throws java.io.IOException + */ + AnyListAddResponse add(final WhitelistsAddPayload.Builder payloadBuilder) + throws PreBuildError, MessageError, IOException; + + /** + * @param payload + * @return + * @throws io.sprucehill.mandrill.data.error.MessageError + * @throws java.io.IOException + */ + AnyListDeleteResponse delete(final WhitelistsDeletePayload payload) + throws MessageError, IOException; + + /** + * @param payloadBuilder + * @return + * @throws io.sprucehill.mandrill.data.error.PreBuildError + * @throws io.sprucehill.mandrill.data.error.MessageError + * @throws java.io.IOException + */ + AnyListDeleteResponse delete(final WhitelistsDeletePayload.Builder payloadBuilder) + throws PreBuildError, MessageError, IOException; + + /** + * @param payload + * @return + * @throws io.sprucehill.mandrill.data.error.MessageError + * @throws java.io.IOException + */ + List list(final WhitelistsListPayload payload) + throws MessageError, IOException; + + /** + * @param payloadBuilder + * @return + * @throws io.sprucehill.mandrill.data.error.PreBuildError + * @throws io.sprucehill.mandrill.data.error.MessageError + * @throws java.io.IOException + */ + List list(final WhitelistsListPayload.Builder payloadBuilder) + throws PreBuildError, MessageError, IOException; + +} \ No newline at end of file diff --git a/src/main/java/io/sprucehill/mandrill/service/MandrillServiceFactory.java b/src/main/java/io/sprucehill/mandrill/service/MandrillServiceFactory.java new file mode 100644 index 0000000..426164f --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/service/MandrillServiceFactory.java @@ -0,0 +1,118 @@ +/* +Copyright 2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.service; + +import org.glassfish.jersey.client.JerseyClient; +import org.glassfish.jersey.client.JerseyClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import jersey.repackaged.com.google.common.base.Objects; + +/** + * @author Stephan Wienczny + */ +public class MandrillServiceFactory { + protected final Logger LOGGER = LoggerFactory.getLogger(getClass()); + + private String baseUrl = "https://mandrillapp.com/api/1.0"; + + private JerseyClient jerseyClient; + + private String key; + + public MandrillServiceFactory() { + } + + public MandrillServiceFactory(final String key) { + this.key = key; + } + + public MandrillServiceFactory(final String key, final String baseUrl) { + this(key); + this.baseUrl = baseUrl; + } + + public MandrillServiceFactory(final String key, final String baseUrl, + final JerseyClient jerseyClient) { + this(key, baseUrl); + this.jerseyClient = jerseyClient; + } + + public String getBaseUrl() { + return baseUrl; + } + + public void setBaseUrl(final String baseUrl) { + this.baseUrl = baseUrl; + } + + public JerseyClient getJerseyClient() { + if (jerseyClient == null) { + synchronized (MandrillServiceFactory.class) { + if (jerseyClient == null) { + jerseyClient = JerseyClientBuilder.createClient(); + } + } + } + return jerseyClient; + } + + public void setJerseyClient(final JerseyClient jerseyClient) { + this.jerseyClient = jerseyClient; + } + + public String getKey() { + return key; + } + + public void setKey(final String key) { + this.key = key; + } + + public IMessageService createMessageService() { + return assignConfiguration(new MessageService()); + } + + public IRejectsService createRejectsService() { + return assignConfiguration(new RejectsService()); + } + + public ITemplateService createTemplateService() { + return assignConfiguration(new TemplateService()); + } + + public IWhitelistsService createWhitelistsService() { + return assignConfiguration(new WhitelistsService()); + } + + public S assignConfiguration(S service) { + service.setBaseUrl(getBaseUrl()); + service.setKey(getKey()); + service.setClient(getJerseyClient()); + return service; + } + + @Override + public String toString() { + return Objects.toStringHelper(this) + .add("jerseyClient", jerseyClient) + .add("baseUrl", baseUrl) + .add("key", key) + .toString(); + } +} diff --git a/src/main/java/io/sprucehill/mandrill/service/MessageService.java b/src/main/java/io/sprucehill/mandrill/service/MessageService.java index bbec75e..0291d79 100644 --- a/src/main/java/io/sprucehill/mandrill/service/MessageService.java +++ b/src/main/java/io/sprucehill/mandrill/service/MessageService.java @@ -1,5 +1,5 @@ /* -Copyright 2013-2014 SpruceHill.io GmbH +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -13,22 +13,22 @@ See the License for the specific language governing permissions and limitations under the License. */ - package io.sprucehill.mandrill.service; -import com.fasterxml.jackson.core.type.TypeReference; +import java.io.IOException; +import java.util.List; + import io.sprucehill.mandrill.data.error.MessageError; import io.sprucehill.mandrill.data.error.PreBuildError; import io.sprucehill.mandrill.data.error.TemplateMessageError; -import io.sprucehill.mandrill.data.request.MessagePayload; -import io.sprucehill.mandrill.data.request.TemplateMessagePayload; +import io.sprucehill.mandrill.data.request.MessageSendPayload; +import io.sprucehill.mandrill.data.request.MessageSendTemplatePayload; import io.sprucehill.mandrill.data.response.MessageResponse; - -import java.io.IOException; -import java.util.List; +import io.sprucehill.mandrill.data.response.MessageResponseListGenericType; /** * @author Michael Duergner + * @author Stephan Wienczny */ public class MessageService extends AbstractService implements IMessageService { @@ -36,59 +36,67 @@ public class MessageService extends AbstractService implements IMessageService { private String fromName; - public void setFromEmail(String fromEmail) { + public void setFromEmail(final String fromEmail) { this.fromEmail = fromEmail; } - public void setFromName(String fromName) { + public void setFromName(final String fromName) { this.fromName = fromName; } @Override - public List sendMessage(MessagePayload payload) throws MessageError, IOException { + public List sendMessage(final MessageSendPayload payload) + throws MessageError, IOException { try { - List messageResponses = send(payload,new TypeReference>() {},MessageError.class); + final List messageResponses = + send(payload, new MessageResponseListGenericType(), MessageError.class); return messageResponses; - } - catch (MessageError e) { - logger.warn("Got MessageError with code {}, name {} and message {} when sending message!",new Object[] {e.getCode().toString(),e.getName(),e.getMessage()}); + } catch (MessageError e) { + LOGGER.warn("Got MessageError with code {}, name {} and message {} when sending message!", + e.getCode().toString(), e.getName(), e.getMessage()); throw e; - } - catch (IOException e) { - logger.error("Got IOException while sending message!"); + } catch (IOException e) { + LOGGER.error("Got IOException while sending message!"); throw e; } } @Override - public List sendMessage(MessagePayload.Builder payloadBuilder) throws PreBuildError, MessageError, IOException { + public List sendMessage(final MessageSendPayload.Builder payloadBuilder) + throws PreBuildError, MessageError, IOException { integrateDefaultValues(payloadBuilder); return sendMessage(payloadBuilder.build()); } @Override - public List sendTemplateMessage(TemplateMessagePayload payload) throws TemplateMessageError, IOException { + public List sendTemplateMessage(final MessageSendTemplatePayload payload) + throws TemplateMessageError, IOException { try { - List messageResponses = send(payload,new TypeReference>() {},MessageError.class); + final List messageResponses = + send(payload, new MessageResponseListGenericType(), MessageError.class); return messageResponses; - } - catch (MessageError e) { - logger.warn("Got MessageError with code {}, name {} and message {} when sending message!",new Object[] {e.getCode().toString(),e.getName(),e.getMessage()}); + } catch (MessageError e) { + LOGGER.warn("Got MessageError with code {}, name {} and message {} when sending message!", + e.getCode().toString(), e.getName(), e.getMessage()); throw e; - } - catch (IOException e) { - logger.error("Got IOException while sending message!"); + } catch (IOException e) { + LOGGER.error("Got IOException while sending message!"); throw e; } } - public List sendTemplateMessage(TemplateMessagePayload.Builder payloadBuilder) throws PreBuildError, TemplateMessageError, IOException { + public List sendTemplateMessage( + final MessageSendTemplatePayload.Builder payloadBuilder) + throws PreBuildError, TemplateMessageError, IOException { integrateDefaultValues(payloadBuilder); return sendTemplateMessage(payloadBuilder.build()); } - , U extends MessagePayload> void integrateDefaultValues(MessagePayload.Init payloadBuilder) { + , U extends MessageSendPayload> void integrateDefaultValues( + final MessageSendPayload.Init payloadBuilder) { super.integrateDefaultValues(payloadBuilder); + + // Allow default from email and name set on if (!payloadBuilder.hasFromEmail() && null != fromEmail && !fromEmail.isEmpty()) { payloadBuilder.withFromEmail(fromEmail); } @@ -96,4 +104,4 @@ , U extends MessagePayload> void integrateDe payloadBuilder.withFromName(fromName); } } -} \ No newline at end of file +} diff --git a/src/main/java/io/sprucehill/mandrill/service/RejectsService.java b/src/main/java/io/sprucehill/mandrill/service/RejectsService.java new file mode 100644 index 0000000..3a8d8aa --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/service/RejectsService.java @@ -0,0 +1,108 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.service; + +import java.io.IOException; +import java.util.List; + +import io.sprucehill.mandrill.data.error.MessageError; +import io.sprucehill.mandrill.data.error.PreBuildError; +import io.sprucehill.mandrill.data.request.RejectsAddPayload; +import io.sprucehill.mandrill.data.request.RejectsDeletePayload; +import io.sprucehill.mandrill.data.request.RejectsListPayload; +import io.sprucehill.mandrill.data.response.AnyListAddResponse; +import io.sprucehill.mandrill.data.response.AnyListDeleteResponse; +import io.sprucehill.mandrill.data.response.AnyListListResponse; +import io.sprucehill.mandrill.data.response.AnyListListResponseGenericType; + +/** + * @author Stephan Wienczny + */ +public class RejectsService extends AbstractService implements IRejectsService { + + @Override + public AnyListAddResponse add(final RejectsAddPayload payload) + throws MessageError, IOException { + try { + final AnyListAddResponse messageResponses = + send(payload, AnyListAddResponse.class, MessageError.class); + return messageResponses; + } catch (final MessageError e) { + LOGGER.warn("Got MessageError with code {}, name {} and message {} when adding reject!", + e.getCode().toString(), e.getName(), e.getMessage()); + throw e; + } catch (final IOException e) { + LOGGER.error("Got IOException while adding reject!"); + throw e; + } + } + + @Override + public AnyListAddResponse add(final RejectsAddPayload.Builder payloadBuilder) + throws PreBuildError, MessageError, IOException { + integrateDefaultValues(payloadBuilder); + return add(payloadBuilder.build()); + } + + @Override + public AnyListDeleteResponse delete(final RejectsDeletePayload payload) + throws MessageError, IOException { + try { + final AnyListDeleteResponse messageResponses = + send(payload, AnyListDeleteResponse.class, MessageError.class); + return messageResponses; + } catch (final MessageError e) { + LOGGER.warn("Got MessageError with code {}, name {} and message {} when deleting reject!", + e.getCode().toString(), e.getName(), e.getMessage()); + throw e; + } catch (final IOException e) { + LOGGER.error("Got IOException while deleting reject!"); + throw e; + } + } + + @Override + public AnyListDeleteResponse delete(final RejectsDeletePayload.Builder payloadBuilder) + throws PreBuildError, MessageError, IOException { + integrateDefaultValues(payloadBuilder); + return delete(payloadBuilder.build()); + } + + @Override + public List list(final RejectsListPayload payload) + throws MessageError, IOException { + try { + final List messageResponses = + send(payload, new AnyListListResponseGenericType(), MessageError.class); + return messageResponses; + } catch (final MessageError e) { + LOGGER.warn("Got MessageError with code {}, name {} and message {} when listing rejects!", + e.getCode().toString(), e.getName(), e.getMessage()); + throw e; + } catch (final IOException e) { + LOGGER.error("Got IOException while listing rejects!"); + throw e; + } + } + + @Override + public List list(final RejectsListPayload.Builder payloadBuilder) + throws PreBuildError, MessageError, IOException { + integrateDefaultValues(payloadBuilder); + return list(payloadBuilder.build()); + } +} diff --git a/src/main/java/io/sprucehill/mandrill/service/TemplateService.java b/src/main/java/io/sprucehill/mandrill/service/TemplateService.java index 76c0e3e..f3f96e3 100644 --- a/src/main/java/io/sprucehill/mandrill/service/TemplateService.java +++ b/src/main/java/io/sprucehill/mandrill/service/TemplateService.java @@ -1,5 +1,5 @@ /* -Copyright 2013-2014 SpruceHill.io GmbH +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -16,39 +16,190 @@ package io.sprucehill.mandrill.service; -import com.fasterxml.jackson.core.type.TypeReference; +import java.io.IOException; +import java.util.List; + import io.sprucehill.mandrill.data.error.MessageError; import io.sprucehill.mandrill.data.error.PreBuildError; import io.sprucehill.mandrill.data.error.RenderTemplateError; -import io.sprucehill.mandrill.data.request.RenderTemplatePayload; -import io.sprucehill.mandrill.data.response.RenderTemplateResponse; - -import java.io.IOException; +import io.sprucehill.mandrill.data.request.*; +import io.sprucehill.mandrill.data.response.TemplateRenderResponse; +import io.sprucehill.mandrill.data.response.TemplateResponse; +import io.sprucehill.mandrill.data.response.TemplateResponseGenericType; /** * @author Michael Duergner + * @author Stephan Wienczny */ public class TemplateService extends AbstractService implements ITemplateService { @Override - public String render(RenderTemplatePayload payload) throws RenderTemplateError, IOException { + public String render(final TemplateRenderPayload payload) + throws RenderTemplateError, IOException { try { - RenderTemplateResponse renderTemplateResponse = send(payload,new TypeReference() {},RenderTemplateError.class); - return renderTemplateResponse.getHtml(); + final TemplateRenderResponse templateRenderResponse = + send(payload, TemplateRenderResponse.class, RenderTemplateError.class); + return templateRenderResponse.getHtml(); + } catch (final MessageError e) { + LOGGER.warn("Got RenderTemplateError with code {}, name {} and message {} when " + + "rendering template!", e.getCode().toString(), e.getName(), e.getMessage()); + throw e; + } catch (final IOException e) { + LOGGER.error("Got IOException while rendering template!"); + throw e; } - catch (MessageError e) { - logger.warn("Got RenderTemplateError with code {}, name {} and message {} when rendering template!",new Object[] {e.getCode().toString(),e.getName(),e.getMessage()}); + } + + @Override + public String render(final TemplateRenderPayload.Builder payloadBuilder) + throws PreBuildError, RenderTemplateError, IOException { + integrateDefaultValues(payloadBuilder); + return render(payloadBuilder.build()); + } + + @Override + public TemplateResponse add(final TemplateAddPayload payload) + throws RenderTemplateError, IOException { + try { + final TemplateResponse templateResponse = + send(payload, TemplateResponse.class, RenderTemplateError.class); + return templateResponse; + } catch (final MessageError e) { + LOGGER.warn("Got RenderTemplateError with code {}, name {} and message {} when " + + "rendering template!", e.getCode().toString(), e.getName(), e.getMessage()); + throw e; + } catch (final IOException e) { + LOGGER.error("Got IOException while rendering template!"); throw e; } - catch (IOException e) { - logger.error("Got IOException while rendering template!"); + } + + @Override + public TemplateResponse add(final TemplateAddPayload.Builder payloadBuilder) + throws PreBuildError, RenderTemplateError, IOException { + integrateDefaultValues(payloadBuilder); + return add(payloadBuilder.build()); + } + + @Override + public TemplateResponse update(final TemplateUpdatePayload payload) + throws RenderTemplateError, IOException { + try { + final TemplateResponse templateResponse = + send(payload, TemplateResponse.class, RenderTemplateError.class); + return templateResponse; + } catch (final MessageError e) { + LOGGER.warn("Got RenderTemplateError with code {}, name {} and message {} when " + + "rendering template!", e.getCode().toString(), e.getName(), e.getMessage()); + throw e; + } catch (final IOException e) { + LOGGER.error("Got IOException while rendering template!"); throw e; } } @Override - public String render(RenderTemplatePayload.Builder payloadBuilder) throws PreBuildError, RenderTemplateError,IOException { + public TemplateResponse update(final TemplateUpdatePayload.Builder payloadBuilder) + throws PreBuildError, RenderTemplateError, IOException { integrateDefaultValues(payloadBuilder); - return render(payloadBuilder.build()); + return update(payloadBuilder.build()); + } + + @Override + public TemplateResponse publish(final TemplatePublishPayload payload) + throws RenderTemplateError, IOException { + try { + final TemplateResponse templateResponse = + send(payload, TemplateResponse.class, RenderTemplateError.class); + return templateResponse; + } catch (final MessageError e) { + LOGGER.warn("Got RenderTemplateError with code {}, name {} and message {} when " + + "rendering template!", e.getCode().toString(), e.getName(), e.getMessage()); + throw e; + } catch (final IOException e) { + LOGGER.error("Got IOException while rendering template!"); + throw e; + } + } + + @Override + public TemplateResponse publish(final TemplatePublishPayload.Builder payloadBuilder) + throws PreBuildError, RenderTemplateError, IOException { + integrateDefaultValues(payloadBuilder); + return publish(payloadBuilder.build()); + } + + @Override + public TemplateResponse delete(final TemplateDeletePayload payload) + throws RenderTemplateError, IOException { + try { + final TemplateResponse templateResponse = + send(payload, TemplateResponse.class, RenderTemplateError.class); + return templateResponse; + } catch (final MessageError e) { + LOGGER.warn("Got RenderTemplateError with code {}, name {} and message {} when " + + "rendering template!", e.getCode().toString(), e.getName(), e.getMessage()); + throw e; + } catch (final IOException e) { + LOGGER.error("Got IOException while rendering template!"); + throw e; + } + } + + @Override + public TemplateResponse delete(final TemplateDeletePayload.Builder payloadBuilder) + throws PreBuildError, RenderTemplateError, IOException { + integrateDefaultValues(payloadBuilder); + return delete(payloadBuilder.build()); + } + + + @Override + public TemplateResponse info(final TemplateInfoPayload payload) + throws RenderTemplateError, IOException { + try { + final TemplateResponse templateResponse = + send(payload, TemplateResponse.class, RenderTemplateError.class); + return templateResponse; + } catch (final MessageError e) { + LOGGER.warn("Got RenderTemplateError with code {}, name {} and message {} when " + + "rendering template!", e.getCode().toString(), e.getName(), e.getMessage()); + throw e; + } catch (final IOException e) { + LOGGER.error("Got IOException while rendering template!"); + throw e; + } + } + + @Override + public TemplateResponse info(final TemplateInfoPayload.Builder payloadBuilder) + throws PreBuildError, RenderTemplateError, IOException { + integrateDefaultValues(payloadBuilder); + return info(payloadBuilder.build()); + } + + @Override + public List list(final TemplateListPayload payload) + throws RenderTemplateError, IOException { + try { + final List templateResponse = + send(payload, new TemplateResponseGenericType(), RenderTemplateError.class); + return templateResponse; + } catch (final MessageError e) { + LOGGER.warn("Got RenderTemplateError with code {}, name {} and message {} when " + + "rendering template!", e.getCode().toString(), e.getName(), e.getMessage()); + throw e; + } catch (final IOException e) { + LOGGER.error("Got IOException while rendering template!"); + throw e; + } } + + @Override + public List list(final TemplateListPayload.Builder payloadBuilder) + throws PreBuildError, RenderTemplateError, IOException { + integrateDefaultValues(payloadBuilder); + return list(payloadBuilder.build()); + } + } diff --git a/src/main/java/io/sprucehill/mandrill/service/WhitelistsService.java b/src/main/java/io/sprucehill/mandrill/service/WhitelistsService.java new file mode 100644 index 0000000..4044a27 --- /dev/null +++ b/src/main/java/io/sprucehill/mandrill/service/WhitelistsService.java @@ -0,0 +1,107 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.service; + +import java.io.IOException; +import java.util.List; + +import io.sprucehill.mandrill.data.error.MessageError; +import io.sprucehill.mandrill.data.error.PreBuildError; +import io.sprucehill.mandrill.data.request.WhitelistsAddPayload; +import io.sprucehill.mandrill.data.request.WhitelistsDeletePayload; +import io.sprucehill.mandrill.data.request.WhitelistsListPayload; +import io.sprucehill.mandrill.data.response.AnyListAddResponse; +import io.sprucehill.mandrill.data.response.AnyListDeleteResponse; +import io.sprucehill.mandrill.data.response.AnyListListResponse; +import io.sprucehill.mandrill.data.response.AnyListListResponseGenericType; + +/** + * @author Stephan Wienczny + */ +public class WhitelistsService extends AbstractService implements IWhitelistsService { + + @Override + public AnyListAddResponse add(final WhitelistsAddPayload payload) + throws MessageError, IOException { + try { + final AnyListAddResponse messageResponses = + send(payload, AnyListAddResponse.class, MessageError.class); + return messageResponses; + } catch (final MessageError e) { + LOGGER.warn("Got MessageError with code {}, name {} and message {} when adding whitelist!", + e.getCode().toString(), e.getName(), e.getMessage()); + throw e; + } catch (final IOException e) { + LOGGER.error("Got IOException while sending message!"); + throw e; + } + } + + @Override + public AnyListAddResponse add(final WhitelistsAddPayload.Builder payloadBuilder) + throws PreBuildError, MessageError, IOException { + integrateDefaultValues(payloadBuilder); + return add(payloadBuilder.build()); + } + + @Override + public AnyListDeleteResponse delete(final WhitelistsDeletePayload payload) + throws MessageError, IOException { + try { + final AnyListDeleteResponse messageResponses = + send(payload, AnyListDeleteResponse.class, MessageError.class); + return messageResponses; + } catch (final MessageError e) { + LOGGER.warn("Got MessageError with code {}, name {} and message {} when deleting whitelist!", e.getCode().toString(), e.getName(), e.getMessage()); + throw e; + } catch (final IOException e) { + LOGGER.error("Got IOException while deleting whitelist!"); + throw e; + } + } + + @Override + public AnyListDeleteResponse delete(final WhitelistsDeletePayload.Builder payloadBuilder) + throws PreBuildError, MessageError, IOException { + integrateDefaultValues(payloadBuilder); + return delete(payloadBuilder.build()); + } + + @Override + public List list(final WhitelistsListPayload payload) + throws MessageError, IOException { + try { + final List messageResponses = + send(payload, new AnyListListResponseGenericType(), MessageError.class); + return messageResponses; + } catch (final MessageError e) { + LOGGER.warn("Got MessageError with code {}, name {} and message {} when listing whitelists!", + e.getCode().toString(), e.getName(), e.getMessage()); + throw e; + } catch (final IOException e) { + LOGGER.error("Got IOException while listing whitelists!"); + throw e; + } + } + + @Override + public List list(final WhitelistsListPayload.Builder payloadBuilder) + throws PreBuildError, MessageError, IOException { + integrateDefaultValues(payloadBuilder); + return list(payloadBuilder.build()); + } +} diff --git a/src/test/java/io/sprucehill/mandrill/AbstractTest.java b/src/test/java/io/sprucehill/mandrill/AbstractTest.java new file mode 100644 index 0000000..b218202 --- /dev/null +++ b/src/test/java/io/sprucehill/mandrill/AbstractTest.java @@ -0,0 +1,58 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill; + +import org.junit.Before; + +import io.sprucehill.mandrill.service.MandrillServiceFactory; + +/** + * Abstract test providing apiKey. + * + * @author Stephan Wienczny + */ +public abstract class AbstractTest { + protected MandrillServiceFactory mandrillServiceFactory = null; + + @Before + public void init() { + // 1. try + String apiKey = System.getenv("mandrill.apikey"); + + // 2. try + if (apiKey == null || apiKey.isEmpty()) { + apiKey = System.getenv("mandrill_apikey"); + } + + // 3. try + if (apiKey == null || apiKey.isEmpty()) { + apiKey = System.getProperty("mandrill.apikey"); + } + + // 4. try + if (apiKey == null || apiKey.isEmpty()) { + apiKey = System.getProperty("mandrill_apikey"); + } + + // failed? + if (apiKey == null) { + throw new IllegalArgumentException("No apiKey in environment"); + } + + mandrillServiceFactory = new MandrillServiceFactory(apiKey); + } +} diff --git a/src/test/java/io/sprucehill/mandrill/service/MessageServiceTest.java b/src/test/java/io/sprucehill/mandrill/service/MessageServiceTest.java new file mode 100644 index 0000000..d316683 --- /dev/null +++ b/src/test/java/io/sprucehill/mandrill/service/MessageServiceTest.java @@ -0,0 +1,95 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.service; + +import java.io.IOException; +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +import io.sprucehill.mandrill.AbstractTest; +import io.sprucehill.mandrill.data.error.PreBuildError; +import io.sprucehill.mandrill.data.request.MessageSendPayload; +import io.sprucehill.mandrill.data.request.MessageSendTemplatePayload; +import io.sprucehill.mandrill.data.response.MessageResponse; + +/** + * @author Stephan Wienczny + */ +public class MessageServiceTest extends AbstractTest { + private static final String EMAIL = "test@test.com"; + private static final String TEMPLATE = "testtemplate"; + private static final String FROM_EMAIL = "info@test.com"; + private static final String FROM_NAME = "Testservice"; + + @Test + public void send() throws PreBuildError, IOException { + final IMessageService messageService = mandrillServiceFactory.createMessageService(); + + final List response = messageService.sendMessage( + new MessageSendPayload.Builder().withTo(EMAIL).withSubject("Mandrill Test") + .withText("This is an automatic test for emails send using Mandrill")); + + Assert.assertFalse(response.isEmpty()); + //Assert.assertEquals(EMAIL, response.getEmail()); + //Assert.assertEquals(MessageResponse.Status.SENT, response.getStatus()); + } + + @Test + public void sendWithFrom() throws PreBuildError, IOException { + final IMessageService messageService = mandrillServiceFactory.createMessageService(); + + final List response = messageService.sendMessage( + new MessageSendPayload.Builder().withTo(EMAIL).withFromEmail(FROM_EMAIL) + .withFromName(FROM_NAME).withSubject("Mandrill Test") + .withText("This is an automatic test for emails send using Mandrill")); + + Assert.assertFalse(response.isEmpty()); + //Assert.assertEquals(EMAIL, response.getEmail()); + //Assert.assertEquals(MessageResponse.Status.SENT, response.getStatus()); + } + + @Test + public void sendWithFromUsingDefaults() throws PreBuildError, IOException { + final IMessageService messageService = mandrillServiceFactory.createMessageService(); + messageService.setFromEmail(FROM_EMAIL); + messageService.setFromName(FROM_NAME); + + final List response = messageService.sendMessage( + new MessageSendPayload.Builder().withTo(EMAIL).withSubject("Mandrill Test") + .withText("This is an automatic test for emails send using Mandrill")); + + Assert.assertFalse(response.isEmpty()); + //Assert.assertEquals(EMAIL, response.getEmail()); + //Assert.assertEquals(MessageResponse.Status.SENT, response.getStatus()); + } + + + @Test + public void sendTemplate() throws PreBuildError, IOException { + final IMessageService messageService = mandrillServiceFactory.createMessageService(); + + final List response = messageService.sendTemplateMessage( + new MessageSendTemplatePayload.Builder().withTo(EMAIL) + .withTemplateName(TEMPLATE)); + + Assert.assertFalse(response.isEmpty()); + //Assert.assertEquals(EMAIL, response.getEmail()); + //Assert.assertEquals(MessageResponse.Status.SENT, response.getStatus()); + } +} diff --git a/src/test/java/io/sprucehill/mandrill/service/RejectsServiceTest.java b/src/test/java/io/sprucehill/mandrill/service/RejectsServiceTest.java new file mode 100644 index 0000000..2e21ed8 --- /dev/null +++ b/src/test/java/io/sprucehill/mandrill/service/RejectsServiceTest.java @@ -0,0 +1,73 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.service; + +import java.io.IOException; +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +import io.sprucehill.mandrill.AbstractTest; +import io.sprucehill.mandrill.data.error.PreBuildError; +import io.sprucehill.mandrill.data.request.RejectsAddPayload; +import io.sprucehill.mandrill.data.request.RejectsDeletePayload; +import io.sprucehill.mandrill.data.request.RejectsListPayload; +import io.sprucehill.mandrill.data.response.AnyListAddResponse; +import io.sprucehill.mandrill.data.response.AnyListDeleteResponse; +import io.sprucehill.mandrill.data.response.AnyListListResponse; + +/** + * @author Stephan Wienczny + */ +public class RejectsServiceTest extends AbstractTest { + private static final String EMAIL = "reject@test.com"; + + @Test + public void add() throws PreBuildError, IOException { + final IRejectsService rejectsService = mandrillServiceFactory.createRejectsService(); + + final AnyListAddResponse response = rejectsService.add( + new RejectsAddPayload.Builder().withEmail(EMAIL)); + + Assert.assertEquals(EMAIL, response.getEmail()); + Assert.assertTrue(response.isAdded()); + } + + @Test + public void delete() throws PreBuildError, IOException { + final IRejectsService rejectsService = mandrillServiceFactory.createRejectsService(); + + final AnyListDeleteResponse response = rejectsService.delete( + new RejectsDeletePayload.Builder().withEmail(EMAIL)); + + Assert.assertEquals(EMAIL, response.getEmail()); + Assert.assertTrue(response.isDeleted()); + } + + @Test + public void list() throws PreBuildError, IOException { + final IRejectsService rejectsService = mandrillServiceFactory.createRejectsService(); + + rejectsService.add(new RejectsAddPayload.Builder().withEmail(EMAIL)); + + final List response = rejectsService.list( + new RejectsListPayload.Builder().withEmail(EMAIL)); + + Assert.assertEquals(1, response.size()); + } +} diff --git a/src/test/java/io/sprucehill/mandrill/service/TemplateServiceTest.java b/src/test/java/io/sprucehill/mandrill/service/TemplateServiceTest.java new file mode 100644 index 0000000..dc6e16d --- /dev/null +++ b/src/test/java/io/sprucehill/mandrill/service/TemplateServiceTest.java @@ -0,0 +1,111 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.service; + +import java.io.IOException; + +import org.junit.Assert; +import org.junit.Test; + +import io.sprucehill.mandrill.AbstractTest; +import io.sprucehill.mandrill.data.error.PreBuildError; +import io.sprucehill.mandrill.data.error.RenderTemplateError; +import io.sprucehill.mandrill.data.request.TemplateAddPayload; +import io.sprucehill.mandrill.data.request.TemplateDeletePayload; +import io.sprucehill.mandrill.data.request.TemplateRenderPayload; +import io.sprucehill.mandrill.data.request.TemplateUpdatePayload; +import io.sprucehill.mandrill.data.response.TemplateResponse; + +/** + * @author Stephan Wienczny + */ +public class TemplateServiceTest extends AbstractTest { + private static final String TEMPLATE = "testtemplate" + System.currentTimeMillis(); + + @Test + public void add() throws PreBuildError, IOException { + final ITemplateService templateService = mandrillServiceFactory.createTemplateService(); + + try { + final TemplateResponse response = templateService.add( + new TemplateAddPayload.Builder().withName(TEMPLATE)); + + Assert.assertEquals(TEMPLATE, response.getName()); + } finally { + delete(); + } + + } + + @Test + public void update() throws PreBuildError, IOException { + final ITemplateService templateService = mandrillServiceFactory.createTemplateService(); + + try { + try { + templateService.add(new TemplateAddPayload.Builder().withName(TEMPLATE)); + } catch (final RenderTemplateError e) { + // Ignore + } + + final TemplateResponse response = templateService.update( + new TemplateUpdatePayload.Builder().withName(TEMPLATE)); + + Assert.assertEquals(TEMPLATE, response.getName()); + } finally { + delete(); + } + } + + + @Test + public void render() throws PreBuildError, IOException { + final ITemplateService templateService = mandrillServiceFactory.createTemplateService(); + + try { + try { + templateService.add(new TemplateAddPayload.Builder().withName(TEMPLATE)); + } catch (final RenderTemplateError e) { + // Ignore + } + + final String response = templateService.render( + new TemplateRenderPayload.Builder().withTemplateName(TEMPLATE)); + } finally { + delete(); + } + + //Assert.assertFalse(response.isEmpty()); + //Assert.assertEquals(EMAIL, response.getEmail()); + //Assert.assertEquals(MessageResponse.Status.SENT, response.getStatus()); + } + + public void delete() throws PreBuildError, IOException { + final ITemplateService templateService = mandrillServiceFactory.createTemplateService(); + + try { + final TemplateResponse response = templateService.delete( + new TemplateDeletePayload.Builder().withName(TEMPLATE)); + } catch (RenderTemplateError ex) { + // Ignore + } + + //Assert.assertFalse(response.isEmpty()); + //Assert.assertEquals(EMAIL, response.getEmail()); + //Assert.assertEquals(MessageResponse.Status.SENT, response.getStatus()); + } +} diff --git a/src/test/java/io/sprucehill/mandrill/service/WhitelistsServiceTest.java b/src/test/java/io/sprucehill/mandrill/service/WhitelistsServiceTest.java new file mode 100644 index 0000000..d447e32 --- /dev/null +++ b/src/test/java/io/sprucehill/mandrill/service/WhitelistsServiceTest.java @@ -0,0 +1,73 @@ +/* +Copyright 2013-2014 SpruceHill.io GmbH 2014 Stephan Wienczny + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package io.sprucehill.mandrill.service; + +import java.io.IOException; +import java.util.List; + +import org.junit.Assert; +import org.junit.Test; + +import io.sprucehill.mandrill.AbstractTest; +import io.sprucehill.mandrill.data.error.PreBuildError; +import io.sprucehill.mandrill.data.request.WhitelistsAddPayload; +import io.sprucehill.mandrill.data.request.WhitelistsDeletePayload; +import io.sprucehill.mandrill.data.request.WhitelistsListPayload; +import io.sprucehill.mandrill.data.response.AnyListAddResponse; +import io.sprucehill.mandrill.data.response.AnyListDeleteResponse; +import io.sprucehill.mandrill.data.response.AnyListListResponse; + +/** + * @author Stephan Wienczny + */ +public class WhitelistsServiceTest extends AbstractTest { + private static final String EMAIL = "whitelist@test.com"; + + @Test + public void add() throws PreBuildError, IOException { + final IWhitelistsService whitelistsService = mandrillServiceFactory.createWhitelistsService(); + + final AnyListAddResponse response = whitelistsService.add( + new WhitelistsAddPayload.Builder().withEmail(EMAIL)); + + Assert.assertEquals(EMAIL, response.getEmail()); + Assert.assertTrue(response.isAdded()); + } + + @Test + public void delete() throws PreBuildError, IOException { + final IWhitelistsService whitelistsService = mandrillServiceFactory.createWhitelistsService(); + + final AnyListDeleteResponse response = whitelistsService.delete( + new WhitelistsDeletePayload.Builder().withEmail(EMAIL)); + + Assert.assertEquals(EMAIL, response.getEmail()); + Assert.assertTrue(response.isDeleted()); + } + + @Test + public void list() throws PreBuildError, IOException { + final IWhitelistsService whitelistsService = mandrillServiceFactory.createWhitelistsService(); + + whitelistsService.add(new WhitelistsAddPayload.Builder().withEmail(EMAIL)); + + final List response = whitelistsService.list( + new WhitelistsListPayload.Builder().withEmail(EMAIL)); + + Assert.assertEquals(1, response.size()); + } +}