package com.brightgenerous.mail; import static com.brightgenerous.commons.ObjectUtils.*; import java.io.Serializable; import java.lang.ref.SoftReference; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Properties; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import com.brightgenerous.commons.EqualsUtils; import com.brightgenerous.commons.HashCodeUtils; import com.brightgenerous.commons.ToStringUtils; import com.brightgenerous.mail.delegate.MailUtility; @SuppressWarnings("deprecation") public class MailUtils implements Serializable { private static final long serialVersionUID = 7750160617839472845L; public static boolean useful() { return MailUtility.USEFUL; } static class InstanceKey implements Serializable { private static final long serialVersionUID = -5571606798438371038L; private final String smtpHost; private final Integer smtpPort; private final Long timeout; private final String user; private final String host; public InstanceKey(String smtpHost, Integer smtpPort, Long timeout, String user, String host) { this.smtpHost = smtpHost; this.smtpPort = smtpPort; this.timeout = timeout; this.user = user; this.host = host; } @Override public int hashCode() { final int multiplier = 37; int result = 17; result = (multiplier * result) + hashCodeEscapeNull(smtpHost); result = (multiplier * result) + hashCodeEscapeNull(smtpPort); result = (multiplier * result) + hashCodeEscapeNull(timeout); result = (multiplier * result) + hashCodeEscapeNull(user); result = (multiplier * result) + hashCodeEscapeNull(host); return result; } @Override public boolean equals(Object obj) { if (obj == null) { return false; } if (!(obj instanceof InstanceKey)) { return false; } InstanceKey other = (InstanceKey) obj; if (!equalsEscapeNull(smtpHost, other.smtpHost)) { return false; } if (!equalsEscapeNull(smtpPort, other.smtpPort)) { return false; } if (!equalsEscapeNull(timeout, other.timeout)) { return false; } if (!equalsEscapeNull(user, other.user)) { return false; } if (!equalsEscapeNull(host, other.host)) { return false; } return true; } } private final Properties prop; protected MailUtils(String smtpHost, Integer smtpPort, Long timeout, String user, String host) { prop = new Properties(); if (smtpHost != null) { prop.setProperty("mail.smtp.host", smtpHost); prop.setProperty("mail.host", smtpHost); } if (smtpPort != null) { prop.setProperty("mail.smtp.port", String.format("%d", smtpPort)); } if (timeout != null) { prop.setProperty("mail.smtp.connectiontimeout", String.format("%d", timeout)); prop.setProperty("mail.smtp.timeout", String.format("%d", timeout)); } if (user != null) { prop.setProperty("mail.user", user); } if (host != null) { prop.setProperty("mail.host", host); } } public static MailUtils get(String smtpHost, Integer smtpPort, Long timeout, String user, String host) { return getInstance(smtpHost, smtpPort, timeout, user, host); } private static volatile Map<InstanceKey, SoftReference<MailUtils>> cache; private static MailUtils getInstance(String smtpHost, Integer smtpPort, Long timeout, String user, String host) { if (cache == null) { synchronized (MailUtils.class) { if (cache == null) { cache = new ConcurrentHashMap<>(); } } } InstanceKey ik = new InstanceKey(smtpHost, smtpPort, timeout, user, host); SoftReference<MailUtils> sr = cache.get(ik); MailUtils ret; if (sr != null) { ret = sr.get(); if (ret != null) { return ret; } Set<InstanceKey> dels = new HashSet<>(); for (Entry<InstanceKey, SoftReference<MailUtils>> entry : cache.entrySet()) { if (entry.getValue().get() == null) { dels.add(entry.getKey()); } } for (InstanceKey del : dels) { cache.remove(del); } } ret = new MailUtils(smtpHost, smtpPort, timeout, user, host); cache.put(ik, new SoftReference<>(ret)); return ret; } public void send(MailInfo info) throws MailException { send(prop, info); } public static void send(Properties prop, MailInfo info) throws MailException { MailUtility.send(prop, info); } @Override public int hashCode() { if (HashCodeUtils.resolved()) { return HashCodeUtils.hashCodeAlt(null, this); } return super.hashCode(); } @Override public boolean equals(Object obj) { if (EqualsUtils.resolved()) { return EqualsUtils.equalsAlt(null, this, obj); } return super.equals(obj); } @Override public String toString() { if (ToStringUtils.resolved()) { return ToStringUtils.toStringAlt(this); } return super.toString(); } }