All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.zandero.mail.service.sendgrid.Attachments Maven / Gradle / Ivy

There is a newer version: 1.1.1
Show newest version
package com.zandero.mail.service.sendgrid;

import com.fasterxml.jackson.annotation.JsonIgnoreType;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.apache.commons.codec.binary.Base64;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * An attachment object.
 */
@JsonInclude(Include.NON_DEFAULT)
public class Attachments {
  
  /** The attachment content. */
  @JsonProperty("content") private String content;

  /** 
   * The mime type of the content you are attaching. For example, 
   * “text/plain” or “text/html”. 
   */
  @JsonProperty("type") private String type;

  /** The attachment file name. */
  @JsonProperty("filename") private String filename;

  /** The attachment disposition. */
  @JsonProperty("disposition") private String disposition;

  /** 
   * The attachment content ID. This is used when the 
   * disposition is set to “inline” and the attachment 
   * is an image, allowing the file to be displayed within 
   * the body of your email. 
   */
  @JsonProperty("content_id") private String contentId;

  /**
   * Get the attachment's content.
   * @return the content.
   */
  @JsonProperty("content") 
  public String getContent() {
    return content;
  }

  /**
   * Set the attachment's content.
   * @param content the content.
   */
  public void setContent(String content) {
    this.content = content;
  }
  
  /**
   * Get the mime type of the content you are attaching. For example, 
   * “text/plain” or “text/html”.
   * @return the mime type.
   */
  @JsonProperty("type") 
  public String getType() {
    return type;
  }
  
  /**
   * Set the mime type of the content.
   * @param type the mime type.
   */
  public void setType(String type) {
    this.type = type;
  }

  /**
   * Get the filename for this attachment.
   * @return the file name.
   */
  @JsonProperty("filename") 
  public String getFilename() {
    return filename;
  }
  
  /**
   * Set the filename for this attachment.
   * @param filename the filename.
   */
  public void setFilename(String filename) {
    this.filename = filename;
  }
  
  /**
   * Get the content-disposition of the attachment specifying 
   * how you would like the attachment to be displayed. 
   * For example, “inline” results in the attached file 
   * being displayed automatically within the message 
   * while “attachment” results in the attached file 
   * requiring some action to be taken before it is 
   * displayed (e.g. opening or downloading the file).
   * @return the disposition.
   */
  @JsonProperty("disposition") 
  public String getDisposition() {
    return disposition;
  }
  
  /**
   * Set the content-disposition of the attachment.
   * @param disposition the disposition.
   */
  public void setDisposition(String disposition) {
    this.disposition = disposition;
  }

  /**
   * Get the attachment content ID. This is used when the 
   * disposition is set to “inline” and the attachment 
   * is an image, allowing the file to be displayed within 
   * the body of your email. 
   * @return the content ID.
   */
  @JsonProperty("content_id") 
  public String getContentId() {
    return contentId;
  }
  
  /**
   * Set the content ID.
   * @param contentId the content ID.
   */
  public void setContentId(String contentId) {
    this.contentId = contentId;
  }

  /**
   * A helper object to construct usable attachments.
   */
  @JsonIgnoreType
  public static class Builder {

    private static final int BYTE_BUFFER_SIZE = 4096;

    private String fileName;
    private String content;
    private String type;
    private String disposition;
    private String contentId;

    /**
     * Construct a new attachment builder.
     * @param fileName the filename to include.
     * @param content an input stream for the content.
     * @throws IllegalArgumentException in case either the fileName or the content is null.
     */
    public Builder(String fileName, InputStream content) {
      if (fileName == null) {
        throw new IllegalArgumentException("File name mustn't be null");
      }

      if (content == null) {
        throw new IllegalArgumentException("Content mustn't be null");
      }

      this.fileName = fileName;
      this.content = encodeToBase64(content);
    }

    /**
     * Construct a new attachment builder.
     * @param fileName the filename to include.
     * @param content an input string for the content.
     * @throws IllegalArgumentException in case either the fileName or the content is null.
     */
    public Builder(String fileName, String content) {
      if (fileName == null) {
        throw new IllegalArgumentException("File name mustn't be null");
      }

      if (content == null) {
        throw new IllegalArgumentException("Content mustn't be null");
      }

      this.fileName = fileName;
      this.content = content;
    }

    private String encodeToBase64(InputStream content) {
      int read = 0;
      byte[] bytes = new byte[BYTE_BUFFER_SIZE];
      try(ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
        while ((read = content.read(bytes)) != -1) {
          baos.write(bytes, 0, read);
        }

        return Base64.encodeBase64String(baos.toByteArray());
      } catch (IOException e) {
        throw new RuntimeException("Unable to convert content stream to base 64 encoded string", e);
      }
    }

    /**
     * Set the type of this attachment builder.
     * @param type the attachment type.
     * @return self
     */
    public Builder withType(String type) {
      this.type = type;
      return this;
    }

    /**
     * Set the disposition of this attachment builder.
     * @param disposition the disposition.
     * @return self
     */
    public Builder withDisposition(String disposition) {
      this.disposition = disposition;
      return this;
    }

    /**
     * Set the content ID of this attachment builder.
     * @param contentId the content ID.
     * @return self
     */
    public Builder withContentId(String contentId) {
      this.contentId = contentId;
      return this;
    }

    /**
     * Construct the attachments object.
     * @return attachments object
     */
    public Attachments build() {
      Attachments attachments = new Attachments();
      attachments.setContent(content);
      attachments.setFilename(fileName);
      attachments.setDisposition(disposition);
      attachments.setContentId(contentId);
      attachments.setType(type);
      return attachments;
    }
  }

  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((content == null) ? 0 : content.hashCode());
    result = prime * result + ((contentId == null) ? 0 : contentId.hashCode());
    result = prime * result + ((disposition == null) ? 0 : disposition.hashCode());
    result = prime * result + ((filename == null) ? 0 : filename.hashCode());
    result = prime * result + ((type == null) ? 0 : type.hashCode());
    return result;
  }

  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    Attachments other = (Attachments) obj;
    if (content == null) {
      if (other.content != null)
        return false;
    } else if (!content.equals(other.content))
      return false;
    if (contentId == null) {
      if (other.contentId != null)
        return false;
    } else if (!contentId.equals(other.contentId))
      return false;
    if (disposition == null) {
      if (other.disposition != null)
        return false;
    } else if (!disposition.equals(other.disposition))
      return false;
    if (filename == null) {
      if (other.filename != null)
        return false;
    } else if (!filename.equals(other.filename))
      return false;
    if (type == null) {
      if (other.type != null)
        return false;
    } else if (!type.equals(other.type))
      return false;
    return true;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy