Skip to content

Commit 1aae16a

Browse files
committed
Unified addSubscriptions/addTopicFilters/addAll implementations
1 parent cf70523 commit 1aae16a

File tree

13 files changed

+240
-432
lines changed

13 files changed

+240
-432
lines changed

src/main/java/com/hivemq/client/internal/mqtt/datatypes/MqttUserPropertiesImplBuilder.java

+14-6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package com.hivemq.client.internal.mqtt.datatypes;
1919

2020
import com.hivemq.client.internal.mqtt.util.MqttChecks;
21+
import com.hivemq.client.internal.util.Checks;
2122
import com.hivemq.client.internal.util.collections.ImmutableList;
2223
import com.hivemq.client.mqtt.datatypes.MqttUtf8String;
2324
import com.hivemq.client.mqtt.mqtt5.datatypes.Mqtt5UserPropertiesBuilder;
@@ -63,18 +64,25 @@ public abstract class MqttUserPropertiesImplBuilder<B extends MqttUserProperties
6364
return self();
6465
}
6566

66-
public @NotNull B addAll(final @Nullable Collection<Mqtt5UserProperty> userProperties) {
67-
listBuilder.addAll(MqttChecks.userPropertiesInCollection(userProperties));
67+
public @NotNull B addAll(final @Nullable Mqtt5UserProperty @Nullable ... userProperties) {
68+
Checks.notNull(userProperties, "User Properties");
69+
listBuilder.ensureFree(userProperties.length);
70+
for (final Mqtt5UserProperty userProperty : userProperties) {
71+
add(userProperty);
72+
}
6873
return self();
6974
}
7075

71-
public @NotNull B addAll(final @Nullable Mqtt5UserProperty... userProperties) {
72-
listBuilder.addAll(MqttChecks.userPropertiesInArray(userProperties));
76+
public @NotNull B addAll(final @Nullable Collection<@Nullable Mqtt5UserProperty> userProperties) {
77+
Checks.notNull(userProperties, "User Properties");
78+
listBuilder.ensureFree(userProperties.size());
79+
userProperties.forEach(this::add);
7380
return self();
7481
}
7582

76-
public @NotNull B addAll(final @Nullable Stream<Mqtt5UserProperty> userProperties) {
77-
listBuilder.addAll(MqttChecks.userPropertiesInStream(userProperties));
83+
public @NotNull B addAll(final @Nullable Stream<@Nullable Mqtt5UserProperty> userProperties) {
84+
Checks.notNull(userProperties, "User Properties");
85+
userProperties.forEach(this::add);
7886
return self();
7987
}
8088

src/main/java/com/hivemq/client/internal/mqtt/message/subscribe/MqttSubscribeBuilder.java

+31-37
Original file line numberDiff line numberDiff line change
@@ -63,52 +63,47 @@ protected MqttSubscribeBuilder() {
6363
return self();
6464
}
6565

66-
public @NotNull B addSubscriptions(final @Nullable Collection<Mqtt5Subscription> subscriptions) {
67-
buildFirstSubscription();
66+
public @NotNull MqttSubscriptionBuilder.Nested<B> addSubscription() {
67+
return new MqttSubscriptionBuilder.Nested<>(this::addSubscription);
68+
}
6869

70+
public @NotNull B addSubscriptions(final @Nullable Mqtt5Subscription @Nullable ... subscriptions) {
6971
Checks.notNull(subscriptions, "Subscriptions");
70-
Checks.atLeastOneElement(subscriptions, "Subscriptions");
71-
72-
subscriptionsBuilder.addAll(
73-
Checks.elementsNotNullAndNotImplemented(subscriptions, MqttSubscription.class, "Subscriptions"));
72+
buildFirstSubscription();
73+
subscriptionsBuilder.ensureFree(subscriptions.length);
74+
for (final Mqtt5Subscription subscription : subscriptions) {
75+
addSubscription(subscription);
76+
}
77+
ensureAtLeastOneSubscription();
7478
return self();
7579
}
7680

77-
public @NotNull B addSubscriptions(final @Nullable Mqtt5Subscription... subscriptions) {
78-
buildFirstSubscription();
79-
81+
public @NotNull B addSubscriptions(final @Nullable Collection<@Nullable Mqtt5Subscription> subscriptions) {
8082
Checks.notNull(subscriptions, "Subscriptions");
81-
Checks.atLeastOneElement(subscriptions, "Subscriptions");
82-
83-
//noinspection NullableProblems
84-
subscriptionsBuilder.addAll(
85-
Checks.elementsNotNullAndNotImplemented(subscriptions, MqttSubscription.class, "Subscriptions"));
83+
buildFirstSubscription();
84+
subscriptionsBuilder.ensureFree(subscriptions.size());
85+
subscriptions.forEach(this::addSubscription);
86+
ensureAtLeastOneSubscription();
8687
return self();
8788
}
8889

89-
public @NotNull B addSubscriptions(final @Nullable Stream<Mqtt5Subscription> subscriptions) {
90-
buildFirstSubscription();
91-
90+
public @NotNull B addSubscriptions(final @Nullable Stream<@Nullable Mqtt5Subscription> subscriptions) {
9291
Checks.notNull(subscriptions, "Subscriptions");
93-
94-
final ImmutableList<MqttSubscription> subscriptionImmutableList =
95-
Checks.elementsNotNullAndNotImplemented(subscriptions, MqttSubscription.class, "Subscriptions");
96-
97-
Checks.atLeastOneElement(subscriptionImmutableList, "Subscriptions");
98-
99-
subscriptionsBuilder.addAll(subscriptionImmutableList);
92+
buildFirstSubscription();
93+
subscriptions.forEach(this::addSubscription);
94+
ensureAtLeastOneSubscription();
10095
return self();
10196
}
10297

103-
public @NotNull MqttSubscriptionBuilder.Nested<B> addSubscription() {
104-
return new MqttSubscriptionBuilder.Nested<>(this::addSubscription);
105-
}
106-
10798
public @NotNull B userProperties(final @Nullable Mqtt5UserProperties userProperties) {
10899
this.userProperties = MqttChecks.userProperties(userProperties);
109100
return self();
110101
}
111102

103+
public @NotNull MqttUserPropertiesImplBuilder.Nested<B> userProperties() {
104+
return new MqttUserPropertiesImplBuilder.Nested<>(userProperties, this::userProperties);
105+
}
106+
112107
private @NotNull MqttSubscriptionBuilder.Default getFirstSubscriptionBuilder() {
113108
if (firstSubscriptionBuilder == null) {
114109
firstSubscriptionBuilder = new MqttSubscriptionBuilder.Default();
@@ -123,10 +118,6 @@ private void buildFirstSubscription() {
123118
}
124119
}
125120

126-
public @NotNull MqttUserPropertiesImplBuilder.Nested<B> userProperties() {
127-
return new MqttUserPropertiesImplBuilder.Nested<>(userProperties, this::userProperties);
128-
}
129-
130121
public @NotNull B topicFilter(final @Nullable String topicFilter) {
131122
getFirstSubscriptionBuilder().topicFilter(topicFilter);
132123
return self();
@@ -161,13 +152,16 @@ private void buildFirstSubscription() {
161152
return self();
162153
}
163154

164-
public @NotNull MqttSubscribe build() {
165-
buildFirstSubscription();
166-
final ImmutableList<MqttSubscription> subscriptions = subscriptionsBuilder.build();
167-
if (subscriptions.isEmpty()) {
155+
private void ensureAtLeastOneSubscription() {
156+
if (subscriptionsBuilder.getSize() == 0) {
168157
throw new IllegalStateException("At least one subscription must be added.");
169158
}
170-
return new MqttSubscribe(subscriptions, userProperties);
159+
}
160+
161+
public @NotNull MqttSubscribe build() {
162+
buildFirstSubscription();
163+
ensureAtLeastOneSubscription();
164+
return new MqttSubscribe(subscriptionsBuilder.build(), userProperties);
171165
}
172166

173167
public static class Default extends MqttSubscribeBuilder<Default> implements Mqtt5SubscribeBuilder.Start.Complete {

src/main/java/com/hivemq/client/internal/mqtt/message/subscribe/mqtt3/Mqtt3SubscribeViewBuilder.java

+27-39
Original file line numberDiff line numberDiff line change
@@ -59,53 +59,38 @@ protected Mqtt3SubscribeViewBuilder() {
5959
return self();
6060
}
6161

62-
public @NotNull B addSubscriptions(final @Nullable Collection<Mqtt3Subscription> subscriptions) {
63-
buildFirstSubscription();
62+
public @NotNull Mqtt3SubscriptionViewBuilder.Nested<B> addSubscription() {
63+
return new Mqtt3SubscriptionViewBuilder.Nested<>(this::addSubscription);
64+
}
6465

66+
public @NotNull B addSubscriptions(final @Nullable Mqtt3Subscription @Nullable ... subscriptions) {
6567
Checks.notNull(subscriptions, "Subscriptions");
66-
Checks.atLeastOneElement(subscriptions, "Subscriptions");
67-
68-
final ImmutableList<Mqtt3SubscriptionView> mqtt3SubscriptionViews =
69-
Checks.elementsNotNullAndNotImplemented(subscriptions, Mqtt3SubscriptionView.class, "Subscriptions");
70-
71-
mqtt3SubscriptionViews.forEach(subscription -> subscriptionsBuilder.add(subscription.getDelegate()));
72-
68+
buildFirstSubscription();
69+
subscriptionsBuilder.ensureFree(subscriptions.length);
70+
for (final Mqtt3Subscription subscription : subscriptions) {
71+
addSubscription(subscription);
72+
}
73+
ensureAtLeastOneSubscription();
7374
return self();
7475
}
7576

76-
public @NotNull B addSubscriptions(final @Nullable Mqtt3Subscription... subscriptions) {
77-
buildFirstSubscription();
78-
77+
public @NotNull B addSubscriptions(final @Nullable Collection<@Nullable Mqtt3Subscription> subscriptions) {
7978
Checks.notNull(subscriptions, "Subscriptions");
80-
Checks.atLeastOneElement(subscriptions, "Subscriptions");
81-
82-
//noinspection NullableProblems
83-
final ImmutableList<Mqtt3SubscriptionView> mqtt3SubscriptionViews =
84-
Checks.elementsNotNullAndNotImplemented(subscriptions, Mqtt3SubscriptionView.class, "Subscriptions");
85-
86-
mqtt3SubscriptionViews.forEach(subscription -> subscriptionsBuilder.add(subscription.getDelegate()));
79+
buildFirstSubscription();
80+
subscriptionsBuilder.ensureFree(subscriptions.size());
81+
subscriptions.forEach(this::addSubscription);
82+
ensureAtLeastOneSubscription();
8783
return self();
8884
}
8985

90-
public @NotNull B addSubscriptions(final @Nullable Stream<Mqtt3Subscription> subscriptions) {
91-
buildFirstSubscription();
92-
86+
public @NotNull B addSubscriptions(final @Nullable Stream<@Nullable Mqtt3Subscription> subscriptions) {
9387
Checks.notNull(subscriptions, "Subscriptions");
94-
95-
final ImmutableList<Mqtt3SubscriptionView> mqtt3SubscriptionViews =
96-
Checks.elementsNotNullAndNotImplemented(subscriptions, Mqtt3SubscriptionView.class, "Subscriptions");
97-
98-
Checks.atLeastOneElement(mqtt3SubscriptionViews, "Subscriptions");
99-
100-
mqtt3SubscriptionViews.forEach(subscription -> subscriptionsBuilder.add(subscription.getDelegate()));
101-
88+
buildFirstSubscription();
89+
subscriptions.forEach(this::addSubscription);
90+
ensureAtLeastOneSubscription();
10291
return self();
10392
}
10493

105-
public @NotNull Mqtt3SubscriptionViewBuilder.Nested<B> addSubscription() {
106-
return new Mqtt3SubscriptionViewBuilder.Nested<>(this::addSubscription);
107-
}
108-
10994
private @NotNull Mqtt3SubscriptionViewBuilder.Default getFirstSubscriptionBuilder() {
11095
if (firstSubscriptionBuilder == null) {
11196
firstSubscriptionBuilder = new Mqtt3SubscriptionViewBuilder.Default();
@@ -139,13 +124,16 @@ private void buildFirstSubscription() {
139124
return self();
140125
}
141126

142-
public @NotNull Mqtt3SubscribeView build() {
143-
buildFirstSubscription();
144-
final ImmutableList<MqttSubscription> subscriptions = subscriptionsBuilder.build();
145-
if (subscriptions.isEmpty()) {
127+
private void ensureAtLeastOneSubscription() {
128+
if (subscriptionsBuilder.getSize() == 0) {
146129
throw new IllegalStateException("At least one subscription must be added.");
147130
}
148-
return Mqtt3SubscribeView.of(subscriptions);
131+
}
132+
133+
public @NotNull Mqtt3SubscribeView build() {
134+
buildFirstSubscription();
135+
ensureAtLeastOneSubscription();
136+
return Mqtt3SubscribeView.of(subscriptionsBuilder.build());
149137
}
150138

151139
public static class Default extends Mqtt3SubscribeViewBuilder<Default>

src/main/java/com/hivemq/client/internal/mqtt/message/unsubscribe/MqttUnsubscribeBuilder.java

+22-29
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,7 @@
3333
import org.jetbrains.annotations.Nullable;
3434

3535
import java.util.Collection;
36-
import java.util.List;
3736
import java.util.function.Function;
38-
import java.util.stream.Collectors;
3937
import java.util.stream.Stream;
4038

4139
/**
@@ -68,41 +66,33 @@ public abstract class MqttUnsubscribeBuilder<B extends MqttUnsubscribeBuilder<B>
6866
return self();
6967
}
7068

71-
public @NotNull B addTopicFilters(final @Nullable Collection<MqttTopicFilter> topicFilters) {
72-
Checks.notNull(topicFilters, "Topic Filters");
73-
Checks.atLeastOneElement(topicFilters, "Topic Filters");
74-
Checks.elementsNotNull(topicFilters, "Topic Filters");
75-
76-
topicFilters.forEach(topicFilter -> topicFiltersBuilder.add(MqttChecks.topicFilter(topicFilter)));
77-
return self();
69+
public @NotNull MqttTopicFilterImplBuilder.Nested<B> addTopicFilter() {
70+
return new MqttTopicFilterImplBuilder.Nested<>(this::addTopicFilter);
7871
}
7972

80-
public @NotNull B addTopicFilters(final @Nullable MqttTopicFilter... topicFilters) {
73+
public @NotNull B addTopicFilters(final @Nullable MqttTopicFilter @Nullable ... topicFilters) {
8174
Checks.notNull(topicFilters, "Topic Filters");
82-
Checks.atLeastOneElement(topicFilters, "Topic Filters");
83-
Checks.elementsNotNull(topicFilters, "Topic Filters");
84-
75+
topicFiltersBuilder.ensureFree(topicFilters.length);
8576
for (final MqttTopicFilter topicFilter : topicFilters) {
86-
topicFiltersBuilder.add(MqttChecks.topicFilter(topicFilter));
77+
addTopicFilter(topicFilter);
8778
}
88-
79+
ensureAtLeastOneSubscription();
8980
return self();
9081
}
9182

92-
public @NotNull B addTopicFilters(final @Nullable Stream<MqttTopicFilter> topicFilters) {
83+
public @NotNull B addTopicFilters(final @Nullable Collection<@Nullable MqttTopicFilter> topicFilters) {
9384
Checks.notNull(topicFilters, "Topic Filters");
94-
95-
final List<MqttTopicFilter> topicFilterList = topicFilters.collect(Collectors.toList());
96-
97-
Checks.atLeastOneElement(topicFilterList, "Topic Filters");
98-
Checks.elementsNotNull(topicFilterList, "Topic Filters");
99-
100-
topicFilterList.forEach(topicFilter -> topicFiltersBuilder.add(MqttChecks.topicFilter(topicFilter)));
85+
topicFiltersBuilder.ensureFree(topicFilters.size());
86+
topicFilters.forEach(this::addTopicFilter);
87+
ensureAtLeastOneSubscription();
10188
return self();
10289
}
10390

104-
public @NotNull MqttTopicFilterImplBuilder.Nested<B> addTopicFilter() {
105-
return new MqttTopicFilterImplBuilder.Nested<>(this::addTopicFilter);
91+
public @NotNull B addTopicFilters(final @Nullable Stream<@Nullable MqttTopicFilter> topicFilters) {
92+
Checks.notNull(topicFilters, "Topic Filters");
93+
topicFilters.forEach(this::addTopicFilter);
94+
ensureAtLeastOneSubscription();
95+
return self();
10696
}
10797

10898
public @NotNull B reverse(final @Nullable Mqtt5Subscribe subscribe) {
@@ -134,12 +124,15 @@ public abstract class MqttUnsubscribeBuilder<B extends MqttUnsubscribeBuilder<B>
134124
return new MqttTopicFilterImplBuilder.Nested<>(this::topicFilter);
135125
}
136126

137-
public @NotNull MqttUnsubscribe build() {
138-
final ImmutableList<MqttTopicFilterImpl> topicFilters = topicFiltersBuilder.build();
139-
if (topicFilters.isEmpty()) {
127+
private void ensureAtLeastOneSubscription() {
128+
if (topicFiltersBuilder.getSize() == 0) {
140129
throw new IllegalStateException("At least one topic filter must be added.");
141130
}
142-
return new MqttUnsubscribe(topicFilters, userProperties);
131+
}
132+
133+
public @NotNull MqttUnsubscribe build() {
134+
ensureAtLeastOneSubscription();
135+
return new MqttUnsubscribe(topicFiltersBuilder.build(), userProperties);
143136
}
144137

145138
public static class Default extends MqttUnsubscribeBuilder<Default>

0 commit comments

Comments
 (0)