+ class GroupListener extends AbstractDataChangeListener<Group> {
+
+ public GroupListener() {
+ super(Group.class);
+ }
+
+ @Override
+ protected void remove(InstanceIdentifier<Group> identifier, Group del) {
+ BigInteger dpId = getDpnFromString(identifier.firstKeyOf(Node.class, NodeKey.class).getId().getValue());
+ executeNotifyTaskIfRequired(dpId, del);
+ }
+
+ private void executeNotifyTaskIfRequired(BigInteger dpId, Group group) {
+ GroupInfoKey groupKey = new GroupInfoKey(dpId, group.getGroupId().getValue());
+ Runnable notifyTask = groupMap.remove(groupKey);
+ if (notifyTask == null) {
+ return;
+ }
+ executorService.execute(notifyTask);
+ }
+
+ @Override
+ protected void update(InstanceIdentifier<Group> identifier, Group original, Group update) {
+ BigInteger dpId = getDpnFromString(identifier.firstKeyOf(Node.class, NodeKey.class).getId().getValue());
+ executeNotifyTaskIfRequired(dpId, update);
+ }
+
+ @Override
+ protected void add(InstanceIdentifier<Group> identifier, Group add) {
+ BigInteger dpId = getDpnFromString(identifier.firstKeyOf(Node.class, NodeKey.class).getId().getValue());
+ executeNotifyTaskIfRequired(dpId, add);
+ }
+ }
+
+ class FlowListener extends AbstractDataChangeListener<Flow> {
+
+ public FlowListener() {
+ super(Flow.class);
+ }
+
+ @Override
+ protected void remove(InstanceIdentifier<Flow> identifier, Flow del) {
+ BigInteger dpId = getDpnFromString(identifier.firstKeyOf(Node.class, NodeKey.class).getId().getValue());
+ notifyTaskIfRequired(dpId, del);
+ }
+
+ private void notifyTaskIfRequired(BigInteger dpId, Flow flow) {
+ FlowInfoKey flowKey = new FlowInfoKey(dpId, flow.getTableId(), flow.getMatch(), flow.getId().getValue());
+ Runnable notifyTask = flowMap.remove(flowKey);
+ if (notifyTask == null) {
+ return;
+ }
+ executorService.execute(notifyTask);
+ }
+
+ @Override
+ protected void update(InstanceIdentifier<Flow> identifier, Flow original, Flow update) {
+ }
+
+ @Override
+ protected void add(InstanceIdentifier<Flow> identifier, Flow add) {
+ BigInteger dpId = getDpnFromString(identifier.firstKeyOf(Node.class, NodeKey.class).getId().getValue());
+ notifyTaskIfRequired(dpId, add);
+ }
+ }
+
+ private BigInteger getDpnFromString(String dpnString) {
+ String[] split = dpnString.split(":");
+ return new BigInteger(split[1]);
+ }
+