blob: d87defb6a1dda34095854467d7c5637be575bbde [file] [log] [blame]
Toshio Koided6cbec32014-08-27 15:23:44 -07001package net.onrc.onos.core.flowmanager;
2
3import java.util.concurrent.CopyOnWriteArraySet;
4
5import net.onrc.onos.api.flowmanager.FlowBatchId;
6import net.onrc.onos.api.flowmanager.FlowBatchOperation;
7import net.onrc.onos.api.flowmanager.FlowBatchState;
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 SharedFlowBatchMap}.
19 */
20public class SharedFlowBatchMapEventDispatcher implements EntryListener<String, byte[]> {
21 private CopyOnWriteArraySet<FlowBatchMapEventListener> listeners;
22 private static final Logger log = LoggerFactory
23 .getLogger(SharedFlowBatchMapEventDispatcher.class);
24
25 /**
26 * Creates dispatcher using flow batch map objects.
27 *
28 * @param flowBatchMap the flow batch map object
29 * @param flowBatchStateMap the flow batch state map object
30 */
31 public SharedFlowBatchMapEventDispatcher(IMap<String, byte[]> flowBatchMap,
32 IMap<String, byte[]> flowBatchStateMap) {
33 listeners = new CopyOnWriteArraySet<>();
34 flowBatchMap.addEntryListener(this, true);
35 flowBatchStateMap.addEntryListener(this, true);
36 }
37
38 /**
39 * Adds a listener for listening events related to the map.
40 *
41 * @param listener the {@link FlowBatchMapEventListener} to be added
42 */
43 public void addListener(FlowBatchMapEventListener 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 FlowBatchMapEventListener} to be removed
51 */
52 public void removeListener(FlowBatchMapEventListener 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 FlowBatchOperation) {
60 // Handles events from flowBatchMap.
61 final FlowBatchOperation flowOp = (FlowBatchOperation) value;
Pavlin Radoslavov165ff472014-09-02 12:58:41 -070062 final FlowBatchId id = FlowBatchId.valueOf(event.getKey());
Toshio Koided6cbec32014-08-27 15:23:44 -070063 log.trace("Flow batch operation ID:{}, {} was added", id, flowOp);
64 for (FlowBatchMapEventListener e : listeners) {
65 FlowBatchOperation copiedFlowOp =
66 new FlowBatchOperation(flowOp.getOperations());
67 e.flowBatchOperationAdded(id, copiedFlowOp);
68 e.flowBatchOperationStateChanged(id, null, FlowBatchState.SUBMITTED);
69 }
70 } else if (value instanceof FlowBatchState) {
71 // Handles events from flowBatchStateMap.
72 final FlowBatchState state = (FlowBatchState) value;
Pavlin Radoslavov165ff472014-09-02 12:58:41 -070073 final FlowBatchId id = FlowBatchId.valueOf(event.getKey());
Toshio Koided6cbec32014-08-27 15:23:44 -070074 log.trace("FlowState of FlowId {} was set to {}", id, state);
75 for (FlowBatchMapEventListener e : listeners) {
76 e.flowBatchOperationStateChanged(id, FlowBatchState.SUBMITTED, state);
77 }
78 } else {
79 throw new IllegalStateException("Added illegal value: " + value);
80 }
81 }
82
83 @Override
84 public void entryRemoved(EntryEvent<String, byte[]> event) {
85 final Object value = KryoFactory.deserialize(event.getValue());
86 if (value instanceof FlowBatchOperation) {
87 // Handles events from flowBatchMap.
88 final FlowBatchOperation flowOp = (FlowBatchOperation) value;
Pavlin Radoslavov165ff472014-09-02 12:58:41 -070089 final FlowBatchId id = FlowBatchId.valueOf(event.getKey());
Toshio Koided6cbec32014-08-27 15:23:44 -070090 log.trace("Flow batch operation ID:{}, {} was removed", id, flowOp);
91 for (FlowBatchMapEventListener e : listeners) {
92 e.flowBatchOperationRemoved(id);
93 }
94 } else if (value instanceof FlowBatchState) {
95 // Handles events from flowBatchStateMap.
96 log.trace("Flow batch state {} of ID:{} was removed", value, event.getKey());
97 } else {
98 throw new IllegalStateException("Removed illegal value: " + value);
99 }
100 }
101
102 @Override
103 public void entryUpdated(EntryEvent<String, byte[]> event) {
104 final Object value = KryoFactory.deserialize(event.getValue());
105 if (value instanceof FlowBatchOperation) {
106 // Handles events from flowBatchMap.
107 log.trace("Flow batch operation ID:{} updated by {}", event.getKey(), value);
108 } else if (value instanceof FlowBatchState) {
109 // Handles events from flowBatchStateMap.
110 Object oldValue = KryoFactory.deserialize(event.getOldValue());
111 final FlowBatchState currentState = (FlowBatchState) value;
112 final FlowBatchState oldState = (FlowBatchState) oldValue;
Pavlin Radoslavov165ff472014-09-02 12:58:41 -0700113 final FlowBatchId id = FlowBatchId.valueOf(event.getKey());
Toshio Koided6cbec32014-08-27 15:23:44 -0700114 log.trace("Flow batch state of ID:{} was updated from {} to {}",
115 id, oldState, currentState);
116 for (FlowBatchMapEventListener e : listeners) {
117 e.flowBatchOperationStateChanged(id, oldState, currentState);
118 }
119 } else {
120 throw new IllegalStateException("Updated illegal value: " + value);
121 }
122 }
123
124 @Override
125 public void entryEvicted(EntryEvent<String, byte[]> event) {
126 // do nothing.
127 }
128
129}