java/Postak/src/cz/frantovo/postak/HromadnaZprava.java
author František Kučera <franta-hg@frantovo.cz>
Mon Apr 23 00:24:31 2012 +0200 (2012-04-23)
changeset 17 9cb46ca7e26c
parent 13 b15d81be8af3
permissions -rw-r--r--
#4 multipart/alternative zprávy: XHTML + prostý text (generuje se pomocí XSLT)
     1 package cz.frantovo.postak;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Collection;
     5 import java.util.logging.Level;
     6 import java.util.logging.Logger;
     7 import javax.mail.internet.InternetAddress;
     8 
     9 /**
    10  * Hromadná zpráva. Umí se rozdělit i na více dílčích zpráv,
    11  * které se vejdou do limitu příjemců SMTP serveru.
    12  *
    13  * @author fiki
    14  */
    15 public class HromadnaZprava implements Cloneable {
    16 
    17 	public enum FORMÁT {
    18 
    19 		XHTML,
    20 		PROSTÝ_TEXT,
    21 		OBOJE
    22 	}
    23 	private static final Logger log = Logger.getLogger(HromadnaZprava.class.getName());
    24 	/** Předmět zprávy */
    25 	private String predmet;
    26 	/** Adresa a případně jméno odesílatele */
    27 	private InternetAddress odesilatel;
    28 	/** Zda má být zpráva odeslána jako HTML nebo prostý text */
    29 	private FORMÁT formát = FORMÁT.PROSTÝ_TEXT;
    30 	/** Tělo zprávy - prostý text */
    31 	private String text;
    32 	/** Všichni příjemci této zprávy */
    33 	private ArrayList<InternetAddressKomu> prijemci = new ArrayList<InternetAddressKomu>();
    34 	/** Hlavička Reply-to */
    35 	private InternetAddress odpovedetKomu;
    36 
    37 	public String getPredmet() {
    38 		return predmet;
    39 	}
    40 
    41 	public void setPredmet(String predmet) {
    42 		this.predmet = predmet;
    43 	}
    44 
    45 	public InternetAddress getOdesilatel() {
    46 		return odesilatel;
    47 	}
    48 
    49 	public void setOdesilatel(InternetAddress odesilatel) {
    50 		this.odesilatel = odesilatel;
    51 	}
    52 
    53 	public String getText() {
    54 		return text;
    55 	}
    56 
    57 	public void setText(String text) {
    58 		this.text = text;
    59 	}
    60 
    61 	public ArrayList<InternetAddressKomu> getPrijemci() {
    62 		return prijemci;
    63 	}
    64 
    65 	/**
    66 	 * @param prijemci pokud je null, nastaví prázdná kolekce.
    67 	 */
    68 	public void setPrijemci(ArrayList<InternetAddressKomu> prijemci) {
    69 		this.prijemci = new ArrayList<InternetAddressKomu>();
    70 		pridejPrijemce(prijemci);
    71 	}
    72 
    73 	public void pridejPrijemce(Collection<InternetAddressKomu> prijemci) {
    74 		if (prijemci == null) {
    75 			log.log(Level.FINER, "Prázdná množina příjemců – nic nepřidáme");
    76 		} else {
    77 			this.prijemci.addAll(prijemci);
    78 		}
    79 	}
    80 
    81 	/**
    82 	 * Pokud má zpráva více přijemců, než je limit povolený SMTP serverem,
    83 	 * rozdělí se zpráva na více dílčích zpráv.
    84 	 *
    85 	 * @param limit maximální počet příjemců jedné zprávy (omezení SMTP serveru)
    86 	 */
    87 	public Collection<HromadnaZprava> getDilciZpravy(int limit) {
    88 		Collection<HromadnaZprava> zpravy = new ArrayList<HromadnaZprava>();
    89 
    90 		if (limit < getPrijemci().size()) {
    91 			/** Zprávu je potřeba rozdělit */
    92 			try {
    93 				HromadnaZprava dilciZprava = (HromadnaZprava) clone();
    94 				dilciZprava.setPrijemci(null);
    95 
    96 				ArrayList<InternetAddressKomu> vsichniPrijemci = getPrijemci();
    97 				for (InternetAddressKomu prijemce : vsichniPrijemci) {
    98 					dilciZprava.getPrijemci().add(prijemce);
    99 
   100 					if (dilciZprava.getPrijemci().size() == limit) {
   101 						zpravy.add(dilciZprava);
   102 						dilciZprava = (HromadnaZprava) clone();
   103 						dilciZprava.setPrijemci(null);
   104 					}
   105 				}
   106 
   107 				if (dilciZprava.getPrijemci().size() > 0) {
   108 					/**
   109 					 * Počet příjemců není násobkem limitu,
   110 					 * takže nakonci ještě někteří zbyli.
   111 					 * Z nich budou příjemci pro poslední dílčí zprávu.
   112 					 */
   113 					zpravy.add(dilciZprava);
   114 				}
   115 
   116 
   117 			} catch (CloneNotSupportedException ex) {
   118 				/** Tohle by nikdy nemělo nastat */
   119 				log.log(Level.SEVERE, "Hromandou zprávu se nepodařilo naklonovat - divné.", ex);
   120 				zpravy.add(this);
   121 			}
   122 		} else {
   123 			/** Zprávu má málo příjemců - můžeme ji odeslat najednou */
   124 			zpravy.add(this);
   125 		}
   126 
   127 		return zpravy;
   128 	}
   129 
   130 	public FORMÁT getFormát() {
   131 		return formát;
   132 	}
   133 
   134 	public void setFormatHTML(FORMÁT formát) {
   135 		this.formát = formát;
   136 	}
   137 
   138 	public InternetAddress getOdpovedetKomu() {
   139 		return odpovedetKomu;
   140 	}
   141 
   142 	/** Pokud je null, hlavička Reply-to se v e-mailu vůbec nenastaví. */
   143 	public void setOdpovedetKomu(InternetAddress odpovedetKomu) {
   144 		this.odpovedetKomu = odpovedetKomu;
   145 	}
   146 }