1 /*****************************************************************
2 * Licensed to the Apache Software Foundation (ASF) under one *
3 * or more contributor license agreements. See the NOTICE file *
4 * distributed with this work for additional information *
5 * regarding copyright ownership. The ASF licenses this file *
6 * to you under the Apache License, Version 2.0 (the *
7 * "License"); you may not use this file except in compliance *
8 * with the License. You may obtain a copy of the License at *
9 * *
10 * http://www.apache.org/licenses/LICENSE-2.0 *
11 * *
12 * Unless required by applicable law or agreed to in writing, *
13 * software distributed under the License is distributed on an *
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
15 * KIND, either express or implied. See the License for the *
16 * specific language governing permissions and limitations *
17 * under the License. *
18 ****************************************************************/
19 package org.apache.james.postage.mail;
20
21 import javax.mail.Message;
22 import javax.mail.MessagingException;
23 import javax.mail.Session;
24 import javax.mail.internet.MimeMessage;
25
26 import org.apache.commons.logging.Log;
27 import org.apache.commons.logging.LogFactory;
28 import org.apache.james.postage.configuration.MailSender;
29 import org.apache.james.postage.result.MailProcessingRecord;
30
31 /***
32 * prototype of a mail factory, only missing the use case specific data. <br/>
33 * it prepares the message with all Postage specific headers.<br/>
34 * @see DefaultMailFactory as a template implementation
35 */
36 public abstract class AbstractMailFactory {
37
38 private static Log log = LogFactory.getLog(DefaultMailFactory.class);
39
40 private static final char[] CHARSET = new char[]
41 {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
42 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
43 'u', 'v', 'w', 'x', 'y', 'z',
44 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
45 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
46 'U', 'V', 'W', 'X', 'Y', 'Z'};
47
48 public static char getRandomChar() {
49 return CHARSET[getRandomInt()];
50 }
51
52 private static int getRandomInt() {
53 return (int)(Math.random() * (double)(CHARSET.length - 1));
54 }
55
56 public static byte getRandomByte() {
57 return (byte)(Math.random() * 255);
58 }
59
60 public AbstractMailFactory() {
61 super();
62 }
63
64 /***
65 * generates a mail containing data common to all test mails: postage headers,
66 */
67 public Message createMail(Session mailSession, MailSender mailSender, MailProcessingRecord mailProcessingRecord) {
68
69 MimeMessage message = new MimeMessage(mailSession);
70
71 try {
72 message.addHeader(HeaderConstants.JAMES_POSTAGE_HEADER, "This is a test mail sent by James Postage");
73 message.addHeader(HeaderConstants.JAMES_POSTAGE_VALIDATORCLASSNAME_HEADER, getValidatorClass().getName());
74 message.setSubject(mailSender.getSubject());
75 message.addHeader("Message-ID", "Postage-" + System.currentTimeMillis());
76 mailProcessingRecord.setSubject(mailSender.getSubject());
77
78 if (mailProcessingRecord.getMailId() != null) {
79 message.addHeader(HeaderConstants.MAIL_ID_HEADER, mailProcessingRecord.getMailId());
80 } else {
81 log.warn("ID header is NULL!");
82 throw new RuntimeException("could not create mail with ID = NULL");
83 }
84
85 populateMessage(message, mailSender, mailProcessingRecord);
86
87 } catch (MessagingException e) {
88 mailProcessingRecord.setErrorTextSending(e.toString());
89 log.error("mail could not be created", e);
90 return null;
91 }
92 return message;
93 }
94
95 /***
96 * here, the test case specific data must be added to the message.
97 * @param message
98 * @param mailSender
99 * @param mailProcessingRecord
100 * @throws MessagingException
101 */
102 abstract protected void populateMessage(MimeMessage message, MailSender mailSender, MailProcessingRecord mailProcessingRecord) throws MessagingException;
103
104 /***
105 * the class representing the validator
106 *
107 * @return validator class
108 */
109 abstract protected Class getValidatorClass();
110
111 protected int generateRandomPartSize(int sizeMin, int sizeMax) {
112 return (int)(Math.random() * (double)(sizeMax - sizeMin)) + sizeMin;
113 }
114
115 }