1 | package com.hammurapi.eventbus; |
2 | |
3 | import java.io.Serializable; |
4 | import java.util.Arrays; |
5 | |
6 | import com.hammurapi.eventbus.AbstractEventBus.Handle; |
7 | import com.hammurapi.extract.Predicate; |
8 | |
9 | /** |
10 | * Handler which maps input tuples like {{E1, E2, E5}, {E4, E3}} to {E1, E2, E3, E4, E5} |
11 | * @author Pavel Vlasov |
12 | * |
13 | * @param <E> |
14 | * @param <P> |
15 | * @param <C> |
16 | */ |
17 | public class MappingEventHandler<E, P extends Comparable<P>, C, K, H extends EventBus.Handle<E, P, C>, S extends EventStore<E,P,C,H,S>> implements JoinEventHandler<E, P, C, K, H, S>, Serializable { |
18 | |
19 | private EventHandlerWrapper<E, P, C, K, H, S> target; |
20 | private Mapper<Handle<E,P,C,K>>[] mappers; |
21 | |
22 | public MappingEventHandler(EventHandlerWrapper<E, P, C, K, H, S> target, Mapper<Handle<E,P,C,K>>[] mappers) { |
23 | this.target = target; |
24 | this.mappers = mappers; |
25 | } |
26 | |
27 | @Override |
28 | public boolean consumes() { |
29 | return target.consumes(); |
30 | } |
31 | |
32 | @Override |
33 | public int getCardinality() { |
34 | return mappers.length; |
35 | } |
36 | |
37 | @Override |
38 | public C getContext() { |
39 | return target.getContext(); |
40 | } |
41 | |
42 | @Override |
43 | public P getPriority() { |
44 | return target.getPriority(); |
45 | } |
46 | |
47 | @SuppressWarnings("unchecked") |
48 | @Override |
49 | public void post( |
50 | final EventDispatchContext<E,P,C,H,S> context, |
51 | InferenceContext<E,P,C,K,H,S> inferenceContext, |
52 | final Handle<E,P,C,K>[]... handles) { |
53 | |
54 | Handle<E,P,C,K>[] targetInput = new Handle[target.getCardinality()]; |
55 | for (int i=0; i<mappers.length; ++i) { |
56 | mappers[i].map(handles[i], targetInput); |
57 | } |
58 | |
59 | EventDispatchJoinContext<E,P,C,H,S> mappingContext = new EventDispatchJoinContextFilter<E,P,C,H,S>(context) { |
60 | |
61 | public void consumeJoin(E event) { |
62 | for (int i=0; i<handles.length; ++i) { |
63 | for (Handle<E,P,C,K> h: handles[i]) { |
64 | if (event==h.getEvent()) { |
65 | ((EventDispatchJoinContext<E, P, C, H, S>) context).consumeJoin(i); |
66 | return; |
67 | } |
68 | } |
69 | } |
70 | }; |
71 | |
72 | @Override |
73 | public void consumeJoin(int index) { |
74 | for (int i=0; i<mappers.length; ++i) { |
75 | for (int idx: mappers[i].getIndexMap()) { |
76 | if (idx==index) { |
77 | ((EventDispatchJoinContext<E, P, C, H, S>) context).consumeJoin(i); |
78 | return; |
79 | } |
80 | } |
81 | } |
82 | } |
83 | |
84 | }; |
85 | |
86 | target.post(mappingContext, inferenceContext, targetInput); |
87 | } |
88 | |
89 | @Override |
90 | public void reset() { |
91 | target.reset(); |
92 | } |
93 | |
94 | @Override |
95 | public String toString() { |
96 | return "MappingEventHandler [target=" + target + ", mappers=" + Arrays.toString(mappers) + "]"; |
97 | } |
98 | |
99 | @Override |
100 | public boolean isOneOff() { |
101 | return target.isOneOff(); |
102 | } |
103 | |
104 | @Override |
105 | public Mode getMode() { |
106 | return target.getMode(); |
107 | } |
108 | |
109 | @Override |
110 | public Predicate<E, C> getPredicate() { |
111 | throw new UnsupportedOperationException(); // TODO - Map target predicate if needed. |
112 | } |
113 | |
114 | |
115 | } |