Skip to content

Commit b966536

Browse files
authored
Merge pull request #356 from vonox7/android-7-crashfix
Fix NoClassDefFoundError on Android < 8.0
2 parents 51d9552 + e97e301 commit b966536

File tree

6 files changed

+54
-39
lines changed

6 files changed

+54
-39
lines changed

modules/cli-module/src/main/java/org/simplejavamail/internal/clisupport/CliSupport.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import org.simplejavamail.api.mailer.MailerFromSessionBuilder;
88
import org.simplejavamail.api.mailer.MailerRegularBuilder;
99
import org.simplejavamail.internal.clisupport.serialization.SerializationUtil;
10-
import org.simplejavamail.internal.util.MiscUtil;
10+
import org.simplejavamail.internal.util.FileUtil;
1111
import org.slf4j.Logger;
1212
import org.slf4j.LoggerFactory;
1313
import picocli.CommandLine;
@@ -38,9 +38,9 @@ private static List<CliDeclaredOptionSpec> produceCliDeclaredOptionSpec() {
3838
if (!CLI_DATAFILE.exists()) {
3939
LOGGER.info("Initial cli.data not found, writing to (one time action): {}", CLI_DATAFILE);
4040
List<CliDeclaredOptionSpec> declaredOptions = generateOptionsFromBuilderApi(RELEVANT_BUILDER_ROOT_API);
41-
MiscUtil.writeFileBytes(CLI_DATAFILE, SerializationUtil.serialize(declaredOptions));
41+
FileUtil.writeFileBytes(CLI_DATAFILE, SerializationUtil.serialize(declaredOptions));
4242
}
43-
return SerializationUtil.deserialize(MiscUtil.readFileBytes(CLI_DATAFILE));
43+
return SerializationUtil.deserialize(FileUtil.readFileBytes(CLI_DATAFILE));
4444
} catch (IOException e) {
4545
throw new CliExecutionException(ERROR_INVOKING_BUILDER_API, e);
4646
}

modules/cli-module/src/main/java/org/simplejavamail/internal/clisupport/therapijavadoc/TherapiJavadocHelper.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
import org.jetbrains.annotations.TestOnly;
1818
import org.simplejavamail.internal.clisupport.CliDataLocator;
1919
import org.simplejavamail.internal.clisupport.serialization.SerializationUtil;
20-
import org.simplejavamail.internal.util.MiscUtil;
20+
import org.simplejavamail.internal.util.FileUtil;
2121

2222
import java.io.File;
2323
import java.io.IOException;
@@ -48,7 +48,7 @@ public final class TherapiJavadocHelper {
4848
private static Map<String, MethodJavadoc> loadTherapiCache() {
4949
if (THERAPI_DATAFILE.exists()) {
5050
try {
51-
return SerializationUtil.deserialize(MiscUtil.readFileBytes(THERAPI_DATAFILE));
51+
return SerializationUtil.deserialize(FileUtil.readFileBytes(THERAPI_DATAFILE));
5252
} catch (IOException e) {
5353
throw new RuntimeException(e);
5454
}
@@ -60,7 +60,7 @@ private static Map<String, MethodJavadoc> loadTherapiCache() {
6060
@TestOnly
6161
public static void persistCache() {
6262
try {
63-
MiscUtil.writeFileBytes(THERAPI_DATAFILE, SerializationUtil.serialize(THERAPI_CACHE));
63+
FileUtil.writeFileBytes(THERAPI_DATAFILE, SerializationUtil.serialize(THERAPI_CACHE));
6464
} catch (IOException e) {
6565
throw new RuntimeException(e);
6666
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.simplejavamail.internal.util;
2+
3+
import org.jetbrains.annotations.NotNull;
4+
5+
import java.io.File;
6+
import java.io.IOException;
7+
import java.nio.file.FileAlreadyExistsException;
8+
import java.nio.file.Files;
9+
10+
import static java.lang.String.format;
11+
import static java.nio.charset.StandardCharsets.UTF_8;
12+
13+
// FileUtil uses java.nio.file, which is not available on Android < 8.0 and will throw there a NoClassDefFoundError.
14+
// See https://developer.android.com/reference/java/nio/file/package-summary.
15+
// Therefore, keep imports of java.nio.file.* inside this class.
16+
public class FileUtil {
17+
public static String readFileContent(@NotNull final File file) throws IOException {
18+
return new String(readFileBytes(file), UTF_8);
19+
}
20+
21+
public static byte[] readFileBytes(@NotNull final File file) throws IOException {
22+
if (!file.exists()) {
23+
throw new IllegalArgumentException(format("File not found: %s", file));
24+
}
25+
return Files.readAllBytes(file.toPath());
26+
}
27+
28+
public static void writeFileBytes(@NotNull final File file, final byte[] bytes) throws IOException {
29+
try {
30+
Files.createFile(file.toPath());
31+
} catch (FileAlreadyExistsException e) {
32+
// ignore
33+
}
34+
Files.write(file.toPath(), bytes);
35+
}
36+
}

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

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
import java.lang.reflect.Method;
2424
import java.net.URL;
2525
import java.nio.charset.Charset;
26-
import java.nio.file.FileAlreadyExistsException;
27-
import java.nio.file.Files;
2826
import java.util.AbstractMap;
2927
import java.util.ArrayList;
3028
import java.util.Collection;
@@ -227,26 +225,6 @@ private static boolean containsNullableAnnotation(final Annotation[] annotations
227225
return false;
228226
}
229227

230-
public static String readFileContent(@NotNull final File file) throws IOException {
231-
return new String(readFileBytes(file), UTF_8);
232-
}
233-
234-
public static byte[] readFileBytes(@NotNull final File file) throws IOException {
235-
if (!file.exists()) {
236-
throw new IllegalArgumentException(format("File not found: %s", file));
237-
}
238-
return Files.readAllBytes(file.toPath());
239-
}
240-
241-
public static void writeFileBytes(@NotNull final File file, final byte[] bytes) throws IOException {
242-
try {
243-
Files.createFile(file.toPath());
244-
} catch (FileAlreadyExistsException e) {
245-
// ignore
246-
}
247-
Files.write(file.toPath(), bytes);
248-
}
249-
250228
@Nullable
251229
public static DataSource tryResolveImageFileDataSourceFromDisk(final @Nullable String baseDir, final boolean allowOutsideBaseDir, final @NotNull String srcLocation) {
252230
DataSource dataSource;

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.simplejavamail.api.mailer.config.Pkcs12Config;
1717
import org.simplejavamail.email.EmailBuilder;
1818
import org.simplejavamail.internal.util.CertificationUtil;
19+
import org.simplejavamail.internal.util.FileUtil;
1920
import org.simplejavamail.internal.util.MiscUtil;
2021
import org.simplejavamail.internal.util.NamedDataSource;
2122

@@ -642,7 +643,7 @@ public InternalEmailPopulatingBuilder withForward(@Nullable final MimeMessage em
642643
@Cli.OptionNameOverride("withPlainTextFromFile")
643644
public EmailPopulatingBuilder withPlainText(@NotNull final File textFile) {
644645
try {
645-
return withPlainText(MiscUtil.readFileContent(textFile));
646+
return withPlainText(FileUtil.readFileContent(textFile));
646647
} catch (IOException e) {
647648
throw new EmailException(format(ERROR_READING_FROM_FILE, textFile), e);
648649
}
@@ -664,7 +665,7 @@ public EmailPopulatingBuilder withPlainText(@Nullable final String text) {
664665
@Cli.OptionNameOverride("prependTextFromFile")
665666
public EmailPopulatingBuilder prependText(@NotNull final File textFile) {
666667
try {
667-
return prependText(MiscUtil.readFileContent(textFile));
668+
return prependText(FileUtil.readFileContent(textFile));
668669
} catch (IOException e) {
669670
throw new EmailException(format(ERROR_READING_FROM_FILE, textFile), e);
670671
}
@@ -686,7 +687,7 @@ public EmailPopulatingBuilder prependText(@NotNull final String text) {
686687
@Cli.OptionNameOverride("appendTextFromFile")
687688
public EmailPopulatingBuilder appendText(@NotNull final File textFile) {
688689
try {
689-
return appendText(MiscUtil.readFileContent(textFile));
690+
return appendText(FileUtil.readFileContent(textFile));
690691
} catch (IOException e) {
691692
throw new EmailException(format(ERROR_READING_FROM_FILE, textFile), e);
692693
}
@@ -708,7 +709,7 @@ public EmailPopulatingBuilder appendText(@NotNull final String text) {
708709
@Cli.OptionNameOverride("withHTMLTextFromFile")
709710
public EmailPopulatingBuilder withHTMLText(@NotNull final File textHTMLFile) {
710711
try {
711-
return withHTMLText(MiscUtil.readFileContent(textHTMLFile));
712+
return withHTMLText(FileUtil.readFileContent(textHTMLFile));
712713
} catch (IOException e) {
713714
throw new EmailException(format(ERROR_READING_FROM_FILE, textHTMLFile), e);
714715
}
@@ -730,7 +731,7 @@ public EmailPopulatingBuilder withHTMLText(@Nullable final String textHTML) {
730731
@Cli.OptionNameOverride("prependTextHTMLFromFile")
731732
public EmailPopulatingBuilder prependTextHTML(@NotNull final File textHTMLFile) {
732733
try {
733-
return prependTextHTML(MiscUtil.readFileContent(textHTMLFile));
734+
return prependTextHTML(FileUtil.readFileContent(textHTMLFile));
734735
} catch (IOException e) {
735736
throw new EmailException(format(ERROR_READING_FROM_FILE, textHTMLFile), e);
736737
}
@@ -752,7 +753,7 @@ public EmailPopulatingBuilder prependTextHTML(@NotNull final String textHTML) {
752753
@Cli.OptionNameOverride("appendTextHTMLFromFile")
753754
public EmailPopulatingBuilder appendTextHTML(@NotNull final File textHTMLFile) {
754755
try {
755-
return appendTextHTML(MiscUtil.readFileContent(textHTMLFile));
756+
return appendTextHTML(FileUtil.readFileContent(textHTMLFile));
756757
} catch (IOException e) {
757758
throw new EmailException(format(ERROR_READING_FROM_FILE, textHTMLFile), e);
758759
}

modules/simple-java-mail/src/test/java/org/simplejavamail/internal/util/MiscUtilTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -162,22 +162,22 @@ public void testCountMandatoryParameters() {
162162
@Test
163163
public void testReadFileContent()
164164
throws IOException {
165-
assertThatThrownBy(() -> MiscUtil.readFileContent(new File("moo")))
165+
assertThatThrownBy(() -> FileUtil.readFileContent(new File("moo")))
166166
.isInstanceOf(IllegalArgumentException.class)
167167
.hasMessageContaining("File not found: moo");
168168

169-
assertThat(MiscUtil.readFileContent(new File("src/test/resources/ignore.properties")))
169+
assertThat(FileUtil.readFileContent(new File("src/test/resources/ignore.properties")))
170170
.contains("simplejavamail.defaults.bcc.address=moo");
171171
}
172172

173173
@Test
174174
public void testWriteFileContent()
175175
throws IOException {
176-
MiscUtil.writeFileBytes(new File("target/test.file"), "This is a test".getBytes());
176+
FileUtil.writeFileBytes(new File("target/test.file"), "This is a test".getBytes());
177177

178-
assertThat(MiscUtil.readFileBytes(new File("target/test.file")))
178+
assertThat(FileUtil.readFileBytes(new File("target/test.file")))
179179
.isEqualTo("This is a test".getBytes());
180-
assertThat(MiscUtil.readFileContent(new File("target/test.file")))
180+
assertThat(FileUtil.readFileContent(new File("target/test.file")))
181181
.isEqualTo("This is a test");
182182
}
183183

0 commit comments

Comments
 (0)