Skip to content

Commit dfcc68b

Browse files
committed
#260: Added lots of tests, fixed a name regarding naming and also with mimetype when loading image from classpath/disk
1 parent 8a187ea commit dfcc68b

File tree

20 files changed

+178
-159
lines changed

20 files changed

+178
-159
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
package org.simplejavamail.internal.util;
2+
3+
import javax.activation.MimetypesFileTypeMap;
4+
import java.io.ByteArrayInputStream;
5+
import java.io.IOException;
6+
import java.io.InputStream;
7+
8+
import static java.nio.charset.StandardCharsets.UTF_8;
9+
10+
class ImageMimeType {
11+
12+
private static final String MIMETYPES = "image/xpm xpm\n"
13+
+ "image/xbm xbm\n"
14+
+ "image/x-xwindowdump xwd\n"
15+
+ "image/x-xwd xwd\n"
16+
+ "image/x-xpixmap xpm pm\n"
17+
+ "image/x-xbm xbm\n"
18+
+ "image/x-xbitmap xbm\n"
19+
+ "image/x-windows-bmp bmp\n"
20+
+ "image/x-tiff tif tiff\n"
21+
+ "image/x-rgb rgb\n"
22+
+ "image/x-quicktime qtif qti qif\n"
23+
+ "image/x-portable-pixmap ppm\n"
24+
+ "image/x-portable-greymap pgm\n"
25+
+ "image/x-portable-graymap pgm\n"
26+
+ "image/x-portable-bitmap pbm\n"
27+
+ "image/x-portable-anymap pnm\n"
28+
+ "image/x-pict pct\n"
29+
+ "image/x-pcx pcx\n"
30+
+ "image/x-niff niff nif\n"
31+
+ "image/x-jps jps\n"
32+
+ "image/x-jg art\n"
33+
+ "image/x-icon ico\n"
34+
+ "image/x-generic jpg tif wmf tiff bmp xpm png jpeg emf\n"
35+
+ "image/x-eps eps\n"
36+
+ "image/x-dwg svf dxf dwg\n"
37+
+ "image/x-cmu-raster ras\n"
38+
+ "image/vnd.xiff xif\n"
39+
+ "image/vnd.wap.wbmp wbmp\n"
40+
+ "image/vnd.rn-realpix rp\n"
41+
+ "image/vnd.rn-realflash rf\n"
42+
+ "image/vnd.net-fpx fpx\n"
43+
+ "image/vnd.fpx fpx\n"
44+
+ "image/vnd.dwg svf dxf dwg\n"
45+
+ "image/vasa mcf\n"
46+
+ "image/tiff tif tiff\n"
47+
+ "image/svg+xml svgz svg\n"
48+
+ "image/png x-png png PNG\n"
49+
+ "image/pjpeg jpg jfif jpeg jpe\n"
50+
+ "image/pict pic pict\n"
51+
+ "image/naplps naplps nap\n"
52+
+ "image/jutvision jut\n"
53+
+ "image/jpeg jpg JPG jfif jpeg jfif-tbnl jpe\n"
54+
+ "image/ief iefs ief\n"
55+
+ "image/gif gif GIF\n"
56+
+ "image/g3fax g3\n"
57+
+ "image/florian flo turbot\n"
58+
+ "image/fif fif\n"
59+
+ "image/cmu-raster ras rast\n"
60+
+ "image/bmp bmp bm";
61+
62+
public static final MimetypesFileTypeMap IMAGE_MIMETYPES_FILE_TYPE_MAP = createMap();
63+
64+
/**
65+
* @return a vastly improved mimetype map
66+
*/
67+
private static MimetypesFileTypeMap createMap() {
68+
try (InputStream is = new ByteArrayInputStream(MIMETYPES.getBytes(UTF_8))) {
69+
return new MimetypesFileTypeMap(is);
70+
} catch (IOException ex) {
71+
throw new RuntimeException(ex);
72+
}
73+
}
74+
75+
public static String getContentType(String fileName) {
76+
return getContentType(fileName, null);
77+
}
78+
79+
public static String getContentType(String fileName, String charset) {
80+
String mimeType = IMAGE_MIMETYPES_FILE_TYPE_MAP.getContentType(fileName.toLowerCase());
81+
if (charset != null && (mimeType.startsWith("text/") || mimeType.contains("javascript"))) {
82+
mimeType += ";charset=" + charset.toLowerCase();
83+
}
84+
return mimeType;
85+
}
86+
}

modules/core-module/src/main/java/org/simplejavamail/internal/util/MiscUtil.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
import javax.activation.DataSource;
99
import javax.activation.FileDataSource;
10-
import javax.activation.FileTypeMap;
1110
import javax.activation.URLDataSource;
1211
import javax.mail.Message.RecipientType;
1312
import javax.mail.internet.AddressException;
@@ -278,20 +277,22 @@ public static ByteArrayInputStream copyInputstream(InputStream input) {
278277
}
279278

280279
@Nullable
281-
public static DataSource tryResolveFileDataSource(@Nullable final String baseDir, @Nullable final String baseClassPath, @NotNull final String srcLocation)
280+
public static DataSource tryResolveImageFileDataSource(@Nullable final String baseDir, @Nullable final String baseClassPath, @NotNull final String srcLocation)
282281
throws IOException {
283-
DataSource fileSource = tryResolveFileDataSourceFromDisk(baseDir, srcLocation);
282+
DataSource fileSource = tryResolveImageFileDataSourceFromDisk(baseDir, srcLocation);
284283
return (fileSource != null) ? fileSource : tryResolveFileDataSourceFromClassPath(baseClassPath, srcLocation);
285284
}
286285

287286
@Nullable
288-
private static DataSource tryResolveFileDataSourceFromDisk(final @Nullable String baseDir, final @NotNull String srcLocation) {
287+
private static DataSource tryResolveImageFileDataSourceFromDisk(final @Nullable String baseDir, final @NotNull String srcLocation) {
289288
File file = new File(srcLocation);
290289
if (!file.exists() && !file.isAbsolute()) {
291290
file = new File(ofNullable(baseDir).orElse("."), srcLocation);
292291
}
293292
if (file.exists()) {
294-
return new FileDataSource(file);
293+
final FileDataSource fileDataSource = new FileDataSource(file);
294+
fileDataSource.setFileTypeMap(ImageMimeType.IMAGE_MIMETYPES_FILE_TYPE_MAP);
295+
return fileDataSource;
295296
}
296297
return null;
297298
}
@@ -304,7 +305,7 @@ private static DataSource tryResolveFileDataSourceFromClassPath(final @Nullable
304305

305306
if (is != null) {
306307
try {
307-
final String mimeType = FileTypeMap.getDefaultFileTypeMap().getContentType(srcLocation);
308+
final String mimeType = ImageMimeType.getContentType(srcLocation);
308309
final ByteArrayDataSource ds = new ByteArrayDataSource(is, mimeType);
309310
// EMAIL-125: set the name of the DataSource to the normalized resource URL similar to other DataSource implementations, e.g. FileDataSource, URLDataSource
310311
ds.setName(MiscUtil.class.getResource(resourceName).toString());
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.simplejavamail.api.email;
1+
package org.simplejavamail.internal.util;
22

33
import org.jetbrains.annotations.Nullable;
44

@@ -13,7 +13,7 @@
1313
/**
1414
* Allows given datasource to be renamed (for {@code javax.activation.DataHandler} perspective).
1515
*/
16-
class NamedDataSource implements DataSource, EncodingAware {
16+
public class NamedDataSource implements DataSource, EncodingAware {
1717

1818
/**
1919
* Original data source used for attachment.

modules/simple-java-mail/src/main/java/org/simplejavamail/converter/internal/mimemessage/MimeMessageHelper.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package org.simplejavamail.converter.internal.mimemessage;
22

3+
import org.jetbrains.annotations.NotNull;
34
import org.simplejavamail.api.email.AttachmentResource;
45
import org.simplejavamail.api.email.Email;
56
import org.simplejavamail.api.email.Recipient;
67
import org.simplejavamail.internal.util.MiscUtil;
8+
import org.simplejavamail.internal.util.NamedDataSource;
79

810
import javax.activation.DataHandler;
911
import javax.activation.DataSource;
10-
import org.jetbrains.annotations.NotNull;
1112
import javax.mail.Address;
1213
import javax.mail.BodyPart;
1314
import javax.mail.Message;

modules/simple-java-mail/src/main/java/org/simplejavamail/converter/internal/mimemessage/NamedDataSource.java

Lines changed: 0 additions & 86 deletions
This file was deleted.

modules/simple-java-mail/src/main/java/org/simplejavamail/email/internal/EmailPopulatingBuilderImpl.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
44
import org.jetbrains.annotations.NotNull;
55
import org.jetbrains.annotations.Nullable;
6-
import org.simplejavamail.MailException;
76
import org.simplejavamail.api.email.AttachmentResource;
87
import org.simplejavamail.api.email.CalendarMethod;
98
import org.simplejavamail.api.email.Email;
@@ -17,6 +16,7 @@
1716
import org.simplejavamail.email.EmailBuilder;
1817
import org.simplejavamail.internal.util.CertificationUtil;
1918
import org.simplejavamail.internal.util.MiscUtil;
19+
import org.simplejavamail.internal.util.NamedDataSource;
2020

2121
import javax.activation.DataSource;
2222
import javax.mail.Message.RecipientType;
@@ -85,7 +85,7 @@
8585
import static org.simplejavamail.internal.util.MiscUtil.extractEmailAddresses;
8686
import static org.simplejavamail.internal.util.MiscUtil.randomCid10;
8787
import static org.simplejavamail.internal.util.MiscUtil.resolveUrlDataSource;
88-
import static org.simplejavamail.internal.util.MiscUtil.tryResolveFileDataSource;
88+
import static org.simplejavamail.internal.util.MiscUtil.tryResolveImageFileDataSource;
8989
import static org.simplejavamail.internal.util.MiscUtil.valueNullOrEmpty;
9090
import static org.simplejavamail.internal.util.Preconditions.assumeNonNull;
9191
import static org.simplejavamail.internal.util.Preconditions.checkNonEmptyArgument;
@@ -375,8 +375,9 @@ private void resolveDynamicEmbeddedImageDataSources() {
375375
final String srcLocation = matcher.group("src");
376376
if (!srcLocation.startsWith("cid:")) {
377377
if (!generatedCids.containsKey(srcLocation)) {
378-
generatedCids.put(srcLocation, randomCid10());
379-
withEmbeddedImage(generatedCids.get(srcLocation), resolveDynamicEmbeddedImageDataSource(srcLocation));
378+
final String cid = randomCid10();
379+
generatedCids.put(srcLocation, cid);
380+
withEmbeddedImage(cid, new NamedDataSource(cid, resolveDynamicEmbeddedImageDataSource(srcLocation)));
380381
}
381382
final String imgSrcReplacement = matcher.group("imageTagStart") + "cid:" + generatedCids.get(srcLocation) + matcher.group("imageSrcEnd");
382383
matcher.appendReplacement(stringBuffer, quoteReplacement(imgSrcReplacement));
@@ -390,7 +391,7 @@ private void resolveDynamicEmbeddedImageDataSources() {
390391

391392
private DataSource resolveDynamicEmbeddedImageDataSource(@NotNull final String srcLocation) {
392393
try {
393-
DataSource resolvedDataSource = tryResolveFileDataSource(embeddedImageBaseDir, embeddedImageBaseClassPath, srcLocation);
394+
DataSource resolvedDataSource = tryResolveImageFileDataSource(embeddedImageBaseDir, embeddedImageBaseClassPath, srcLocation);
394395
if (resolvedDataSource == null) {
395396
resolvedDataSource = resolveUrlDataSource(embeddedImageBaseUrl, srcLocation);
396397
}

modules/simple-java-mail/src/test/java/demo/FullEmailDemoApp.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,20 @@
1212
import java.io.IOException;
1313
import java.nio.charset.Charset;
1414

15+
import static demo.ResourceFolderHelper.determineResourceFolder;
16+
1517
/**
1618
* Demonstration program for the Simple Java Mail framework. Just fill your gmail, password and press GO.
1719
*/
1820
public class FullEmailDemoApp extends DemoAppBase {
19-
21+
2022
public static void main(final String[] args) throws IOException {
2123
testMixedRelatedAlternativeIncludingCalendarAndMessageParsingUsingVariousMailers();
2224
}
2325

2426
private static void testMixedRelatedAlternativeIncludingCalendarAndMessageParsingUsingVariousMailers() throws IOException {
27+
final String resourcesPathOnDisk = determineResourceFolder("simple-java-mail") + "/test/resources";
28+
2529
final EmailPopulatingBuilder emailPopulatingBuilderNormal = EmailBuilder.startingBlank();
2630
emailPopulatingBuilderNormal.from("Simple Java Mail demo", "[email protected]");
2731
// don't forget to add your own address here ->
@@ -30,7 +34,13 @@ private static void testMixedRelatedAlternativeIncludingCalendarAndMessageParsin
3034
emailPopulatingBuilderNormal.withHTMLText("<p>This is an email with \"mixed\", \"related\" and \"alternative\" content: it contains a plain " +
3135
"text part (ignored in favor of HTML by modern clients), an HTML content part (this HTML text) which references a related " +
3236
"content part (the embedded image) and a iCalendar content part. In addition this email contains a separate attachment as " +
33-
"well.</p><img src='cid:thumbsup'>" +
37+
"well.</p>" +
38+
"<ol>" +
39+
" <li>Image embedded with fixed cid and hardcoded datasource: <img width=25 src='cid:thumbsup'></li>" +
40+
" <li>Image embedded with generated cid datasource resolved from classpath:<img src='/test-dynamicembedded-image/excellent.png' style='width:25px'></li>" +
41+
" <li>Image embedded with generated cid datasource resolved from disk:<img src='" + resourcesPathOnDisk + "/test-dynamicembedded-image/excellent.png' style='width:25px'></li>" +
42+
" <li>Image embedded with generated cid datasource resolved from URL!:<img src='http://www.simplejavamail.org/assets/[email protected]' style='width:32px' title='Fork me on GitHub'></li>" +
43+
"</ol>" +
3444
"<p><b>Formal structure:</b><br>" +
3545
"<ul>" +
3646
" <li>mixed (root)<ul>" +
@@ -39,7 +49,7 @@ private static void testMixedRelatedAlternativeIncludingCalendarAndMessageParsin
3949
" <li>plain text</li>" +
4050
" <li>HTML text</li>" +
4151
" </ul></li>" +
42-
" <li>embeddable image (cid:thumbsup) </li>" +
52+
" <li>embeddable images (1x fixed: cid:thumbsup and 3x dynamically resolved)</li>" +
4353
" </ul></li>" +
4454
" <li>attachment</li>" +
4555
" </ul></li>" +
@@ -59,8 +69,8 @@ private static void testMixedRelatedAlternativeIncludingCalendarAndMessageParsin
5969
final Email emailFromMimeMessage = EmailConverter.mimeMessageToEmail(mimeMessage);
6070

6171
mailerSMTPBuilder.buildMailer().sendMail(emailNormal);
62-
mailerTLSBuilder.buildMailer().sendMail(emailNormal);
63-
mailerSSLBuilder.buildMailer().sendMail(emailNormal);
64-
mailerTLSBuilder.buildMailer().sendMail(emailFromMimeMessage); // should produce the exact same result as emailPopulatingBuilderNormal!
72+
// mailerTLSBuilder.buildMailer().sendMail(emailNormal);
73+
// mailerSSLBuilder.buildMailer().sendMail(emailNormal);
74+
// mailerTLSBuilder.buildMailer().sendMail(emailFromMimeMessage); // should produce the exact same result as emailPopulatingBuilderNormal!
6575
}
6676
}

modules/simple-java-mail/src/test/java/org/simplejavamail/api/email/EmailTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import org.junit.Test;
77
import org.simplejavamail.api.mailer.config.Pkcs12Config;
88
import org.simplejavamail.email.EmailBuilder;
9+
import org.simplejavamail.internal.util.NamedDataSource;
910
import testutil.ConfigLoaderTestHelper;
1011
import testutil.EmailHelper;
1112

@@ -204,8 +205,8 @@ public void testEqualsEmail_EqualityFieldByField() throws IOException {
204205
assertEmailEqual(b().withCalendarText(ADD, "moo").buildEmail(), b().withCalendarText(REPLY, "moo").buildEmail(), false);
205206
assertEmailEqual(b().withCalendarText(ADD, "moo").buildEmail(), b().buildEmail(), false);
206207
// forWardEmail
207-
final Email email = EmailHelper.createDummyEmailBuilder(true, false, true, true).buildEmail();
208-
final Email emailOther = EmailHelper.createDummyEmailBuilder(false, true, false, false).buildEmail();
208+
final Email email = EmailHelper.createDummyEmailBuilder(true, false, true, true, false).buildEmail();
209+
final Email emailOther = EmailHelper.createDummyEmailBuilder(false, true, false, false, false).buildEmail();
209210
assertEmailEqual(f(email).buildEmail(), f(email).buildEmail(), true);
210211
assertEmailEqual(f(email).buildEmail(), b().buildEmail(), false);
211212
assertEmailEqual(f(email).buildEmail(), f(emailOther).buildEmail(), false);

modules/simple-java-mail/src/test/java/org/simplejavamail/config/ConfigLoaderTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,9 +202,9 @@ public void loadPropertiesFromFileClassPath() {
202202
assertThat(ConfigLoader.getProperty(SMIME_SIGNING_KEY_PASSWORD)).isEqualTo("letmein");
203203
assertThat(ConfigLoader.getProperty(SMIME_ENCRYPTION_CERTIFICATE)).isEqualTo("src/test/resources/pkcs12/smime_test_user.pem.standard.crt");
204204

205-
assertThat(ConfigLoader.getProperty(EMBEDDEDIMAGES_DYNAMICRESOLUTION_BASE_DIR)).isEqualTo("unable to test this as the value is variable depending on junit working folder");
206-
assertThat(ConfigLoader.getProperty(EMBEDDEDIMAGES_DYNAMICRESOLUTION_BASE_URL)).isEqualTo("http://www.simplejavamail.org");
207-
assertThat(ConfigLoader.getProperty(EMBEDDEDIMAGES_DYNAMICRESOLUTION_BASE_CLASSPATH)).isEqualTo("/pkcs12");
205+
assertThat(ConfigLoader.getProperty(EMBEDDEDIMAGES_DYNAMICRESOLUTION_BASE_DIR)).isEqualTo("");
206+
assertThat(ConfigLoader.getProperty(EMBEDDEDIMAGES_DYNAMICRESOLUTION_BASE_URL)).isEqualTo("");
207+
assertThat(ConfigLoader.getProperty(EMBEDDEDIMAGES_DYNAMICRESOLUTION_BASE_CLASSPATH)).isEqualTo("");
208208
}
209209

210210
@Test

0 commit comments

Comments
 (0)