|
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