Skip to content

Commit 0318550

Browse files
committed
#233: Finally solved all remaining SpotBugs errors by either fixing the code or suppressing them
1 parent b9224e0 commit 0318550

File tree

17 files changed

+95
-56
lines changed

17 files changed

+95
-56
lines changed

modules/batch-module/src/main/java/org/simplejavamail/internal/batchsupport/BatchException.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
class BatchException extends RuntimeException {
44

5-
static final String ERROR_ACQUIRING_KEYED_POOLABLE = "Was unable to obtain a poolable object for key:\t\n%s";
5+
static final String ERROR_ACQUIRING_KEYED_POOLABLE = "Was unable to obtain a poolable object for key:\t%n%s";
66

77
BatchException(final String msg, final Throwable cause) {
88
super(msg, cause);

modules/batch-module/src/main/java/org/simplejavamail/internal/batchsupport/concurrent/NonJvmBlockingThreadPoolExecutor.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package org.simplejavamail.internal.batchsupport.concurrent;
22

3+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
4+
35
import java.util.concurrent.LinkedBlockingQueue;
46
import java.util.concurrent.ThreadPoolExecutor;
57
import java.util.concurrent.TimeUnit;
@@ -18,6 +20,7 @@ public class NonJvmBlockingThreadPoolExecutor extends ThreadPoolExecutor {
1820

1921
private static int counter = 1;
2022

23+
@SuppressFBWarnings("ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD")
2124
public NonJvmBlockingThreadPoolExecutor(int threadPoolSize, int threadPoolKeepAliveTime) {
2225
super(threadPoolSize,
2326
threadPoolSize,

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import org.bbottema.javareflection.model.LookupMode;
88
import org.bbottema.javareflection.model.MethodModifier;
99
import org.bbottema.javareflection.valueconverter.ValueConversionHelper;
10+
import org.jetbrains.annotations.NotNull;
11+
import org.jetbrains.annotations.Nullable;
1012
import org.simplejavamail.api.email.CalendarMethod;
1113
import org.simplejavamail.api.internal.clisupport.model.Cli;
1214
import org.simplejavamail.api.internal.clisupport.model.CliDeclaredOptionSpec;
@@ -16,19 +18,17 @@
1618
import org.simplejavamail.internal.clisupport.therapijavadoc.TherapiJavadocHelper;
1719
import org.simplejavamail.internal.clisupport.therapijavadoc.TherapiJavadocHelper.DocumentedMethodParam;
1820
import org.simplejavamail.internal.clisupport.valueinterpreters.EmlFilePathToMimeMessageFunction;
19-
import org.simplejavamail.internal.clisupport.valueinterpreters.PemFilePathToX509CertificateFunction;
20-
import org.simplejavamail.internal.clisupport.valueinterpreters.StringToFileFunction;
2121
import org.simplejavamail.internal.clisupport.valueinterpreters.MsgFilePathToMimeMessageFunction;
22+
import org.simplejavamail.internal.clisupport.valueinterpreters.PemFilePathToX509CertificateFunction;
2223
import org.simplejavamail.internal.clisupport.valueinterpreters.StringToCalendarMethodFunction;
24+
import org.simplejavamail.internal.clisupport.valueinterpreters.StringToFileFunction;
2325
import org.simplejavamail.internal.clisupport.valueinterpreters.StringToLoadBalancingStrategyFunction;
2426
import org.simplejavamail.internal.clisupport.valueinterpreters.StringToTransportStrategyFunction;
2527
import org.simplejavamail.internal.util.StringUtil;
2628
import org.simplejavamail.internal.util.StringUtil.StringFormatter;
2729
import org.slf4j.Logger;
2830

2931
import javax.activation.DataSource;
30-
import org.jetbrains.annotations.NotNull;
31-
import org.jetbrains.annotations.Nullable;
3232
import javax.mail.internet.MimeMessage;
3333
import java.io.File;
3434
import java.io.InputStream;
@@ -143,7 +143,7 @@ private static void generateOptionsFromBuilderApi(Class<?> apiNode, Set<Class<?>
143143
if (knownOption.getName().equals(optionName)) {
144144
final boolean methodIsActuallyTheSame = knownOption.getSourceMethod().equals(m);
145145
if (!methodIsActuallyTheSame) {
146-
String msg = "@CliOptionNameOverride needed one of the following two methods:\n\t%s\n\t%s\n\t----------";
146+
String msg = "@CliOptionNameOverride needed one of the following two methods:%n\t%s%n\t%s%n\t----------";
147147
throw new AssertionError(format(msg, knownOption.getSourceMethod(), m));
148148
}
149149
}

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
import com.github.therapi.runtimejavadoc.InlineLink;
77
import com.github.therapi.runtimejavadoc.InlineTag;
88
import com.github.therapi.runtimejavadoc.InlineValue;
9-
import org.simplejavamail.internal.clisupport.BuilderApiToPicocliCommandsMapper;
9+
import org.jetbrains.annotations.NotNull;
1010
import org.simplejavamail.api.internal.clisupport.model.CliDeclaredOptionValue;
11+
import org.simplejavamail.internal.clisupport.BuilderApiToPicocliCommandsMapper;
1112

12-
import org.jetbrains.annotations.NotNull;
1313
import java.lang.reflect.Method;
1414
import java.util.ArrayList;
1515
import java.util.List;
@@ -49,10 +49,11 @@ public String format(Comment comment) {
4949
!PATTERN_TODO_FIXME.matcher(result).find(),
5050
"Output not properly formatted for CLI usage: \n\t" + result + "\n\t-----------");
5151

52+
StringBuilder completeResult = new StringBuilder(result);
5253
for (String includedDocumentation : includedReferredDocumentation) {
53-
result += "\n\n" + indent(1) + includedDocumentation;
54+
completeResult.append("\n\n").append(indent(1)).append(includedDocumentation);
5455
}
55-
return result;
56+
return completeResult.toString();
5657
}
5758

5859
@Override

modules/core-module/src/main/java/org/simplejavamail/api/email/Email.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
package org.simplejavamail.api.email;
22

3+
import org.jetbrains.annotations.NotNull;
4+
import org.jetbrains.annotations.Nullable;
35
import org.simplejavamail.api.mailer.config.Pkcs12Config;
46
import org.simplejavamail.internal.util.MiscUtil;
57

68
import javax.activation.DataSource;
7-
import org.jetbrains.annotations.NotNull;
8-
import org.jetbrains.annotations.Nullable;
99
import javax.mail.internet.MimeMessage;
1010
import java.io.File;
1111
import java.io.InputStream;
12-
import java.security.cert.X509Certificate;
1312
import java.io.Serializable;
13+
import java.security.cert.X509Certificate;
1414
import java.util.Date;
1515
import java.util.List;
1616
import java.util.Map;
@@ -599,6 +599,6 @@ public OriginalSmimeDetails getOriginalSmimeDetails() {
599599
*/
600600
@Nullable
601601
public Date getSentDate() {
602-
return sentDate;
602+
return sentDate != null ? new Date(sentDate.getTime()) : null;
603603
}
604604
}

modules/core-module/src/main/java/org/simplejavamail/api/internal/clisupport/model/CliDeclaredOptionSpec.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.simplejavamail.api.internal.clisupport.model;
22

3+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
34
import org.jetbrains.annotations.NotNull;
5+
46
import java.lang.reflect.Method;
57
import java.util.ArrayList;
68
import java.util.Collection;
@@ -49,6 +51,7 @@ public List<CliDeclaredOptionValue> getMandatoryOptionValues() {
4951
}
5052

5153
@Override
54+
@SuppressFBWarnings("EQ_COMPARETO_USE_OBJECT_EQUALS")
5255
public int compareTo(@NotNull CliDeclaredOptionSpec other) {
5356
int prefixOrder = getNamePrefix().compareTo(other.getNamePrefix());
5457
return prefixOrder != 0 ? prefixOrder : getNameAfterPrefix().compareTo(other.getNameAfterPrefix());

modules/core-module/src/main/java/org/simplejavamail/api/internal/clisupport/model/CliDeclaredOptionValue.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public CliDeclaredOptionValue(String name, String helpLabel, String description,
1818
this.helpLabel = helpLabel;
1919
this.description = description;
2020
this.required = required;
21-
this.examples = examples;
21+
this.examples = examples.clone();
2222
}
2323

2424
public String formatDescription() {

modules/core-module/src/main/java/org/simplejavamail/api/internal/smimesupport/model/PlainSmimeDetails.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package org.simplejavamail.api.internal.smimesupport.model;
22

3-
import org.simplejavamail.api.email.OriginalSmimeDetails;
4-
53
import org.jetbrains.annotations.NotNull;
64
import org.jetbrains.annotations.Nullable;
5+
import org.simplejavamail.api.email.OriginalSmimeDetails;
76

87
public class PlainSmimeDetails implements OriginalSmimeDetails {
98

@@ -27,7 +26,7 @@ public int hashCode() {
2726

2827
@Override
2928
public boolean equals(final Object obj) {
30-
return obj.getClass() == PlainSmimeDetails.class;
29+
return obj.getClass() == getClass();
3130
}
3231

3332
@Nullable

modules/core-module/src/main/java/org/simplejavamail/api/mailer/config/Pkcs12Config.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.simplejavamail.api.mailer.config;
22

3+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
34
import org.jetbrains.annotations.NotNull;
5+
46
import java.io.File;
57
import java.io.FileInputStream;
68
import java.io.FileNotFoundException;
@@ -102,6 +104,10 @@ public Pkcs12ConfigBuilder pkcs12Store(String pkcs12StorePath) {
102104
return pkcs12Store(new File(pkcs12StorePath));
103105
}
104106

107+
/**
108+
* Note that this method creates a new {@code FileInputStream} without closing it.
109+
*/
110+
@SuppressFBWarnings(value = "OBL_UNSATISFIED_OBLIGATION", justification = "Input stream is meant to travel outside method")
105111
public Pkcs12ConfigBuilder pkcs12Store(File pkcs12StorePath) {
106112
try {
107113
return pkcs12Store(new FileInputStream(pkcs12StorePath));
@@ -116,7 +122,7 @@ public Pkcs12ConfigBuilder pkcs12Store(InputStream pkcs12StoreStream) {
116122
}
117123

118124
public Pkcs12ConfigBuilder storePassword(char[] storePassword) {
119-
this.storePassword = storePassword;
125+
this.storePassword = storePassword.clone();
120126
return this;
121127
}
122128

@@ -131,7 +137,7 @@ public Pkcs12ConfigBuilder keyAlias(String keyAlias) {
131137
}
132138

133139
public Pkcs12ConfigBuilder keyPassword(char[] keyPassword) {
134-
this.keyPassword = keyPassword;
140+
this.keyPassword = keyPassword.clone();
135141
return this;
136142
}
137143

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package org.simplejavamail.internal.util;
22

3-
import org.simplejavamail.api.email.Recipient;
4-
3+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
54
import org.jetbrains.annotations.NotNull;
65
import org.jetbrains.annotations.Nullable;
6+
import org.simplejavamail.api.email.Recipient;
7+
78
import javax.mail.Message.RecipientType;
89
import javax.mail.internet.AddressException;
910
import javax.mail.internet.InternetAddress;
@@ -41,6 +42,7 @@ public final class MiscUtil {
4142
private static final Pattern TRAILING_TOKEN_DELIMITER_PATTERN = compile("<\\|>$");
4243
private static final Pattern TOKEN_DELIMITER_PATTERN = compile("\\s*<\\|>\\s*");
4344

45+
@SuppressFBWarnings(value = "NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE")
4446
public static <T> T checkNotNull(final @Nullable T value, final @Nullable String msg) {
4547
if (value == null) {
4648
throw new NullPointerException(msg);

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.simplejavamail.converter.internal.mimemessage;
22

33
import com.sun.mail.handlers.text_plain;
4+
import org.jetbrains.annotations.NotNull;
5+
import org.jetbrains.annotations.Nullable;
46
import org.simplejavamail.internal.util.NaturalEntryKeyComparator;
57
import org.simplejavamail.internal.util.Preconditions;
68

@@ -9,8 +11,6 @@
911
import javax.activation.DataHandler;
1012
import javax.activation.DataSource;
1113
import javax.activation.MailcapCommandMap;
12-
import org.jetbrains.annotations.NotNull;
13-
import org.jetbrains.annotations.Nullable;
1414
import javax.mail.Address;
1515
import javax.mail.Header;
1616
import javax.mail.Message.RecipientType;
@@ -640,7 +640,7 @@ public String getCalendarMethod() {
640640

641641
@Nullable
642642
public Date getSentDate() {
643-
return sentDate;
643+
return sentDate != null ? new Date(sentDate.getTime()) : null;
644644
}
645645
}
646646

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

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package org.simplejavamail.email.internal;
22

3+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
4+
import org.jetbrains.annotations.NotNull;
5+
import org.jetbrains.annotations.Nullable;
36
import org.simplejavamail.api.email.AttachmentResource;
47
import org.simplejavamail.api.email.CalendarMethod;
58
import org.simplejavamail.api.email.Email;
@@ -15,8 +18,6 @@
1518
import org.simplejavamail.internal.util.MiscUtil;
1619

1720
import javax.activation.DataSource;
18-
import org.jetbrains.annotations.NotNull;
19-
import org.jetbrains.annotations.Nullable;
2021
import javax.mail.Message.RecipientType;
2122
import javax.mail.internet.InternetAddress;
2223
import javax.mail.internet.MimeMessage;
@@ -1501,6 +1502,7 @@ public EmailPopulatingBuilder signWithDomainKey(@NotNull final File dkimPrivateK
15011502
* @see EmailPopulatingBuilder#signWithSmime(File, String, String, String)
15021503
*/
15031504
@Override
1505+
@SuppressFBWarnings(value = "OBL_UNSATISFIED_OBLIGATION", justification = "Input stream being created should not be closed here")
15041506
public EmailPopulatingBuilder signWithSmime(@NotNull final File pkcs12StoreFile, @NotNull final String storePassword, @NotNull final String keyAlias, @NotNull final String keyPassword) {
15051507
try {
15061508
return signWithSmime(new FileInputStream(pkcs12StoreFile), storePassword, keyAlias, keyPassword);
@@ -1540,6 +1542,7 @@ public EmailPopulatingBuilder signWithSmime(@NotNull final Pkcs12Config pkcs12Co
15401542
* @see EmailPopulatingBuilder#encryptWithSmime(String)
15411543
*/
15421544
@Override
1545+
@SuppressFBWarnings(value = "OBL_UNSATISFIED_OBLIGATION", justification = "Input stream being created should not be closed here")
15431546
public EmailPopulatingBuilder encryptWithSmime(@NotNull final String pemFile) {
15441547
try {
15451548
return encryptWithSmime(new FileInputStream(new File(pemFile)));
@@ -1552,6 +1555,7 @@ public EmailPopulatingBuilder encryptWithSmime(@NotNull final String pemFile) {
15521555
* @see EmailPopulatingBuilder#encryptWithSmime(File)
15531556
*/
15541557
@Override
1558+
@SuppressFBWarnings(value = "OBL_UNSATISFIED_OBLIGATION", justification = "Input stream being created should not be closed here")
15551559
public EmailPopulatingBuilder encryptWithSmime(@NotNull final File pemFile) {
15561560
try {
15571561
return encryptWithSmime(new FileInputStream(pemFile));
@@ -1726,7 +1730,7 @@ public InternalEmailPopulatingBuilder withSmimeSignedEmail(@NotNull final Email
17261730
*/
17271731
@Override
17281732
public EmailPopulatingBuilder fixingSentDate(@NotNull final Date sentDate) {
1729-
this.sentDate = sentDate;
1733+
this.sentDate = new Date(sentDate.getTime());
17301734
return this;
17311735
}
17321736

@@ -2157,6 +2161,6 @@ public X509Certificate getX509CertificateForSmimeEncryption() {
21572161
@Override
21582162
@Nullable
21592163
public Date getSentDate() {
2160-
return sentDate;
2164+
return sentDate != null ? new Date(sentDate.getTime()) : null;
21612165
}
21622166
}

modules/simple-java-mail/src/main/java/org/simplejavamail/mailer/internal/AbstractProxyServerSyncingClosure.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package org.simplejavamail.mailer.internal;
22

3+
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
4+
import org.jetbrains.annotations.NotNull;
5+
import org.jetbrains.annotations.Nullable;
36
import org.simplejavamail.api.internal.authenticatedsockssupport.socks5server.AnonymousSocks5Server;
47
import org.slf4j.Logger;
58

6-
import org.jetbrains.annotations.NotNull;
7-
import org.jetbrains.annotations.Nullable;
89
import java.util.concurrent.atomic.AtomicInteger;
910

1011
import static org.slf4j.LoggerFactory.getLogger;
@@ -26,6 +27,7 @@ public abstract class AbstractProxyServerSyncingClosure implements Runnable {
2627
increaseSmtpConnectionCounter();
2728
}
2829

30+
@SuppressFBWarnings(value = "JLM_JSR166_UTILCONCURRENT_MONITORENTER", justification = "Not sure why we needed this anymore, but it doesn't do any harm either")
2931
private void increaseSmtpConnectionCounter() {
3032
synchronized (smtpConnectionCounter) {
3133
smtpConnectionCounter.incrementAndGet();
@@ -55,6 +57,7 @@ private void startProxyServerIfNeeded() {
5557
}
5658
}
5759

60+
@SuppressFBWarnings(value = "JLM_JSR166_UTILCONCURRENT_MONITORENTER", justification = "Not sure why we needed this anymore, but it doesn't do any harm either")
5861
private void shutDownProxyServerIfRunningAndCurrentBatchCompleted() {
5962
synchronized (smtpConnectionCounter) {
6063
if (smtpConnectionCounter.decrementAndGet() == 0) {

modules/smime-module/src/main/java/org/simplejavamail/internal/smimesupport/SMIMESupport.java

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
import org.bouncycastle.mail.smime.SMIMESigned;
2121
import org.bouncycastle.operator.OperatorCreationException;
2222
import org.bouncycastle.util.Store;
23+
import org.jetbrains.annotations.NotNull;
24+
import org.jetbrains.annotations.Nullable;
2325
import org.simplejavamail.api.email.AttachmentResource;
2426
import org.simplejavamail.api.email.Email;
2527
import org.simplejavamail.api.email.OriginalSmimeDetails;
@@ -36,8 +38,6 @@
3638
import org.slf4j.Logger;
3739
import org.slf4j.LoggerFactory;
3840

39-
import org.jetbrains.annotations.NotNull;
40-
import org.jetbrains.annotations.Nullable;
4141
import javax.mail.MessagingException;
4242
import javax.mail.Multipart;
4343
import javax.mail.Session;
@@ -245,23 +245,21 @@ private AttachmentResource decryptAndUnsignAttachment(
245245

246246
AttachmentResource liberatedContent = null;
247247

248-
switch (determineStatus(mimeBodyPart, messageSmimeDetails)) {
249-
case SIGNED:
250-
if (SmimeUtil.checkSignature(mimeBodyPart)) {
251-
MimeBodyPart liberatedBodyPart = SmimeUtil.getSignedContent(mimeBodyPart);
252-
liberatedContent = handleLiberatedContent(liberatedBodyPart.getContent());
253-
} else {
254-
LOGGER.warn("Content is S/MIME signed, but signature is not valid; skipping S/MIME interpeter...");
255-
}
256-
break;
257-
case ENCRYPTED:
258-
if (pkcs12Config != null) {
259-
LOGGER.warn("Message was encrypted, but no Pkcs12Config was given to decrypt it with, skipping attachment...");
260-
SmimeKey smimeKey = retrieveSmimeKeyFromPkcs12Keystore(pkcs12Config);
261-
MimeBodyPart liberatedBodyPart = SmimeUtil.decrypt(mimeBodyPart, smimeKey);
262-
liberatedContent = handleLiberatedContent(liberatedBodyPart.getContent());
263-
}
264-
break;
248+
SmimeState smimeState = determineStatus(mimeBodyPart, messageSmimeDetails);
249+
if (smimeState == SIGNED) {
250+
if (SmimeUtil.checkSignature(mimeBodyPart)) {
251+
MimeBodyPart liberatedBodyPart = SmimeUtil.getSignedContent(mimeBodyPart);
252+
liberatedContent = handleLiberatedContent(liberatedBodyPart.getContent());
253+
} else {
254+
LOGGER.warn("Content is S/MIME signed, but signature is not valid; skipping S/MIME interpeter...");
255+
}
256+
} else if (smimeState == ENCRYPTED) {
257+
if (pkcs12Config != null) {
258+
LOGGER.warn("Message was encrypted, but no Pkcs12Config was given to decrypt it with, skipping attachment...");
259+
SmimeKey smimeKey = retrieveSmimeKeyFromPkcs12Keystore(pkcs12Config);
260+
MimeBodyPart liberatedBodyPart = SmimeUtil.decrypt(mimeBodyPart, smimeKey);
261+
liberatedContent = handleLiberatedContent(liberatedBodyPart.getContent());
262+
}
265263
}
266264

267265
return liberatedContent != null

0 commit comments

Comments
 (0)