Skip to content

Commit a99f74c

Browse files
committed
#70 Added defensive null/empty checks to Fail Fast (http://wiki.c2.com/?FailFast)
1 parent 1885c69 commit a99f74c

File tree

8 files changed

+114
-46
lines changed

8 files changed

+114
-46
lines changed

Diff for: src/main/java/org/simplejavamail/converter/EmailConverter.java

+21-11
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import static java.nio.charset.StandardCharsets.UTF_8;
3131
import static org.simplejavamail.converter.internal.mimemessage.MimeMessageHelper.produceMimeMessage;
3232
import static org.simplejavamail.internal.util.MiscUtil.extractCID;
33+
import static org.simplejavamail.internal.util.Preconditions.checkNonEmptyArgument;
3334

3435
/**
3536
* Utility to help convert {@link org.simplejavamail.email.Email} instances to other formats (MimeMessage, EML etc.) and vice versa.
@@ -47,7 +48,7 @@ private EmailConverter() {
4748
public static Email mimeMessageToEmail(@Nonnull final MimeMessage mimeMessage) {
4849
final Email email = new Email(false);
4950
try {
50-
fillEmailFromMimeMessage(email, mimeMessage);
51+
fillEmailFromMimeMessage(email, checkNonEmptyArgument(mimeMessage, "mimeMessage"));
5152
} catch (MessagingException | IOException e) {
5253
throw new EmailConverterException(format(EmailConverterException.PARSE_ERROR_MIMEMESSAGE, e.getMessage()), e);
5354
}
@@ -59,7 +60,8 @@ public static Email mimeMessageToEmail(@Nonnull final MimeMessage mimeMessage) {
5960
*/
6061
public static Email outlookMsgToEmail(@Nonnull final String msgData) {
6162
final Email email = new Email(false);
62-
fillEmailFromOutlookMessage(email, OutlookMessageParser.parseOutlookMsg(msgData));
63+
OutlookMessage outlookMessage = OutlookMessageParser.parseOutlookMsg(checkNonEmptyArgument(msgData, "msgData"));
64+
fillEmailFromOutlookMessage(email, outlookMessage);
6365
return email;
6466
}
6567

@@ -68,7 +70,8 @@ public static Email outlookMsgToEmail(@Nonnull final String msgData) {
6870
*/
6971
public static Email outlookMsgToEmail(@Nonnull final File msgfile) {
7072
final Email email = new Email(false);
71-
fillEmailFromOutlookMessage(email, OutlookMessageParser.parseOutlookMsg(msgfile));
73+
OutlookMessage outlookMessage = OutlookMessageParser.parseOutlookMsg(checkNonEmptyArgument(msgfile, "msgfile"));
74+
fillEmailFromOutlookMessage(email, outlookMessage);
7275
return email;
7376
}
7477

@@ -77,12 +80,15 @@ public static Email outlookMsgToEmail(@Nonnull final File msgfile) {
7780
*/
7881
public static Email outlookMsgToEmail(@Nonnull final InputStream msgInputStream) {
7982
final Email email = new Email(false);
80-
fillEmailFromOutlookMessage(email, OutlookMessageParser.parseOutlookMsg(msgInputStream));
83+
OutlookMessage outlookMessage = OutlookMessageParser.parseOutlookMsg(checkNonEmptyArgument(msgInputStream, "msgInputStream"));
84+
fillEmailFromOutlookMessage(email, outlookMessage);
8185
return email;
8286
}
8387

8488
private static void fillEmailFromMimeMessage(@Nonnull final Email email, @Nonnull final MimeMessage mimeMessage)
8589
throws MessagingException, IOException {
90+
checkNonEmptyArgument(email, "email");
91+
checkNonEmptyArgument(mimeMessage, "mimeMessage");
8692
final MimeMessageParser parser = new MimeMessageParser(mimeMessage).parse();
8793
final InternetAddress from = parser.getFrom();
8894
email.setFromAddress(from.getPersonal(), from.getAddress());
@@ -113,6 +119,8 @@ private static void fillEmailFromMimeMessage(@Nonnull final Email email, @Nonnul
113119
}
114120

115121
private static void fillEmailFromOutlookMessage(@Nonnull final Email email, @Nonnull final OutlookMessage outlookMessage) {
122+
checkNonEmptyArgument(email, "email");
123+
checkNonEmptyArgument(outlookMessage, "outlookMessage");
116124
email.setFromAddress(outlookMessage.getFromName(), outlookMessage.getFromEmail());
117125
if (!MiscUtil.valueNullOrEmpty(outlookMessage.getReplyToEmail())) {
118126
email.setReplyToAddress(outlookMessage.getReplyToName(), outlookMessage.getReplyToEmail());
@@ -145,15 +153,15 @@ private static void fillEmailFromOutlookMessage(@Nonnull final Email email, @Non
145153
* @see #emailToMimeMessage(Email, Session)
146154
*/
147155
public static MimeMessage emailToMimeMessage(@Nonnull final Email email) {
148-
return emailToMimeMessage(email, createDummySession());
156+
return emailToMimeMessage(checkNonEmptyArgument(email, "email"), createDummySession());
149157
}
150158

151159
/**
152160
* Refer to {@link MimeMessageHelper#produceMimeMessage(Email, Session)}
153161
*/
154162
public static MimeMessage emailToMimeMessage(@Nonnull final Email email, @Nonnull final Session session) {
155163
try {
156-
return produceMimeMessage(email, session);
164+
return produceMimeMessage(checkNonEmptyArgument(email, "email"), checkNonEmptyArgument(session, "session"));
157165
} catch (UnsupportedEncodingException | MessagingException e) {
158166
// this should never happen, so we don't acknowledge this exception (and simply bubble up)
159167
throw new RuntimeException(e.getMessage(), e);
@@ -163,10 +171,10 @@ public static MimeMessage emailToMimeMessage(@Nonnull final Email email, @Nonnul
163171
/**
164172
* @return The result of {@link MimeMessage#writeTo(OutputStream)} which should be in the standard EML format.
165173
*/
166-
public static String mimeMessageToEML(@Nonnull final MimeMessage message) {
174+
public static String mimeMessageToEML(@Nonnull final MimeMessage mimeMessage) {
167175
final ByteArrayOutputStream os = new ByteArrayOutputStream();
168176
try {
169-
message.writeTo(os);
177+
checkNonEmptyArgument(mimeMessage, "mimeMessage").writeTo(os);
170178
return os.toString(UTF_8.name());
171179
} catch (IOException | MessagingException e) {
172180
// this should never happen, so we don't acknowledge this exception (and simply bubble up)
@@ -180,7 +188,7 @@ public static String mimeMessageToEML(@Nonnull final MimeMessage message) {
180188
* @see #emailToMimeMessage(Email, Session)
181189
*/
182190
public static String emailToEML(@Nonnull final Email email) {
183-
return mimeMessageToEML(emailToMimeMessage(email));
191+
return mimeMessageToEML(emailToMimeMessage(checkNonEmptyArgument(email, "email")));
184192
}
185193

186194
/**
@@ -189,13 +197,15 @@ public static String emailToEML(@Nonnull final Email email) {
189197
* @see #emailToMimeMessage(Email, Session)
190198
*/
191199
public static MimeMessage emlToMimeMessage(@Nonnull final String eml) {
192-
return emlToMimeMessage(createDummySession(), eml);
200+
return emlToMimeMessage(createDummySession(), checkNonEmptyArgument(eml, "eml"));
193201
}
194202

195203
/**
196204
* Relies on JavaMail's native parser of EML data, {@link MimeMessage#MimeMessage(Session, InputStream)}.
197205
*/
198206
public static MimeMessage emlToMimeMessage(@Nonnull final Session session, @Nonnull final String eml) {
207+
checkNonEmptyArgument(session, "session");
208+
checkNonEmptyArgument(eml, "eml");
199209
try {
200210
return new MimeMessage(session, new ByteArrayInputStream(eml.getBytes(UTF_8)));
201211
} catch (final MessagingException e) {
@@ -208,7 +218,7 @@ public static MimeMessage emlToMimeMessage(@Nonnull final Session session, @Nonn
208218
* #mimeMessageToEmail(MimeMessage)};
209219
*/
210220
public static Email emlToEmail(@Nonnull final String eml) {
211-
final MimeMessage mimeMessage = emlToMimeMessage(createDummySession(), eml);
221+
final MimeMessage mimeMessage = emlToMimeMessage(createDummySession(), checkNonEmptyArgument(eml, "eml"));
212222
return mimeMessageToEmail(mimeMessage);
213223
}
214224

Diff for: src/main/java/org/simplejavamail/email/Email.java

+24-9
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import java.util.*;
1313

1414
import static org.simplejavamail.internal.util.MiscUtil.valueNullOrEmpty;
15+
import static org.simplejavamail.internal.util.Preconditions.checkNonEmptyArgument;
1516
import static org.simplejavamail.util.ConfigLoader.Property.*;
1617
import static org.simplejavamail.util.ConfigLoader.getProperty;
1718
import static org.simplejavamail.util.ConfigLoader.hasProperty;
@@ -117,9 +118,9 @@ public Email(final boolean readFromDefaults) {
117118
@SuppressWarnings("WeakerAccess")
118119
public void signWithDomainKey(@Nonnull final File dkimPrivateKeyFile, @Nonnull final String signingDomain, @Nonnull final String selector) {
119120
this.applyDKIMSignature = true;
120-
this.dkimPrivateKeyFile = dkimPrivateKeyFile;
121-
this.signingDomain = signingDomain;
122-
this.selector = selector;
121+
this.dkimPrivateKeyFile = checkNonEmptyArgument(dkimPrivateKeyFile, "dkimPrivateKeyFile");
122+
this.signingDomain = checkNonEmptyArgument(signingDomain, "signingDomain");
123+
this.selector = checkNonEmptyArgument(selector, "selector");
123124
}
124125

125126
/**
@@ -140,9 +141,9 @@ public void signWithDomainKey(@Nonnull final File dkimPrivateKeyFile, @Nonnull f
140141
@SuppressWarnings("WeakerAccess")
141142
public void signWithDomainKey(@Nonnull final InputStream dkimPrivateKeyInputStream, @Nonnull final String signingDomain, @Nonnull final String selector) {
142143
this.applyDKIMSignature = true;
143-
this.dkimPrivateKeyInputStream = dkimPrivateKeyInputStream;
144-
this.signingDomain = signingDomain;
145-
this.selector = selector;
144+
this.dkimPrivateKeyInputStream = checkNonEmptyArgument(dkimPrivateKeyInputStream, "dkimPrivateKeyInputStream");
145+
this.signingDomain = checkNonEmptyArgument(signingDomain, "signingDomain");
146+
this.selector = checkNonEmptyArgument(selector, "selector");
146147
}
147148

148149
/**
@@ -152,7 +153,7 @@ public void signWithDomainKey(@Nonnull final InputStream dkimPrivateKeyInputStre
152153
* @param fromAddress The sender's email address.
153154
*/
154155
public void setFromAddress(@Nullable final String name, @Nonnull final String fromAddress) {
155-
fromRecipient = new Recipient(name, fromAddress, null);
156+
fromRecipient = new Recipient(name, checkNonEmptyArgument(fromAddress, "fromAddress"), null);
156157
}
157158

158159
/**
@@ -162,14 +163,14 @@ public void setFromAddress(@Nullable final String name, @Nonnull final String fr
162163
* @param replyToAddress The replied-to-receiver email address.
163164
*/
164165
public void setReplyToAddress(@Nullable final String name, @Nonnull final String replyToAddress) {
165-
replyToRecipient = new Recipient(name, replyToAddress, null);
166+
replyToRecipient = new Recipient(name, checkNonEmptyArgument(replyToAddress, "replyToAddress"), null);
166167
}
167168

168169
/**
169170
* Bean setter for {@link #subject}.
170171
*/
171172
public void setSubject(@Nonnull final String subject) {
172-
this.subject = subject;
173+
this.subject = checkNonEmptyArgument(subject, "subject");
173174
}
174175

175176
/**
@@ -197,6 +198,8 @@ public void setTextHTML(@Nullable final String textHTML) {
197198
* @see RecipientType
198199
*/
199200
public void addRecipient(@Nullable final String name, @Nonnull final String address, @Nonnull final RecipientType type) {
201+
checkNonEmptyArgument(address, "address");
202+
checkNonEmptyArgument(type, "type");
200203
recipients.add(new Recipient(name, address, type));
201204
}
202205

@@ -211,6 +214,9 @@ public void addRecipient(@Nullable final String name, @Nonnull final String addr
211214
* @see #addEmbeddedImage(String, DataSource)
212215
*/
213216
public void addEmbeddedImage(@Nonnull final String name, @Nonnull final byte[] data, @Nonnull final String mimetype) {
217+
checkNonEmptyArgument(name, "name");
218+
checkNonEmptyArgument(data, "data");
219+
checkNonEmptyArgument(mimetype, "mimetype");
214220
final ByteArrayDataSource dataSource = new ByteArrayDataSource(data, mimetype);
215221
dataSource.setName(name);
216222
addEmbeddedImage(name, dataSource);
@@ -224,6 +230,7 @@ public void addEmbeddedImage(@Nonnull final String name, @Nonnull final byte[] d
224230
*/
225231
@SuppressWarnings("WeakerAccess")
226232
public void addEmbeddedImage(@Nullable final String name, @Nonnull final DataSource imagedata) {
233+
checkNonEmptyArgument(imagedata, "imagedata");
227234
if (valueNullOrEmpty(name) && valueNullOrEmpty(imagedata.getName())) {
228235
throw new EmailException(EmailException.NAME_MISSING_FOR_EMBEDDED_IMAGE);
229236
}
@@ -239,6 +246,8 @@ public void addEmbeddedImage(@Nullable final String name, @Nonnull final DataSou
239246
*/
240247
@SuppressWarnings("WeakerAccess")
241248
public void addHeader(@Nonnull final String name, @Nonnull final Object value) {
249+
checkNonEmptyArgument(name, "name");
250+
checkNonEmptyArgument(value, "value");
242251
headers.put(name, String.valueOf(value));
243252
}
244253

@@ -253,6 +262,10 @@ public void addHeader(@Nonnull final String name, @Nonnull final Object value) {
253262
* @see #addAttachment(String, DataSource)
254263
*/
255264
public void addAttachment(@Nonnull final String name, @Nonnull final byte[] data, @Nonnull final String mimetype) {
265+
checkNonEmptyArgument(name, "name");
266+
checkNonEmptyArgument(data, "data");
267+
checkNonEmptyArgument(mimetype, "mimetype");
268+
256269
final ByteArrayDataSource dataSource = new ByteArrayDataSource(data, mimetype);
257270
dataSource.setName(MiscUtil.encodeText(name));
258271
addAttachment(MiscUtil.encodeText(name), dataSource);
@@ -265,6 +278,7 @@ public void addAttachment(@Nonnull final String name, @Nonnull final byte[] data
265278
* @param filedata The attachment data.
266279
*/
267280
public void addAttachment(@Nullable final String name, @Nonnull final DataSource filedata) {
281+
checkNonEmptyArgument(filedata, "filedata");
268282
attachments.add(new AttachmentResource(MiscUtil.encodeText(name), filedata));
269283
}
270284

@@ -383,6 +397,7 @@ public String toString() {
383397
* @param builder The builder from which to create the email.
384398
*/
385399
Email(@Nonnull final EmailBuilder builder) {
400+
checkNonEmptyArgument(builder, "builder");
386401
recipients = builder.getRecipients();
387402
embeddedImages = builder.getEmbeddedImages();
388403
attachments = builder.getAttachments();

0 commit comments

Comments
 (0)