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