Skip to content

Commit b504afe

Browse files
committed
Apply Nullability into XMPP module
Related to: #10083 * Add `@org.jspecify.annotations.NullMarked` to all packages of SI-XMPP module * Fix raised concerns about `@Nullable`
1 parent 104ee68 commit b504afe

12 files changed

+37
-26
lines changed

spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/config/XmppConnectionFactoryBean.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,14 @@
2424
import org.jivesoftware.smack.roster.Roster;
2525
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
2626
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
27+
import org.jspecify.annotations.Nullable;
2728
import org.jxmpp.stringprep.XmppStringprepException;
2829
import org.jxmpp.util.XmppStringUtils;
2930

3031
import org.springframework.beans.factory.BeanInitializationException;
3132
import org.springframework.beans.factory.config.AbstractFactoryBean;
3233
import org.springframework.context.SmartLifecycle;
34+
import org.springframework.util.Assert;
3335
import org.springframework.util.StringUtils;
3436

3537
/**
@@ -53,21 +55,21 @@ public class XmppConnectionFactoryBean extends AbstractFactoryBean<XMPPConnectio
5355

5456
private final Lock lifecycleMonitor = new ReentrantLock();
5557

56-
private XMPPTCPConnectionConfiguration connectionConfiguration;
58+
private @Nullable XMPPTCPConnectionConfiguration connectionConfiguration;
5759

58-
private String resource; // server will generate resource if not provided
60+
private @Nullable String resource; // server will generate resource if not provided
5961

60-
private String user;
62+
private @Nullable String user;
6163

62-
private String password;
64+
private @Nullable String password;
6365

64-
private String serviceName;
66+
private @Nullable String serviceName;
6567

66-
private String host;
68+
private @Nullable String host;
6769

6870
private int port = 5222; // NOSONAR magic number
6971

70-
private Roster.SubscriptionMode subscriptionMode = Roster.getDefaultSubscriptionMode();
72+
private Roster.@Nullable SubscriptionMode subscriptionMode = Roster.getDefaultSubscriptionMode();
7173

7274
private boolean autoStartup = true;
7375

@@ -128,7 +130,7 @@ public void setPort(int port) {
128130
* Can be {@code null}.
129131
* @see Roster#setSubscriptionMode(Roster.SubscriptionMode)
130132
*/
131-
public void setSubscriptionMode(Roster.SubscriptionMode subscriptionMode) {
133+
public void setSubscriptionMode(Roster.@Nullable SubscriptionMode subscriptionMode) {
132134
this.subscriptionMode = subscriptionMode;
133135
}
134136

@@ -141,6 +143,7 @@ public Class<? extends XMPPConnection> getObjectType() {
141143
protected XMPPConnection createInstance() throws XmppStringprepException {
142144
XMPPTCPConnectionConfiguration connectionConfig = this.connectionConfiguration;
143145
if (connectionConfig == null) {
146+
Assert.notNull(this.user, "The 'user' property is required'");
144147
XMPPTCPConnectionConfiguration.Builder builder =
145148
XMPPTCPConnectionConfiguration.builder()
146149
.setHost(this.host)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/**
22
* Contains parser classes for the XMPP namespace support.
33
*/
4+
@org.jspecify.annotations.NullMarked
45
package org.springframework.integration.xmpp.config;

spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/core/AbstractXmppConnectionAwareEndpoint.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
*/
3131
public abstract class AbstractXmppConnectionAwareEndpoint extends MessageProducerSupport {
3232

33+
@SuppressWarnings("NullAway.Init")
3334
private XMPPConnection xmppConnection;
3435

3536
private boolean initialized;

spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/core/AbstractXmppConnectionAwareMessageHandler.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
*/
3131
public abstract class AbstractXmppConnectionAwareMessageHandler extends AbstractMessageHandler {
3232

33+
@SuppressWarnings("NullAway.Init")
3334
private XMPPConnection xmppConnection;
3435

3536
private volatile boolean initialized;
@@ -53,7 +54,7 @@ protected boolean isInitialized() {
5354

5455
@Override
5556
protected void onInit() {
56-
BeanFactory beanFactory = this.getBeanFactory();
57+
BeanFactory beanFactory = getBeanFactory();
5758
if (this.xmppConnection == null && beanFactory != null) {
5859
this.xmppConnection =
5960
beanFactory.getBean(XmppContextUtils.XMPP_CONNECTION_BEAN_NAME, XMPPConnection.class);
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/**
22
* Provides classes shared across all XMPP components.
33
*/
4+
@org.jspecify.annotations.NullMarked
45
package org.springframework.integration.xmpp.core;

spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/inbound/ChatMessageListeningEndpoint.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.jivesoftware.smack.filter.StanzaFilter;
2525
import org.jivesoftware.smack.packet.ExtensionElement;
2626
import org.jivesoftware.smack.packet.Stanza;
27+
import org.jspecify.annotations.Nullable;
2728

2829
import org.springframework.expression.EvaluationContext;
2930
import org.springframework.expression.Expression;
@@ -52,10 +53,11 @@ public class ChatMessageListeningEndpoint extends AbstractXmppConnectionAwareEnd
5253

5354
private XmppHeaderMapper headerMapper = new DefaultXmppHeaderMapper();
5455

55-
private Expression payloadExpression;
56+
private @Nullable Expression payloadExpression;
5657

57-
private StanzaFilter stanzaFilter;
58+
private @Nullable StanzaFilter stanzaFilter;
5859

60+
@SuppressWarnings("NullAway.Init")
5961
private EvaluationContext evaluationContext;
6062

6163
public ChatMessageListeningEndpoint() {
@@ -110,10 +112,7 @@ protected void doStart() {
110112

111113
@Override
112114
protected void doStop() {
113-
XMPPConnection xmppConnection = getXmppConnection();
114-
if (xmppConnection != null) {
115-
xmppConnection.removeAsyncStanzaListener(this.stanzaListener);
116-
}
115+
getXmppConnection().removeAsyncStanzaListener(this.stanzaListener);
117116
}
118117

119118
private class ChatMessagePublishingStanzaListener implements StanzaListener {

spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/inbound/package-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@
22
* Provides XMPP inbound Endpoint implementations that extend
33
* {@link org.springframework.integration.xmpp.core.AbstractXmppConnectionAwareEndpoint}.
44
*/
5+
@org.jspecify.annotations.NullMarked
56
package org.springframework.integration.xmpp.inbound;

spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/outbound/ChatMessageSendingMessageHandler.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.jivesoftware.smack.provider.ExtensionElementProvider;
2727
import org.jivesoftware.smack.util.PacketParserUtils;
2828
import org.jivesoftware.smack.xml.XmlPullParser;
29+
import org.jspecify.annotations.Nullable;
2930
import org.jxmpp.jid.Jid;
3031
import org.jxmpp.jid.impl.JidCreate;
3132

@@ -56,7 +57,7 @@ public class ChatMessageSendingMessageHandler extends AbstractXmppConnectionAwar
5657

5758
private XmppHeaderMapper headerMapper = new DefaultXmppHeaderMapper();
5859

59-
private ExtensionElementProvider<? extends ExtensionElement> extensionProvider;
60+
private @Nullable ExtensionElementProvider<? extends ExtensionElement> extensionProvider;
6061

6162
public ChatMessageSendingMessageHandler() {
6263
}
@@ -94,22 +95,21 @@ protected void handleMessageInternal(Message<?> message) {
9495
try {
9596
Object payload = message.getPayload();
9697
MessageBuilder xmppMessageBuilder;
97-
if (payload instanceof org.jivesoftware.smack.packet.Message) {
98-
xmppMessage = (org.jivesoftware.smack.packet.Message) payload;
99-
xmppMessageBuilder = xmppMessage.asBuilder();
98+
if (payload instanceof org.jivesoftware.smack.packet.Message smackMessage) {
99+
xmppMessageBuilder = smackMessage.asBuilder();
100100
}
101101
else {
102102
String to = message.getHeaders().get(XmppHeaders.TO, String.class);
103103
Assert.state(StringUtils.hasText(to), () -> "The '" + XmppHeaders.TO + "' header must not be null");
104104
xmppMessageBuilder = buildXmppMessage(payload, to);
105105
}
106106

107-
if (this.headerMapper != null) {
108-
this.headerMapper.fromHeadersToRequest(message.getHeaders(), xmppMessageBuilder);
109-
}
107+
this.headerMapper.fromHeadersToRequest(message.getHeaders(), xmppMessageBuilder);
110108
XMPPConnection xmppConnection = getXmppConnection();
111-
if (!xmppConnection.isConnected() && xmppConnection instanceof AbstractXMPPConnection) {
112-
((AbstractXMPPConnection) xmppConnection).connect();
109+
if (!xmppConnection.isConnected() &&
110+
xmppConnection instanceof AbstractXMPPConnection abstractXMPPConnection) {
111+
112+
abstractXMPPConnection.connect();
113113
}
114114
xmppMessage = xmppMessageBuilder.build();
115115
xmppConnection.sendStanza(xmppMessage);

spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/outbound/package-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
* These components extend
44
* {@link org.springframework.integration.xmpp.core.AbstractXmppConnectionAwareMessageHandler}
55
*/
6+
@org.jspecify.annotations.NullMarked
67
package org.springframework.integration.xmpp.outbound;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
/**
22
* Root package of the Spring Integration XMPP Module.
33
*/
4+
@org.jspecify.annotations.NullMarked
45
package org.springframework.integration.xmpp;

spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/support/DefaultXmppHeaderMapper.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.jivesoftware.smack.packet.MessageBuilder;
2626
import org.jivesoftware.smackx.jiveproperties.JivePropertiesManager;
2727
import org.jivesoftware.smackx.jiveproperties.packet.JivePropertiesExtension;
28+
import org.jspecify.annotations.Nullable;
2829
import org.jxmpp.jid.Jid;
2930
import org.jxmpp.stringprep.XmppStringprepException;
3031

@@ -86,8 +87,8 @@ protected Map<String, Object> extractStandardHeaders(MessageBuilder source) {
8687
}
8788

8889
@Override
89-
protected Map<String, Object> extractUserDefinedHeaders(MessageBuilder source) {
90-
Map<String, Object> headers = new HashMap<>();
90+
protected Map<String, @Nullable Object> extractUserDefinedHeaders(MessageBuilder source) {
91+
Map<String, @Nullable Object> headers = new HashMap<>();
9192
JivePropertiesExtension jpe = JivePropertiesExtension.from(source.build());
9293
if (jpe == null) {
9394
return headers;

spring-integration-xmpp/src/main/java/org/springframework/integration/xmpp/support/package-info.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
* {@link org.springframework.integration.xmpp.support.XmppHeaderMapper} implementation
44
* in this package.
55
*/
6+
@org.jspecify.annotations.NullMarked
67
package org.springframework.integration.xmpp.support;

0 commit comments

Comments
 (0)