blob: 9368ac23ebbeeb67fb4c6435eaf2d4f404c431e9 [file] [log] [blame]
Toshio Koideb7a578c2014-08-22 18:00:54 -07001package net.onrc.onos.core.flowmanager;
2
3import java.util.concurrent.CopyOnWriteArraySet;
4
5import net.onrc.onos.api.flowmanager.Flow;
6import net.onrc.onos.api.flowmanager.FlowId;
7import net.onrc.onos.api.flowmanager.FlowState;
8import net.onrc.onos.core.util.serializers.KryoFactory;
9
10import org.slf4j.Logger;
11import org.slf4j.LoggerFactory;
12
13import com.hazelcast.core.EntryEvent;
14import com.hazelcast.core.EntryListener;
15import com.hazelcast.core.IMap;
16
17/**
18 * This class is used for managing listeners of the {@link SharedFlowMap}.
19 */
20class SharedFlowMapEventDispatcher implements EntryListener<String, byte[]> {
21 private CopyOnWriteArraySet<FlowMapEventListener> listeners;
22 private static final Logger log = LoggerFactory
23 .getLogger(SharedFlowMapEventDispatcher.class);
24
25 /**
26 * Creates dispatcher using flow map objects.
27 *
28 * @param flowMap the flow map object
29 * @param flowStateMap the flow state map object
30 */
31 SharedFlowMapEventDispatcher(IMap<String, byte[]> flowMap,
32 IMap<String, byte[]> flowStateMap) {
33 listeners = new CopyOnWriteArraySet<>();
34 flowMap.addEntryListener(this, true);
35 flowStateMap.addEntryListener(this, true);
36 }
37
38 /**
39 * Adds a listener for listening events related to the map.
40 *
41 * @param listener the {@link FlowMapEventListener} to be added
42 */
43 void addListener(FlowMapEventListener listener) {
44 listeners.add(listener);
45 }
46
47 /**
48 * Removes a listener for listening events related to the map.
49 *
50 * @param listener the {@link FlowMapEventListener} to be removed
51 */
52 void removeListener(FlowMapEventListener listener) {
53 listeners.remove(listener);
54 }
55
56 @Override
57 public void entryAdded(EntryEvent<String, byte[]> event) {
58 final Object value = KryoFactory.deserialize(event.getValue());
59 if (value instanceof Flow) {
60 // Handles events from flowMap.
61 final Flow flow = (Flow) value;
62 log.trace("Flow {} was added", flow);
63 for (FlowMapEventListener e : listeners) {
64 e.flowAdded(flow.getId(), flow);
65 e.flowStateChanged(flow.getId(), null, FlowState.SUBMITTED);
66 }
67 } else if (value instanceof FlowState) {
68 // Handles events from flowStateMap.
69 final FlowState state = (FlowState) value;
Pavlin Radoslavov165ff472014-09-02 12:58:41 -070070 final FlowId id = FlowId.valueOf(event.getKey());
Toshio Koideb7a578c2014-08-22 18:00:54 -070071 log.trace("FlowState of FlowId {} was set to {}", id, state);
72 for (FlowMapEventListener e : listeners) {
73 e.flowStateChanged(id, FlowState.SUBMITTED, state);
74 }
75 } else {
76 throw new IllegalStateException("Added illegal value: " + value.toString());
77 }
78 }
79
80 @Override
81 public void entryRemoved(EntryEvent<String, byte[]> event) {
82 final Object value = KryoFactory.deserialize(event.getValue());
83 if (value instanceof Flow) {
84 // Handles events from flowMap.
85 final Flow flow = (Flow) value;
86 log.trace("Flow {} was removed", flow);
87 for (FlowMapEventListener e : listeners) {
88 e.flowRemoved(flow.getId());
89 }
90 } else if (value instanceof FlowState) {
91 // Handles events from flowStateMap.
92 log.trace("FlowState {} of FlowId {} was removed", value, event.getKey());
93 } else {
94 throw new IllegalStateException("Removed illegal value: " + value.toString());
95 }
96 }
97
98 @Override
99 public void entryUpdated(EntryEvent<String, byte[]> event) {
100 final Object value = KryoFactory.deserialize(event.getValue());
101 if (value instanceof Flow) {
102 // Handles events from flowMap.
103 log.trace("Flow Updated by {}", value);
104 } else if (value instanceof FlowState) {
105 // Handles events from flowStateMap.
106 Object oldValue = KryoFactory.deserialize(event.getOldValue());
107 final FlowState state = (FlowState) value;
108 final FlowState oldState = (FlowState) oldValue;
Pavlin Radoslavov165ff472014-09-02 12:58:41 -0700109 final FlowId id = FlowId.valueOf(event.getKey());
Toshio Koideb7a578c2014-08-22 18:00:54 -0700110 log.trace("FlowState of FlowId {} was updated from {} to {}",
111 id, oldState, state);
112 for (FlowMapEventListener e : listeners) {
113 e.flowStateChanged(id, oldState, state);
114 }
115 } else {
116 throw new IllegalStateException("Updated illegal value: " + value.toString());
117 }
118 }
119
120 @Override
121 public void entryEvicted(EntryEvent<String, byte[]> event) {
122 // do nothing.
123 }
124
125}