Skip to content

Commit 3cbd699

Browse files
lhotariganesh-ctds
authored andcommitted
[improve][misc] Migrate from multiple nullness annotation libraries to JSpecify annotations (apache#24239)
(cherry picked from commit 9a11245) (cherry picked from commit 62c505d)
1 parent 5d8617e commit 3cbd699

File tree

55 files changed

+157
-115
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+157
-115
lines changed

buildtools/src/main/resources/pulsar/checkstyle.xml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,22 @@ page at http://checkstyle.sourceforge.net/config.html -->
140140
value="autovalue.shaded, avro.shaded, bk-shade, com.google.api.client.repackaged, com.google.appengine.repackaged, org.apache.curator.shaded, org.testcontainers.shaded, org.junit" />
141141
</module>
142142

143+
<module name="IllegalImport">
144+
<property name="illegalPkgs"
145+
value="org.jetbrains.annotations, org.checkerframework.checker.nullness.qual" />
146+
<property name="illegalClasses"
147+
value="javax.annotation.Nullable, javax.annotation.Nonnull" />
148+
<message key="import.illegal"
149+
value="{0}; Use org.jspecify.annotations.Nullable and org.jspecify.annotations.NonNull instead."/>
150+
</module>
151+
152+
<module name="IllegalImport">
153+
<property name="illegalClasses"
154+
value="javax.validation.constraints.Null, javax.validation.constraints.NotNull" />
155+
<message key="import.illegal"
156+
value="{0}; Use org.jspecify.annotations.Nullable and org.jspecify.annotations.NonNull for nullness information. Check Jakarta Bean Validation API if you are looking for user input validation with annotations."/>
157+
</module>
158+
143159
<module name="RedundantModifier">
144160
<!-- Checks for redundant modifiers on various symbol definitions.
145161
See: http://checkstyle.sourceforge.net/config_modifier.html#RedundantModifier

distribution/server/src/assemble/LICENSE.bin.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,8 @@ The Apache Software License, Version 2.0
539539
- io.opentelemetry.semconv-opentelemetry-semconv-1.29.0-alpha.jar
540540
* Spotify completable-futures
541541
- com.spotify-completable-futures-0.3.6.jar
542+
* JSpecify
543+
- org.jspecify-jspecify-1.0.0.jar
542544

543545
BSD 3-clause "New" or "Revised" License
544546
* Google auth library

distribution/shell/src/assemble/LICENSE.bin.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -420,6 +420,7 @@ The Apache Software License, Version 2.0
420420
* Spotify completable-futures -- completable-futures-0.3.6.jar
421421
* RoaringBitmap -- RoaringBitmap-1.2.0.jar
422422
* Fastutil -- fastutil-8.5.14.jar
423+
* JSpecify -- jspecify-1.0.0.jar
423424

424425
BSD 3-clause "New" or "Revised" License
425426
* JSR305 -- jsr305-3.0.2.jar -- ../licenses/LICENSE-JSR305.txt

managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/AckSetState.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
*/
1919
package org.apache.bookkeeper.mledger.impl;
2020

21-
import javax.annotation.Nullable;
21+
import org.jspecify.annotations.Nullable;
2222

2323
/**
2424
* Interface to manage the ackSet state attached to a position.

managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedCursorImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@
6363
import java.util.function.Predicate;
6464
import java.util.stream.Collectors;
6565
import java.util.stream.LongStream;
66-
import javax.annotation.Nullable;
6766
import lombok.Getter;
6867
import org.apache.bookkeeper.client.AsyncCallback.CloseCallback;
6968
import org.apache.bookkeeper.client.AsyncCallback.OpenCallback;
@@ -113,6 +112,7 @@
113112
import org.apache.pulsar.common.util.collections.LongPairRangeSet.LongPairConsumer;
114113
import org.apache.pulsar.common.util.collections.LongPairRangeSet.RangeBoundConsumer;
115114
import org.apache.pulsar.metadata.api.Stat;
115+
import org.jspecify.annotations.Nullable;
116116
import org.slf4j.Logger;
117117
import org.slf4j.LoggerFactory;
118118

managed-ledger/src/main/java/org/apache/bookkeeper/mledger/impl/ManagedLedgerImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,6 @@
6868
import java.util.function.Predicate;
6969
import java.util.function.Supplier;
7070
import java.util.stream.Collectors;
71-
import javax.annotation.Nullable;
7271
import lombok.Getter;
7372
import org.apache.bookkeeper.client.AsyncCallback;
7473
import org.apache.bookkeeper.client.AsyncCallback.CreateCallback;
@@ -150,6 +149,7 @@
150149
import org.apache.pulsar.common.util.LazyLoadableValue;
151150
import org.apache.pulsar.common.util.collections.ConcurrentLongHashMap;
152151
import org.apache.pulsar.metadata.api.Stat;
152+
import org.jspecify.annotations.Nullable;
153153
import org.slf4j.Logger;
154154
import org.slf4j.LoggerFactory;
155155

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1639,6 +1639,11 @@ flexible messaging model and an intuitive client API.</description>
16391639
<artifactId>checker-qual</artifactId>
16401640
<version>${checkerframework.version}</version>
16411641
</dependency>
1642+
<dependency>
1643+
<groupId>org.jspecify</groupId>
1644+
<artifactId>jspecify</artifactId>
1645+
<version>1.0.0</version>
1646+
</dependency>
16421647

16431648
<dependency>
16441649
<groupId>io.rest-assured</groupId>

pulsar-broker-auth-oidc/src/main/java/org/apache/pulsar/broker/authentication/oidc/OpenIDProviderMetadataCache.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,11 @@
4040
import java.util.Optional;
4141
import java.util.concurrent.CompletableFuture;
4242
import java.util.concurrent.TimeUnit;
43-
import javax.annotation.Nonnull;
4443
import javax.naming.AuthenticationException;
4544
import org.apache.pulsar.broker.ServiceConfiguration;
4645
import org.apache.pulsar.broker.authentication.AuthenticationProvider;
4746
import org.asynchttpclient.AsyncHttpClient;
47+
import org.jspecify.annotations.NonNull;
4848

4949
/**
5050
* Class used to cache metadata responses from OpenID Providers.
@@ -94,7 +94,7 @@ class OpenIDProviderMetadataCache {
9494
* @return the {@link OpenIDProviderMetadata} for the given issuer. Fail the completable future with
9595
* AuthenticationException if any exceptions occur while retrieving the metadata.
9696
*/
97-
CompletableFuture<OpenIDProviderMetadata> getOpenIDProviderMetadataForIssuer(@Nonnull String issuer) {
97+
CompletableFuture<OpenIDProviderMetadata> getOpenIDProviderMetadataForIssuer(@NonNull String issuer) {
9898
return cache.get(Optional.of(issuer));
9999
}
100100

@@ -221,7 +221,7 @@ public void onDownloadProgress(long bytesRead, long contentLength, boolean done)
221221
* @param isK8s - whether the issuer is represented by the Kubernetes API server. This affects error reporting.
222222
* @throws AuthenticationException if the issuer does not exactly match the metadata issuer
223223
*/
224-
private void verifyIssuer(@Nonnull String issuer, OpenIDProviderMetadata metadata,
224+
private void verifyIssuer(@NonNull String issuer, OpenIDProviderMetadata metadata,
225225
boolean isK8s) throws AuthenticationException {
226226
if (!issuer.equals(metadata.getIssuer())) {
227227
if (isK8s) {

pulsar-broker/pom.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,10 @@
319319
<groupId>com.google.guava</groupId>
320320
<artifactId>guava</artifactId>
321321
</dependency>
322+
<dependency>
323+
<groupId>org.jspecify</groupId>
324+
<artifactId>jspecify</artifactId>
325+
</dependency>
322326

323327
<dependency>
324328
<groupId>${project.groupId}</groupId>

pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/NamespacesBase.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@
4343
import java.util.function.Function;
4444
import java.util.stream.Collectors;
4545
import java.util.stream.Stream;
46-
import javax.annotation.Nonnull;
4746
import javax.ws.rs.WebApplicationException;
4847
import javax.ws.rs.container.AsyncResponse;
4948
import javax.ws.rs.core.Response;
@@ -118,6 +117,7 @@
118117
import org.apache.pulsar.metadata.api.MetadataStoreException.BadVersionException;
119118
import org.apache.pulsar.metadata.api.MetadataStoreException.NotFoundException;
120119
import org.apache.zookeeper.KeeperException;
120+
import org.jspecify.annotations.NonNull;
121121

122122
@Slf4j
123123
public abstract class NamespacesBase extends AdminResource {
@@ -211,13 +211,13 @@ protected CompletableFuture<List<String>> internalGetNonPersistentTopics(Policie
211211
* Delete the namespace and retry to resolve some topics that were not created successfully(in metadata)
212212
* during the deletion.
213213
*/
214-
protected @Nonnull CompletableFuture<Void> internalDeleteNamespaceAsync(boolean force) {
214+
protected @NonNull CompletableFuture<Void> internalDeleteNamespaceAsync(boolean force) {
215215
final CompletableFuture<Void> future = new CompletableFuture<>();
216216
internalRetryableDeleteNamespaceAsync0(force, 5, future);
217217
return future;
218218
}
219219
private void internalRetryableDeleteNamespaceAsync0(boolean force, int retryTimes,
220-
@Nonnull CompletableFuture<Void> callback) {
220+
@NonNull CompletableFuture<Void> callback) {
221221
precheckWhenDeleteNamespace(namespaceName, force)
222222
.thenCompose(policies -> {
223223
final CompletableFuture<List<String>> topicsFuture;

pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/impl/PersistentTopicsBase.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
import java.util.function.BiConsumer;
5050
import java.util.stream.Collectors;
5151
import java.util.stream.IntStream;
52-
import javax.annotation.Nonnull;
5352
import javax.ws.rs.WebApplicationException;
5453
import javax.ws.rs.container.AsyncResponse;
5554
import javax.ws.rs.core.Response;
@@ -151,6 +150,7 @@
151150
import org.apache.pulsar.compaction.Compactor;
152151
import org.apache.pulsar.metadata.api.MetadataStoreException;
153152
import org.apache.pulsar.transaction.coordinator.TransactionCoordinatorID;
153+
import org.jspecify.annotations.NonNull;
154154
import org.slf4j.Logger;
155155
import org.slf4j.LoggerFactory;
156156

@@ -357,7 +357,7 @@ protected CompletableFuture<Void> internalCreateNonPartitionedTopicAsync(boolean
357357
* @exception RestException Unprocessable entity, status code: 422. throw it when some pre-check failed.
358358
* @exception RestException Internal Server Error, status code: 500. throw it when get unknown Exception
359359
*/
360-
protected @Nonnull CompletableFuture<Void> internalUpdatePartitionedTopicAsync(int expectPartitions,
360+
protected @NonNull CompletableFuture<Void> internalUpdatePartitionedTopicAsync(int expectPartitions,
361361
boolean updateLocal,
362362
boolean force) {
363363
PulsarService pulsarService = pulsar();

pulsar-broker/src/main/java/org/apache/pulsar/broker/admin/v3/Transactions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
import org.apache.pulsar.common.policies.data.TransactionPendingAckStats;
5757
import org.apache.pulsar.common.stats.PositionInPendingAckStats;
5858
import org.apache.pulsar.common.util.FutureUtil;
59-
import org.jetbrains.annotations.Nullable;
59+
import org.jspecify.annotations.Nullable;
6060

6161
@Path("/transactions")
6262
@Produces(MediaType.APPLICATION_JSON)

pulsar-broker/src/main/java/org/apache/pulsar/broker/delayed/bucket/BookkeeperBucketSnapshotStorage.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import java.util.Optional;
2929
import java.util.concurrent.CompletableFuture;
3030
import java.util.concurrent.ConcurrentHashMap;
31-
import javax.validation.constraints.NotNull;
3231
import lombok.extern.slf4j.Slf4j;
3332
import org.apache.bookkeeper.client.BKException;
3433
import org.apache.bookkeeper.client.BookKeeper;
@@ -41,6 +40,7 @@
4140
import org.apache.pulsar.broker.delayed.proto.SnapshotSegment;
4241
import org.apache.pulsar.common.allocator.PulsarByteBufAllocator;
4342
import org.apache.pulsar.common.util.FutureUtil;
43+
import org.jspecify.annotations.NonNull;
4444

4545
@Slf4j
4646
public class BookkeeperBucketSnapshotStorage implements BucketSnapshotStorage {
@@ -165,7 +165,7 @@ private List<SnapshotSegment> parseSnapshotSegmentEntries(Enumeration<LedgerEntr
165165
return snapshotMetadataList;
166166
}
167167

168-
@NotNull
168+
@NonNull
169169
private CompletableFuture<LedgerHandle> createLedger(String bucketKey, String topicName, String cursorName) {
170170
CompletableFuture<LedgerHandle> future = new CompletableFuture<>();
171171
Map<String, byte[]> metadata = LedgerMetadataUtils.buildMetadataForDelayedIndexBucket(bucketKey,

pulsar-broker/src/main/java/org/apache/pulsar/broker/namespace/NamespaceEphemeralData.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@
2121
import java.util.Collections;
2222
import java.util.HashMap;
2323
import java.util.Map;
24-
import javax.validation.constraints.NotNull;
2524
import lombok.Data;
2625
import lombok.NoArgsConstructor;
2726
import org.apache.pulsar.policies.data.loadbalancer.AdvertisedListener;
27+
import org.jspecify.annotations.NonNull;
2828

2929
@Data
3030
@NoArgsConstructor
@@ -55,7 +55,7 @@ public NamespaceEphemeralData(String brokerUrl, String brokerUrlTls, String http
5555
}
5656
}
5757

58-
@NotNull
58+
@NonNull
5959
public Map<String, AdvertisedListener> getAdvertisedListeners() {
6060
if (this.advertisedListeners == null) {
6161
return Collections.emptyMap();

pulsar-broker/src/main/java/org/apache/pulsar/broker/namespace/NamespaceService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@
5252
import java.util.regex.Matcher;
5353
import java.util.regex.Pattern;
5454
import java.util.stream.Collectors;
55-
import javax.annotation.Nullable;
5655
import lombok.extern.slf4j.Slf4j;
5756
import org.apache.commons.collections4.CollectionUtils;
5857
import org.apache.commons.collections4.ListUtils;
@@ -114,6 +113,7 @@
114113
import org.apache.pulsar.opentelemetry.annotations.PulsarDeprecatedMetric;
115114
import org.apache.pulsar.policies.data.loadbalancer.AdvertisedListener;
116115
import org.apache.pulsar.policies.data.loadbalancer.LocalBrokerData;
116+
import org.jspecify.annotations.Nullable;
117117
import org.slf4j.Logger;
118118
import org.slf4j.LoggerFactory;
119119

pulsar-broker/src/main/java/org/apache/pulsar/broker/service/AbstractBaseDispatcher.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
import org.apache.pulsar.common.protocol.Commands;
5454
import org.apache.pulsar.common.protocol.Markers;
5555
import org.apache.pulsar.compaction.Compactor;
56-
import org.checkerframework.checker.nullness.qual.Nullable;
56+
import org.jspecify.annotations.Nullable;
5757

5858
@Slf4j
5959
public abstract class AbstractBaseDispatcher extends EntryFilterSupport implements Dispatcher {

pulsar-broker/src/main/java/org/apache/pulsar/broker/service/AbstractTopic.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
import java.util.concurrent.atomic.LongAdder;
4747
import java.util.concurrent.locks.ReentrantReadWriteLock;
4848
import java.util.function.ToLongFunction;
49-
import javax.annotation.Nonnull;
5049
import lombok.Getter;
5150
import lombok.Setter;
5251
import org.apache.bookkeeper.mledger.util.StatsBuckets;
@@ -88,6 +87,7 @@
8887
import org.apache.pulsar.common.protocol.schema.SchemaData;
8988
import org.apache.pulsar.common.protocol.schema.SchemaVersion;
9089
import org.apache.pulsar.common.util.FutureUtil;
90+
import org.jspecify.annotations.NonNull;
9191
import org.slf4j.Logger;
9292
import org.slf4j.LoggerFactory;
9393

@@ -1168,7 +1168,7 @@ public void updateResourceGroupLimiter(Optional<Policies> optPolicies) {
11681168
updateResourceGroupLimiter(policies);
11691169
}
11701170

1171-
public void updateResourceGroupLimiter(@Nonnull Policies namespacePolicies) {
1171+
public void updateResourceGroupLimiter(@NonNull Policies namespacePolicies) {
11721172
requireNonNull(namespacePolicies);
11731173
// attach the resource-group level rate limiters, if set
11741174
String rgName = namespacePolicies.resource_group_name;

pulsar-broker/src/main/java/org/apache/pulsar/broker/service/BrokerService.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,6 @@
8080
import java.util.concurrent.locks.ReentrantReadWriteLock;
8181
import java.util.function.Consumer;
8282
import java.util.function.Predicate;
83-
import javax.annotation.Nonnull;
84-
import javax.annotation.Nullable;
8583
import lombok.AccessLevel;
8684
import lombok.AllArgsConstructor;
8785
import lombok.Getter;
@@ -196,6 +194,8 @@
196194
import org.apache.pulsar.opentelemetry.annotations.PulsarDeprecatedMetric;
197195
import org.apache.pulsar.policies.data.loadbalancer.NamespaceBundleStats;
198196
import org.apache.pulsar.transaction.coordinator.TransactionMetadataStore;
197+
import org.jspecify.annotations.NonNull;
198+
import org.jspecify.annotations.Nullable;
199199
import org.slf4j.Logger;
200200
import org.slf4j.LoggerFactory;
201201

@@ -1202,7 +1202,7 @@ public CompletableFuture<Optional<Topic>> getTopic(final TopicName topicName, bo
12021202
}
12031203
}
12041204

1205-
private CompletableFuture<Optional<TopicPolicies>> getTopicPoliciesBypassSystemTopic(@Nonnull TopicName topicName) {
1205+
private CompletableFuture<Optional<TopicPolicies>> getTopicPoliciesBypassSystemTopic(@NonNull TopicName topicName) {
12061206
if (ExtensibleLoadManagerImpl.isInternalTopic(topicName.toString())) {
12071207
return CompletableFuture.completedFuture(Optional.empty());
12081208
}
@@ -1935,14 +1935,14 @@ private CompletableFuture<Void> checkTopicAlreadyMigrated(TopicName topicName) {
19351935
return result;
19361936
}
19371937

1938-
public CompletableFuture<ManagedLedgerConfig> getManagedLedgerConfig(@Nonnull TopicName topicName) {
1938+
public CompletableFuture<ManagedLedgerConfig> getManagedLedgerConfig(@NonNull TopicName topicName) {
19391939
final CompletableFuture<Optional<TopicPolicies>> topicPoliciesFuture =
19401940
getTopicPoliciesBypassSystemTopic(topicName);
19411941
return topicPoliciesFuture.thenCompose(optionalTopicPolicies ->
19421942
getManagedLedgerConfig(topicName, optionalTopicPolicies.orElse(null)));
19431943
}
19441944

1945-
private CompletableFuture<ManagedLedgerConfig> getManagedLedgerConfig(@Nonnull TopicName topicName,
1945+
private CompletableFuture<ManagedLedgerConfig> getManagedLedgerConfig(@NonNull TopicName topicName,
19461946
@Nullable TopicPolicies topicPolicies) {
19471947
requireNonNull(topicName);
19481948
NamespaceName namespace = topicName.getNamespaceObject();
@@ -3598,7 +3598,7 @@ private AutoTopicCreationOverride getAutoTopicCreationOverride(final TopicName t
35983598
return null;
35993599
}
36003600

3601-
public @Nonnull CompletableFuture<Boolean> isAllowAutoSubscriptionCreationAsync(@Nonnull TopicName tpName) {
3601+
public @NonNull CompletableFuture<Boolean> isAllowAutoSubscriptionCreationAsync(@NonNull TopicName tpName) {
36023602
requireNonNull(tpName);
36033603
// Policies priority: topic level -> namespace level -> broker level
36043604
if (ExtensibleLoadManagerImpl.isInternalTopic(tpName.toString())) {

pulsar-broker/src/main/java/org/apache/pulsar/broker/service/ConsumerHashAssignmentsSnapshot.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
import lombok.ToString;
3333
import org.apache.commons.lang3.tuple.Pair;
3434
import org.apache.pulsar.client.api.Range;
35-
import org.jetbrains.annotations.NotNull;
35+
import org.jspecify.annotations.NonNull;
3636

3737
/**
3838
* Represents the hash ranges assigned to each consumer in a {@link StickyKeyConsumerSelector} at a point in time.
@@ -86,7 +86,7 @@ public synchronized Map<Consumer, List<Range>> getRangesByConsumer() {
8686
return cachedRangesByConsumer;
8787
}
8888

89-
private @NotNull Map<Consumer, List<Range>> internalGetRangesByConsumer() {
89+
private @NonNull Map<Consumer, List<Range>> internalGetRangesByConsumer() {
9090
Map<Consumer, SortedSet<Range>> rangesByConsumer = new IdentityHashMap<>();
9191
hashRangeAssignments.forEach(entry -> {
9292
Range range = entry.range();

pulsar-broker/src/main/java/org/apache/pulsar/broker/service/EntryAndMetadata.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@
2121
import com.google.common.annotations.VisibleForTesting;
2222
import io.netty.buffer.ByteBuf;
2323
import java.util.function.ToIntFunction;
24-
import javax.annotation.Nullable;
2524
import lombok.Getter;
2625
import org.apache.bookkeeper.mledger.Entry;
2726
import org.apache.bookkeeper.mledger.Position;
2827
import org.apache.pulsar.common.api.proto.MessageMetadata;
2928
import org.apache.pulsar.common.protocol.Commands;
29+
import org.jspecify.annotations.Nullable;
3030

3131
public class EntryAndMetadata implements Entry {
3232
private static final int STICKY_KEY_HASH_NOT_INITIALIZED = -1;

0 commit comments

Comments
 (0)