Skip to content

Commit 472962e

Browse files
Introduce Flux#using{When} reactor refaster rules
1 parent 33d9bad commit 472962e

File tree

3 files changed

+200
-0
lines changed

3 files changed

+200
-0
lines changed

error-prone-contrib/src/main/java/tech/picnic/errorprone/refasterrules/ReactorRules.java

+139
Original file line numberDiff line numberDiff line change
@@ -680,6 +680,145 @@ Mono<T> after(
680680
}
681681
}
682682

683+
/**
684+
* Don't unnecessarily transform a {@link Mono#using(Callable, Function)} to a flux, instead use
685+
* the equivalent API provided by {@link Flux}.
686+
*/
687+
static final class FluxUsing<
688+
D extends AutoCloseable, T, P extends Publisher<? extends T>, M extends Mono<? extends T>> {
689+
@BeforeTemplate
690+
Flux<T> before(Callable<D> resourceSupplier, Function<D, M> sourceSupplier) {
691+
return Mono.using(resourceSupplier, sourceSupplier).flux();
692+
}
693+
694+
@AfterTemplate
695+
Flux<T> after(Callable<D> resourceSupplier, Function<D, P> sourceSupplier) {
696+
return Flux.using(resourceSupplier, sourceSupplier);
697+
}
698+
}
699+
700+
/**
701+
* Don't unnecessarily transform a {@link Mono#using(Callable, Function, boolean)} to a flux,
702+
* instead use the equivalent API provided by {@link Flux}.
703+
*/
704+
static final class FluxUsingEager<
705+
D extends AutoCloseable, T, P extends Publisher<? extends T>, M extends Mono<? extends T>> {
706+
@BeforeTemplate
707+
Flux<T> before(Callable<D> resourceSupplier, Function<D, M> sourceSupplier, boolean eager) {
708+
return Mono.using(resourceSupplier, sourceSupplier, eager).flux();
709+
}
710+
711+
@AfterTemplate
712+
Flux<T> after(Callable<D> resourceSupplier, Function<D, P> sourceSupplier, boolean eager) {
713+
return Flux.using(resourceSupplier, sourceSupplier, eager);
714+
}
715+
}
716+
717+
/**
718+
* Don't unnecessarily transform a {@link Mono#using(Callable, Function, Consumer)} to a flux,
719+
* instead use the equivalent API provided by {@link Flux}.
720+
*/
721+
static final class FluxUsing2<
722+
D, T, P extends Publisher<? extends T>, M extends Mono<? extends T>> {
723+
@BeforeTemplate
724+
Flux<T> before(
725+
Callable<D> resourceSupplier, Function<D, M> sourceSupplier, Consumer<D> resourceCleanup) {
726+
return Mono.using(resourceSupplier, sourceSupplier, resourceCleanup).flux();
727+
}
728+
729+
@AfterTemplate
730+
Flux<T> after(
731+
Callable<D> resourceSupplier, Function<D, P> sourceSupplier, Consumer<D> resourceCleanup) {
732+
return Flux.using(resourceSupplier, sourceSupplier, resourceCleanup);
733+
}
734+
}
735+
736+
/**
737+
* Don't unnecessarily transform a {@link Mono#using(Callable, Function, Consumer, boolean)} to a
738+
* flux, instead use the equivalent API provided by {@link Flux}.
739+
*/
740+
static final class FluxUsing2Eager<
741+
D, T, P extends Publisher<? extends T>, M extends Mono<? extends T>> {
742+
@BeforeTemplate
743+
Flux<T> before(
744+
Callable<D> resourceSupplier,
745+
Function<D, M> sourceSupplier,
746+
Consumer<D> resourceCleanup,
747+
boolean eager) {
748+
return Mono.using(resourceSupplier, sourceSupplier, resourceCleanup, eager).flux();
749+
}
750+
751+
@AfterTemplate
752+
Flux<T> after(
753+
Callable<D> resourceSupplier,
754+
Function<D, P> sourceSupplier,
755+
Consumer<D> resourceCleanup,
756+
boolean eager) {
757+
return Flux.using(resourceSupplier, sourceSupplier, resourceCleanup, eager);
758+
}
759+
}
760+
761+
/**
762+
* Don't unnecessarily transform a {@link Mono#usingWhen(Publisher, Function, Function)} to a
763+
* flux, instead use the equivalent API provided by {@link Flux}.
764+
*/
765+
static final class FluxUsingWhen<
766+
D,
767+
T,
768+
P extends Publisher<? extends T>,
769+
P2 extends Publisher<?>,
770+
M extends Mono<? extends T>> {
771+
@BeforeTemplate
772+
Flux<T> before(
773+
Publisher<D> resourceSupplier,
774+
Function<D, M> resourceClosure,
775+
Function<D, P2> asyncCleanup) {
776+
return Mono.usingWhen(resourceSupplier, resourceClosure, asyncCleanup).flux();
777+
}
778+
779+
@AfterTemplate
780+
Flux<T> after(
781+
Publisher<D> resourceSupplier,
782+
Function<D, P> resourceClosure,
783+
Function<D, P2> asyncCleanup) {
784+
return Flux.usingWhen(resourceSupplier, resourceClosure, asyncCleanup);
785+
}
786+
}
787+
788+
/**
789+
* Don't unnecessarily transform a {@link Mono#usingWhen(Publisher, Function, Function,
790+
* BiFunction, Function)} to a flux, instead use the equivalent API provided by {@link Flux}.
791+
*/
792+
static final class FluxUsingWhen2<
793+
D,
794+
T,
795+
P extends Publisher<? extends T>,
796+
P2 extends Publisher<?>,
797+
M extends Mono<? extends T>> {
798+
@BeforeTemplate
799+
Flux<T> before(
800+
Publisher<D> resourceSupplier,
801+
Function<D, M> resourceClosure,
802+
Function<D, P2> asyncComplete,
803+
BiFunction<D, ? super Throwable, P2> asyncError,
804+
Function<D, P2> asyncCancel) {
805+
return Mono.usingWhen(
806+
resourceSupplier, resourceClosure, asyncComplete, asyncError, asyncCancel)
807+
.flux();
808+
}
809+
810+
@AfterTemplate
811+
Flux<T> after(
812+
Publisher<D> resourceSupplier,
813+
Function<D, P> resourceClosure,
814+
Function<D, P2> asyncComplete,
815+
BiFunction<D, ? super Throwable, ? extends Publisher<?>> asyncError,
816+
Function<D, P2> asyncCancel) {
817+
return Flux.usingWhen(
818+
resourceSupplier, resourceClosure, asyncComplete, asyncError, asyncCancel);
819+
}
820+
}
821+
683822
/** Don't unnecessarily pass an empty publisher to {@link Flux#switchIfEmpty(Publisher)}. */
684823
static final class FluxSwitchIfEmptyOfEmptyPublisher<T> {
685824
@BeforeTemplate

error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestInput.java

+32
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,38 @@ Mono<String> testMonoUsingWhen2() {
237237
.single();
238238
}
239239

240+
Flux<String> testFluxUsing() {
241+
return Mono.using(() -> new ByteArrayInputStream(new byte[] {}), s -> Mono.just("foo")).flux();
242+
}
243+
244+
Flux<String> testFluxUsingEager() {
245+
return Mono.using(() -> new ByteArrayInputStream(new byte[] {}), s -> Mono.just("foo"), false)
246+
.flux();
247+
}
248+
249+
Flux<String> testFluxUsing2() {
250+
return Mono.using(() -> "foo", foo -> Mono.just("bar"), foo -> {}).flux();
251+
}
252+
253+
Flux<String> testFluxUsing2Eager() {
254+
return Mono.using(() -> "foo", foo -> Mono.just("bar"), foo -> {}, false).flux();
255+
}
256+
257+
Flux<String> testFluxUsingWhen() {
258+
return Mono.usingWhen(Mono.just("foo"), foo -> Mono.just("bar"), foo -> Mono.just("baz"))
259+
.flux();
260+
}
261+
262+
Flux<String> testFluxUsingWhen2() {
263+
return Mono.usingWhen(
264+
Mono.just("foo"),
265+
foo -> Mono.just("bar"),
266+
foo -> Mono.just("baz"),
267+
(foo, e) -> Mono.just("qux"),
268+
foo -> Mono.just("thud"))
269+
.flux();
270+
}
271+
240272
ImmutableSet<Flux<Integer>> testFluxSwitchIfEmptyOfEmptyPublisher() {
241273
return ImmutableSet.of(
242274
Flux.just(1).switchIfEmpty(Mono.empty()), Flux.just(2).switchIfEmpty(Flux.empty()));

error-prone-contrib/src/test/resources/tech/picnic/errorprone/refasterrules/ReactorRulesTestOutput.java

+29
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,35 @@ Mono<String> testMonoUsingWhen2() {
237237
foo -> Mono.just("thud"));
238238
}
239239

240+
Flux<String> testFluxUsing() {
241+
return Flux.using(() -> new ByteArrayInputStream(new byte[] {}), s -> Mono.just("foo"));
242+
}
243+
244+
Flux<String> testFluxUsingEager() {
245+
return Flux.using(() -> new ByteArrayInputStream(new byte[] {}), s -> Mono.just("foo"), false);
246+
}
247+
248+
Flux<String> testFluxUsing2() {
249+
return Flux.using(() -> "foo", foo -> Mono.just("bar"), foo -> {});
250+
}
251+
252+
Flux<String> testFluxUsing2Eager() {
253+
return Flux.using(() -> "foo", foo -> Mono.just("bar"), foo -> {}, false);
254+
}
255+
256+
Flux<String> testFluxUsingWhen() {
257+
return Flux.usingWhen(Mono.just("foo"), foo -> Mono.just("bar"), foo -> Mono.just("baz"));
258+
}
259+
260+
Flux<String> testFluxUsingWhen2() {
261+
return Flux.usingWhen(
262+
Mono.just("foo"),
263+
foo -> Mono.just("bar"),
264+
foo -> Mono.just("baz"),
265+
(foo, e) -> Mono.just("qux"),
266+
foo -> Mono.just("thud"));
267+
}
268+
240269
ImmutableSet<Flux<Integer>> testFluxSwitchIfEmptyOfEmptyPublisher() {
241270
return ImmutableSet.of(Flux.just(1), Flux.just(2));
242271
}

0 commit comments

Comments
 (0)