AsyncCollector.java

1
/*
2
 * Copyright 2014-2026 Grzegorz Piwowarek, https://4comprehension.com/
3
 *
4
 * Licensed under the Apache License, Version 2.0 (the "License");
5
 * you may not use this file except in compliance with the License.
6
 * You may obtain a copy of the License at
7
 *
8
 * https://www.apache.org/licenses/LICENSE-2.0
9
 *
10
 * Unless required by applicable law or agreed to in writing, software
11
 * distributed under the License is distributed on an "AS IS" BASIS,
12
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
 * See the License for the specific language governing permissions and
14
 * limitations under the License.
15
 */
16
package com.pivovarit.collectors;
17
18
import java.util.Set;
19
import java.util.concurrent.CompletableFuture;
20
import java.util.concurrent.Executor;
21
import java.util.concurrent.FutureTask;
22
import java.util.function.BiConsumer;
23
import java.util.function.BinaryOperator;
24
import java.util.function.Function;
25
import java.util.function.Supplier;
26
import java.util.stream.Collector;
27
import java.util.stream.Stream;
28
29
record AsyncCollector<T, R, RR>(
30
  Function<? super T, ? extends R> mapper,
31
  Function<Stream<R>, RR> processor,
32
  Executor executor)
33
  implements Collector<T, Stream.Builder<T>, CompletableFuture<RR>> {
34
35
    @Override
36
    public Supplier<Stream.Builder<T>> supplier() {
37 1 1. supplier : replaced return value with null for com/pivovarit/collectors/AsyncCollector::supplier → KILLED
        return Stream::builder;
38
    }
39
40
    @Override
41
    public BiConsumer<Stream.Builder<T>, T> accumulator() {
42 1 1. accumulator : replaced return value with null for com/pivovarit/collectors/AsyncCollector::accumulator → KILLED
        return Stream.Builder::add;
43
    }
44
45
    @Override
46
    public BinaryOperator<Stream.Builder<T>> combiner() {
47 1 1. combiner : replaced return value with null for com/pivovarit/collectors/AsyncCollector::combiner → SURVIVED
        return (left, right) -> {
48
            throw new UnsupportedOperationException("using parallel stream with parallel collectors is not supported");
49
        };
50
    }
51
52
    @Override
53
    public Function<Stream.Builder<T>, CompletableFuture<RR>> finisher() {
54 1 1. finisher : replaced return value with null for com/pivovarit/collectors/AsyncCollector::finisher → KILLED
        return acc -> {
55
            var future = new InterruptibleCompletableFuture<RR>();
56
            var task = new FutureTask<>(() -> {
57
                try {
58 1 1. lambda$finisher$2 : replaced return value with null for com/pivovarit/collectors/AsyncCollector::lambda$finisher$2 → KILLED
                    future.complete(processor.apply(acc.build().map(mapper).toList().stream().map(r -> r)));
59
                } catch (Throwable e) {
60
                    future.completeExceptionally(e);
61
                    Thread.interrupted();
62
                }
63
            }, null);
64 1 1. lambda$finisher$0 : removed call to com/pivovarit/collectors/InterruptibleCompletableFuture::completedBy → SURVIVED
            future.completedBy(task);
65
            future.whenComplete((__, ex) -> {
66 1 1. lambda$finisher$3 : negated conditional → TIMED_OUT
                if (ex != null) {
67
                    task.cancel(true);
68
                }
69
            });
70
            try {
71 1 1. lambda$finisher$0 : removed call to java/util/concurrent/Executor::execute → TIMED_OUT
                executor.execute(task);
72
            } catch (Exception e) {
73 1 1. lambda$finisher$0 : replaced return value with null for com/pivovarit/collectors/AsyncCollector::lambda$finisher$0 → KILLED
                return CompletableFuture.failedFuture(e);
74
            }
75 1 1. lambda$finisher$0 : replaced return value with null for com/pivovarit/collectors/AsyncCollector::lambda$finisher$0 → KILLED
            return future;
76
        };
77
    }
78
79
    @Override
80
    public Set<Characteristics> characteristics() {
81
        return Set.of();
82
    }
83
}

Mutations

37

1.1
Location : supplier
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessEmptyWithMaxParallelism()]/[dynamic-test:#3]
replaced return value with null for com/pivovarit/collectors/AsyncCollector::supplier → KILLED

42

1.1
Location : accumulator
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessAllElementsWithMaxParallelism()]/[dynamic-test:#3]
replaced return value with null for com/pivovarit/collectors/AsyncCollector::accumulator → KILLED

47

1.1
Location : combiner
Killed by : none
replaced return value with null for com/pivovarit/collectors/AsyncCollector::combiner → SURVIVED
Covering tests

54

1.1
Location : finisher
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessEmptyWithMaxParallelism()]/[dynamic-test:#3]
replaced return value with null for com/pivovarit/collectors/AsyncCollector::finisher → KILLED

58

1.1
Location : lambda$finisher$2
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessAllElementsWithMaxParallelism()]/[dynamic-test:#3]
replaced return value with null for com/pivovarit/collectors/AsyncCollector::lambda$finisher$2 → KILLED

64

1.1
Location : lambda$finisher$0
Killed by : none
removed call to com/pivovarit/collectors/InterruptibleCompletableFuture::completedBy → SURVIVED
Covering tests

66

1.1
Location : lambda$finisher$3
Killed by : none
negated conditional → TIMED_OUT

71

1.1
Location : lambda$finisher$0
Killed by : none
removed call to java/util/concurrent/Executor::execute → TIMED_OUT

73

1.1
Location : lambda$finisher$0
Killed by : com.pivovarit.collectors.test.TaskRejectionTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.TaskRejectionTest]/[test-factory:shouldHandleRejectionWhenParallelismOneFactory()]/[dynamic-test:#3]
replaced return value with null for com/pivovarit/collectors/AsyncCollector::lambda$finisher$0 → KILLED

75

1.1
Location : lambda$finisher$0
Killed by : com.pivovarit.collectors.test.BasicParallelismTest.[engine:junit-jupiter]/[class:com.pivovarit.collectors.test.BasicParallelismTest]/[test-factory:shouldProcessEmptyWithMaxParallelism()]/[dynamic-test:#3]
replaced return value with null for com/pivovarit/collectors/AsyncCollector::lambda$finisher$0 → KILLED

Active mutators

Tests examined


Report generated by PIT 1.30.0 support