|
1 |
| -/* Copyright 2019 Pascal Christoph, hbz. |
| 1 | +/* Copyright 2019 Pascal Christoph (hbz), and others. |
2 | 2 | *
|
3 | 3 | * Licensed under the Apache License, Version 2.0 the "License";
|
4 | 4 | * you may not use this file except in compliance with the License.
|
|
15 | 15 |
|
16 | 16 | package org.metafacture.flowcontrol;
|
17 | 17 |
|
| 18 | +import java.util.ArrayList; |
| 19 | +import java.util.List; |
| 20 | + |
18 | 21 | import org.metafacture.framework.FluxCommand;
|
19 | 22 | import org.metafacture.framework.ObjectPipe;
|
20 | 23 | import org.metafacture.framework.ObjectReceiver;
|
21 | 24 | import org.metafacture.framework.Tee;
|
22 | 25 | import org.metafacture.framework.annotations.Description;
|
23 | 26 | import org.metafacture.framework.annotations.In;
|
24 | 27 | import org.metafacture.framework.annotations.Out;
|
25 |
| -import org.metafacture.framework.helpers.DefaultTee; |
26 | 28 | import org.slf4j.Logger;
|
27 | 29 | import org.slf4j.LoggerFactory;
|
28 | 30 |
|
|
35 | 37 | * @param <T> Object type
|
36 | 38 | *
|
37 | 39 | * @author Pascal Christoph (dr0i)
|
| 40 | + * @author Fabian Steeg (fsteeg) |
38 | 41 | *
|
39 | 42 | */
|
40 | 43 | @In(Object.class)
|
41 | 44 | @Out(Object.class)
|
42 | 45 | @Description("Incoming objects are distributed to the added receivers, running in their own threads.")
|
43 | 46 | @FluxCommand("thread-object-tee")
|
44 |
| -public class ObjectThreader<T> extends DefaultTee<ObjectReceiver<T>> implements ObjectPipe<T, ObjectReceiver<T>> { |
| 47 | +public class ObjectThreader<T> implements Tee<ObjectReceiver<T>>, ObjectPipe<T, ObjectReceiver<T>> { |
45 | 48 |
|
46 | 49 | private static final Logger LOG = LoggerFactory.getLogger(ObjectThreader.class);
|
| 50 | + private final List<ObjectReceiver<T>> receivers = new ArrayList<ObjectReceiver<T>>(); |
47 | 51 | private int objectNumber = 0;
|
48 | 52 |
|
49 | 53 | @Override
|
50 | 54 | public void process(final T obj) {
|
51 |
| - getReceivers().get(objectNumber).process(obj); |
52 |
| - if (objectNumber == getReceivers().size() - 1) { |
| 55 | + receivers.get(objectNumber).process(obj); |
| 56 | + if (objectNumber == receivers.size() - 1) { |
53 | 57 | objectNumber = 0;
|
54 | 58 | } else {
|
55 | 59 | objectNumber++;
|
56 | 60 | }
|
57 | 61 | }
|
58 | 62 |
|
| 63 | + @Override |
| 64 | + public Tee<ObjectReceiver<T>> addReceiver(final ObjectReceiver<T> receiver) { |
| 65 | + LOG.info("Adding thread {}", (receivers.size() + 1)); |
| 66 | + ObjectPipeDecoupler<T> opd = new ObjectPipeDecoupler<>(); |
| 67 | + opd.setReceiver(receiver); |
| 68 | + receivers.add(opd); |
| 69 | + return this; |
| 70 | + } |
| 71 | + |
59 | 72 | @Override
|
60 | 73 | public <R extends ObjectReceiver<T>> R setReceiver(final R receiver) {
|
61 |
| - return super.setReceiver(new ObjectPipeDecoupler<T>().setReceiver(receiver)); |
| 74 | + receivers.clear(); |
| 75 | + addReceiver(receiver); |
| 76 | + return receiver; |
62 | 77 | }
|
63 | 78 |
|
64 | 79 | @Override
|
65 |
| - public Tee<ObjectReceiver<T>> addReceiver(final ObjectReceiver<T> receiver) { |
66 |
| - LOG.info("Adding thread {}", (getReceivers().size() + 1)); |
67 |
| - ObjectPipeDecoupler<T> opd = new ObjectPipeDecoupler<>(); |
68 |
| - opd.setReceiver(receiver); |
69 |
| - return super.addReceiver(opd); |
| 80 | + public <R extends ObjectReceiver<T>> R setReceivers(R receiver, ObjectReceiver<T> lateralReceiver) { |
| 81 | + receivers.clear(); |
| 82 | + addReceiver(receiver); |
| 83 | + addReceiver(lateralReceiver); |
| 84 | + return receiver; |
| 85 | + } |
| 86 | + |
| 87 | + @Override |
| 88 | + public void resetStream() { |
| 89 | + receivers.forEach(ObjectReceiver::resetStream); |
| 90 | + } |
| 91 | + |
| 92 | + @Override |
| 93 | + public void closeStream() { |
| 94 | + receivers.forEach(ObjectReceiver::closeStream); |
| 95 | + } |
| 96 | + |
| 97 | + @Override |
| 98 | + public Tee<ObjectReceiver<T>> removeReceiver(ObjectReceiver<T> receiver) { |
| 99 | + receivers.remove(receiver); |
| 100 | + return this; |
| 101 | + } |
| 102 | + |
| 103 | + @Override |
| 104 | + public Tee<ObjectReceiver<T>> clearReceivers() { |
| 105 | + receivers.clear(); |
| 106 | + return this; |
70 | 107 | }
|
71 | 108 | }
|
0 commit comments