blob: 14d29ac36fbd34234c6528f15fe15ee93861c41f [file] [log] [blame]
Simon Hunted804d52016-03-30 09:51:40 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2016-present Open Networking Foundation
Simon Hunted804d52016-03-30 09:51:40 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package org.onosproject.ui.impl.topo.model;
18
Simon Huntcda9c032016-04-11 10:32:54 -070019import org.apache.felix.scr.annotations.Activate;
20import org.apache.felix.scr.annotations.Component;
21import org.apache.felix.scr.annotations.Deactivate;
22import org.apache.felix.scr.annotations.Reference;
23import org.apache.felix.scr.annotations.ReferenceCardinality;
24import org.apache.felix.scr.annotations.Service;
Simon Hunt7092cc42016-04-06 18:40:17 -070025import org.onosproject.cluster.ClusterEvent;
26import org.onosproject.cluster.ClusterEventListener;
27import org.onosproject.cluster.ClusterService;
Simon Hunt23fb1352016-04-11 12:15:19 -070028import org.onosproject.cluster.ControllerNode;
29import org.onosproject.cluster.RoleInfo;
Simon Huntcda9c032016-04-11 10:32:54 -070030import org.onosproject.event.AbstractListenerManager;
Simon Hunt7092cc42016-04-06 18:40:17 -070031import org.onosproject.incubator.net.PortStatisticsService;
32import org.onosproject.incubator.net.tunnel.TunnelService;
33import org.onosproject.mastership.MastershipEvent;
34import org.onosproject.mastership.MastershipListener;
35import org.onosproject.mastership.MastershipService;
Simon Huntcda9c032016-04-11 10:32:54 -070036import org.onosproject.net.Device;
Simon Hunt23fb1352016-04-11 12:15:19 -070037import org.onosproject.net.DeviceId;
38import org.onosproject.net.Host;
39import org.onosproject.net.Link;
Simon Hunt7092cc42016-04-06 18:40:17 -070040import org.onosproject.net.device.DeviceEvent;
41import org.onosproject.net.device.DeviceListener;
42import org.onosproject.net.device.DeviceService;
43import org.onosproject.net.flow.FlowRuleEvent;
44import org.onosproject.net.flow.FlowRuleListener;
45import org.onosproject.net.flow.FlowRuleService;
46import org.onosproject.net.host.HostEvent;
47import org.onosproject.net.host.HostListener;
48import org.onosproject.net.host.HostService;
49import org.onosproject.net.intent.IntentEvent;
50import org.onosproject.net.intent.IntentListener;
51import org.onosproject.net.intent.IntentService;
52import org.onosproject.net.link.LinkEvent;
53import org.onosproject.net.link.LinkListener;
54import org.onosproject.net.link.LinkService;
Simon Hunt23fb1352016-04-11 12:15:19 -070055import org.onosproject.net.region.Region;
Simon Hunt7092cc42016-04-06 18:40:17 -070056import org.onosproject.net.region.RegionEvent;
Simon Hunt977aa052016-07-20 17:08:29 -070057import org.onosproject.net.region.RegionId;
Simon Hunt7092cc42016-04-06 18:40:17 -070058import org.onosproject.net.region.RegionListener;
59import org.onosproject.net.region.RegionService;
60import org.onosproject.net.statistic.StatisticService;
61import org.onosproject.net.topology.TopologyService;
Simon Hunt4f4ffc32016-08-03 18:30:47 -070062import org.onosproject.ui.UiTopoLayoutService;
Simon Hunt8eac4ae2017-01-20 12:56:45 -080063import org.onosproject.ui.impl.topo.Topo2Jsonifier;
Simon Huntf679c4e2016-04-01 17:02:24 -070064import org.onosproject.ui.impl.topo.UiTopoSession;
Simon Hunt642bc452016-05-04 19:34:45 -070065import org.onosproject.ui.model.ServiceBundle;
Simon Huntd5b96732016-07-08 13:22:27 -070066import org.onosproject.ui.model.topo.UiClusterMember;
Simon Hunt4854f3d2016-08-02 18:13:15 -070067import org.onosproject.ui.model.topo.UiDevice;
Simon Huntc13082f2016-08-03 21:20:23 -070068import org.onosproject.ui.model.topo.UiDeviceLink;
Simon Hunt4854f3d2016-08-02 18:13:15 -070069import org.onosproject.ui.model.topo.UiHost;
Simon Hunt0e161092017-05-08 17:41:38 -070070import org.onosproject.ui.model.topo.UiLinkId;
Thomas Vachuska8c0b18a2017-04-14 16:27:33 -070071import org.onosproject.ui.model.topo.UiModelEvent;
Simon Huntd5b96732016-07-08 13:22:27 -070072import org.onosproject.ui.model.topo.UiRegion;
Simon Huntc13082f2016-08-03 21:20:23 -070073import org.onosproject.ui.model.topo.UiSynthLink;
Simon Hunted804d52016-03-30 09:51:40 -070074import org.slf4j.Logger;
75import org.slf4j.LoggerFactory;
76
Simon Huntd5b96732016-07-08 13:22:27 -070077import java.util.List;
Simon Hunt0e161092017-05-08 17:41:38 -070078import java.util.Map;
Simon Hunt10973dd2016-08-01 15:50:35 -070079import java.util.Set;
Simon Huntd5b96732016-07-08 13:22:27 -070080import java.util.concurrent.ExecutorService;
Simon Hunt8eac4ae2017-01-20 12:56:45 -080081
82import static java.util.concurrent.Executors.newSingleThreadExecutor;
83import static org.onlab.util.Tools.groupedThreads;
Simon Huntd5b96732016-07-08 13:22:27 -070084
Simon Hunted804d52016-03-30 09:51:40 -070085/**
Simon Huntcda9c032016-04-11 10:32:54 -070086 * Service that creates and maintains the UI-model of the network topology.
Simon Hunted804d52016-03-30 09:51:40 -070087 */
Thomas Vachuska92b016b2016-05-20 11:37:57 -070088@Component(immediate = true, enabled = true)
Simon Huntcda9c032016-04-11 10:32:54 -070089@Service(value = UiSharedTopologyModel.class)
90public final class UiSharedTopologyModel
91 extends AbstractListenerManager<UiModelEvent, UiModelListener> {
Simon Hunted804d52016-03-30 09:51:40 -070092
93 private static final Logger log =
94 LoggerFactory.getLogger(UiSharedTopologyModel.class);
95
Simon Huntcda9c032016-04-11 10:32:54 -070096 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Simon Hunt4f4ffc32016-08-03 18:30:47 -070097 private UiTopoLayoutService layoutService;
98
99 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Simon Huntcda9c032016-04-11 10:32:54 -0700100 private ClusterService clusterService;
101 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
102 private MastershipService mastershipService;
103 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
104 private RegionService regionService;
105 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
106 private DeviceService deviceService;
107 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
108 private LinkService linkService;
109 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
110 private HostService hostService;
111 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
112 private IntentService intentService;
113 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
114 private FlowRuleService flowService;
Simon Hunt7092cc42016-04-06 18:40:17 -0700115
Simon Huntcda9c032016-04-11 10:32:54 -0700116 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
117 private StatisticService flowStatsService;
118 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
119 private PortStatisticsService portStatsService;
120 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
121 private TopologyService topologyService;
122 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
123 private TunnelService tunnelService;
Simon Hunted804d52016-03-30 09:51:40 -0700124
Simon Huntcda9c032016-04-11 10:32:54 -0700125 private final ClusterEventListener clusterListener =
126 new InternalClusterListener();
127 private final MastershipListener mastershipListener =
128 new InternalMastershipListener();
129 private final RegionListener regionListener =
130 new InternalRegionListener();
131 private final DeviceListener deviceListener =
132 new InternalDeviceListener();
133 private final LinkListener linkListener =
134 new InternalLinkListener();
135 private final HostListener hostListener =
136 new InternalHostListener();
137 private final IntentListener intentListener =
138 new InternalIntentListener();
139 private final FlowRuleListener flowRuleListener =
140 new InternalFlowRuleListener();
Simon Hunt7092cc42016-04-06 18:40:17 -0700141
Madan Jampani492526a2016-06-06 17:24:04 -0700142 private ExecutorService eventHandler;
143
Simon Huntcda9c032016-04-11 10:32:54 -0700144
145 private ModelCache cache;
146
147
148 @Activate
Ray Milkey9c9cde42018-01-12 14:22:06 -0800149 void activate() {
Simon Hunt642bc452016-05-04 19:34:45 -0700150 cache = new ModelCache(new DefaultServiceBundle(), eventDispatcher);
Simon Hunt8eac4ae2017-01-20 12:56:45 -0800151 eventHandler = newSingleThreadExecutor(groupedThreads("onos/ui/topo", "event-handler", log));
Simon Huntcda9c032016-04-11 10:32:54 -0700152
153 eventDispatcher.addSink(UiModelEvent.class, listenerRegistry);
154
155 clusterService.addListener(clusterListener);
156 mastershipService.addListener(mastershipListener);
157 regionService.addListener(regionListener);
158 deviceService.addListener(deviceListener);
159 linkService.addListener(linkListener);
160 hostService.addListener(hostListener);
161 intentService.addListener(intentListener);
162 flowService.addListener(flowRuleListener);
163
164 cache.load();
165
166 log.info("Started");
Simon Hunted804d52016-03-30 09:51:40 -0700167 }
168
Simon Huntcda9c032016-04-11 10:32:54 -0700169 @Deactivate
Ray Milkey9c9cde42018-01-12 14:22:06 -0800170 void deactivate() {
Simon Huntcda9c032016-04-11 10:32:54 -0700171 eventDispatcher.removeSink(UiModelEvent.class);
172
173 clusterService.removeListener(clusterListener);
174 mastershipService.removeListener(mastershipListener);
175 regionService.removeListener(regionListener);
176 deviceService.removeListener(deviceListener);
177 linkService.removeListener(linkListener);
178 hostService.removeListener(hostListener);
179 intentService.removeListener(intentListener);
180 flowService.removeListener(flowRuleListener);
181
Madan Jampani492526a2016-06-06 17:24:04 -0700182 eventHandler.shutdown();
183
Simon Huntcda9c032016-04-11 10:32:54 -0700184 cache.clear();
185 cache = null;
186
187 log.info("Stopped");
188 }
189
Simon Hunt8eac4ae2017-01-20 12:56:45 -0800190 /**
191 * Injects an instance of the JSON-ifier (which has been bound to the
192 * services (link, host, device, ...)) to be passed on to the Model Cache,
193 * for use in forming UiModelEvent payloads.
194 *
195 * @param t2json JSONifier
196 */
197 public void injectJsonifier(Topo2Jsonifier t2json) {
198 cache.injectJsonifier(t2json);
199 }
200
Simon Huntcda9c032016-04-11 10:32:54 -0700201
Simon Huntf679c4e2016-04-01 17:02:24 -0700202 /**
203 * Registers a UI topology session with the topology model.
204 *
205 * @param session the session to register
206 */
207 public void register(UiTopoSession session) {
208 log.info("Registering topology session {}", session);
Simon Huntcda9c032016-04-11 10:32:54 -0700209 addListener(session);
Simon Hunted804d52016-03-30 09:51:40 -0700210 }
211
Simon Huntf679c4e2016-04-01 17:02:24 -0700212 /**
213 * Unregisters a UI topology session from the topology model.
214 *
215 * @param session the session to unregister
216 */
217 public void unregister(UiTopoSession session) {
218 log.info("Unregistering topology session {}", session);
Simon Huntcda9c032016-04-11 10:32:54 -0700219 removeListener(session);
Simon Huntf679c4e2016-04-01 17:02:24 -0700220 }
221
Simon Huntd5b96732016-07-08 13:22:27 -0700222
223 // =======================================================================
Simon Hunt10973dd2016-08-01 15:50:35 -0700224 // Methods for topo session (or CLI) to use to get information from us
Simon Huntd5b96732016-07-08 13:22:27 -0700225
226 /**
Thomas Vachuska1b1355d2018-02-06 16:53:58 -0800227 * Reloads the cache's internal state.
228 */
229 public void reload() {
230 cache.clear();
231 cache.load();
232 }
233
234 /**
Simon Hunt4854f3d2016-08-02 18:13:15 -0700235 * Refreshes the cache's internal state.
236 */
237 public void refresh() {
238 cache.refresh();
239 }
240
241 /**
242 * Returns the list of cluster members stored in the model cache.
Simon Huntd5b96732016-07-08 13:22:27 -0700243 *
244 * @return list of cluster members
245 */
246 public List<UiClusterMember> getClusterMembers() {
247 return cache.getAllClusterMembers();
248 }
249
Simon Huntd5b96732016-07-08 13:22:27 -0700250 /**
Simon Hunt4854f3d2016-08-02 18:13:15 -0700251 * Returns the set of regions stored in the model cache.
Simon Hunt10973dd2016-08-01 15:50:35 -0700252 *
253 * @return set of regions
254 */
255 public Set<UiRegion> getRegions() {
256 return cache.getAllRegions();
257 }
258
259 /**
Simon Hunt977aa052016-07-20 17:08:29 -0700260 * Returns the region for the given identifier.
Simon Huntd5b96732016-07-08 13:22:27 -0700261 *
Simon Hunt977aa052016-07-20 17:08:29 -0700262 * @param id region identifier
263 * @return the region
Simon Huntd5b96732016-07-08 13:22:27 -0700264 */
Simon Hunt977aa052016-07-20 17:08:29 -0700265 public UiRegion getRegion(RegionId id) {
266 return cache.accessRegion(id);
Simon Huntd5b96732016-07-08 13:22:27 -0700267 }
268
Simon Huntb1ce2602016-07-23 14:04:31 -0700269 /**
270 * Returns the null region.
271 *
272 * @return the null region
273 */
274 public UiRegion getNullRegion() {
275 return cache.nullRegion();
276 }
277
278 /**
Simon Hunt4854f3d2016-08-02 18:13:15 -0700279 * Returns the set of devices stored in the model cache.
280 *
281 * @return set of devices
Simon Huntb1ce2602016-07-23 14:04:31 -0700282 */
Simon Hunt4854f3d2016-08-02 18:13:15 -0700283 public Set<UiDevice> getDevices() {
284 return cache.getAllDevices();
285 }
286
287 /**
288 * Returns the set of hosts stored in the model cache.
289 *
290 * @return set of hosts
291 */
292 public Set<UiHost> getHosts() {
293 return cache.getAllHosts();
294 }
295
296 /**
Simon Huntc13082f2016-08-03 21:20:23 -0700297 * Returns the set of device links stored in the model cache.
Simon Hunt4854f3d2016-08-02 18:13:15 -0700298 *
Simon Huntc13082f2016-08-03 21:20:23 -0700299 * @return set of device links
Simon Hunt4854f3d2016-08-02 18:13:15 -0700300 */
Simon Huntc13082f2016-08-03 21:20:23 -0700301 public Set<UiDeviceLink> getDeviceLinks() {
302 return cache.getAllDeviceLinks();
303 }
304
305 /**
306 * Returns the synthetic links associated with the specified region.
307 *
308 * @param regionId region ID
309 * @return synthetic links for that region
310 */
311 public List<UiSynthLink> getSynthLinks(RegionId regionId) {
312 return cache.getSynthLinks(regionId);
Simon Huntb1ce2602016-07-23 14:04:31 -0700313 }
314
Simon Hunt0e161092017-05-08 17:41:38 -0700315 /**
316 * Returns the synthetic links associated with the specified region,
317 * mapped by original link id.
318 *
319 * @param regionId region ID
320 * @return map of synthetic links for that region
321 */
322 public Map<UiLinkId, UiSynthLink> relevantSynthLinks(RegionId regionId) {
323 return cache.relevantSynthLinks(regionId);
324 }
325
Simon Huntd5b96732016-07-08 13:22:27 -0700326 // =====================================================================
327
328
Simon Hunt642bc452016-05-04 19:34:45 -0700329 /**
330 * Default implementation of service bundle to return references to our
331 * dynamically injected services.
332 */
333 private class DefaultServiceBundle implements ServiceBundle {
334 @Override
Simon Hunt4f4ffc32016-08-03 18:30:47 -0700335 public UiTopoLayoutService layout() {
336 return layoutService;
337 }
338
339 @Override
Simon Hunt642bc452016-05-04 19:34:45 -0700340 public ClusterService cluster() {
341 return clusterService;
342 }
343
344 @Override
345 public MastershipService mastership() {
346 return mastershipService;
347 }
348
349 @Override
350 public RegionService region() {
351 return regionService;
352 }
353
354 @Override
355 public DeviceService device() {
356 return deviceService;
357 }
358
359 @Override
360 public LinkService link() {
361 return linkService;
362 }
363
364 @Override
365 public HostService host() {
366 return hostService;
367 }
368
369 @Override
370 public IntentService intent() {
371 return intentService;
372 }
373
374 @Override
375 public FlowRuleService flow() {
376 return flowService;
377 }
378 }
379
Simon Hunt7092cc42016-04-06 18:40:17 -0700380
Simon Huntcda9c032016-04-11 10:32:54 -0700381 private class InternalClusterListener implements ClusterEventListener {
382 @Override
383 public void event(ClusterEvent event) {
Madan Jampani492526a2016-06-06 17:24:04 -0700384 eventHandler.execute(() -> handleEvent(event));
385 }
386
387 private void handleEvent(ClusterEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700388 ControllerNode cnode = event.subject();
389
390 switch (event.type()) {
391
392 case INSTANCE_ADDED:
393 case INSTANCE_ACTIVATED:
394 case INSTANCE_READY:
395 case INSTANCE_DEACTIVATED:
396 cache.addOrUpdateClusterMember(cnode);
397 break;
398
399 case INSTANCE_REMOVED:
400 cache.removeClusterMember(cnode);
401 break;
402
403 default:
404 break;
405 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700406 }
Simon Huntcda9c032016-04-11 10:32:54 -0700407 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700408
Simon Huntcda9c032016-04-11 10:32:54 -0700409 private class InternalMastershipListener implements MastershipListener {
410 @Override
411 public void event(MastershipEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700412 DeviceId deviceId = event.subject();
413 RoleInfo roleInfo = event.roleInfo();
414
415 switch (event.type()) {
416 case MASTER_CHANGED:
417 case BACKUPS_CHANGED:
418 cache.updateMasterships(deviceId, roleInfo);
419 break;
420
421 default:
422 break;
423 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700424 }
Simon Huntcda9c032016-04-11 10:32:54 -0700425 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700426
Simon Huntcda9c032016-04-11 10:32:54 -0700427 private class InternalRegionListener implements RegionListener {
428 @Override
429 public void event(RegionEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700430 Region region = event.subject();
431
432 switch (event.type()) {
433
434 case REGION_ADDED:
435 case REGION_UPDATED:
436 case REGION_MEMBERSHIP_CHANGED:
437 cache.addOrUpdateRegion(region);
438 break;
439
440 case REGION_REMOVED:
441 cache.removeRegion(region);
442 break;
443
444 default:
445 break;
446 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700447 }
Simon Huntcda9c032016-04-11 10:32:54 -0700448 }
Simon Hunt7092cc42016-04-06 18:40:17 -0700449
Simon Huntcda9c032016-04-11 10:32:54 -0700450 private class InternalDeviceListener implements DeviceListener {
451 @Override
452 public void event(DeviceEvent event) {
Simon Huntcda9c032016-04-11 10:32:54 -0700453 Device device = event.subject();
Simon Hunt7092cc42016-04-06 18:40:17 -0700454
Simon Huntcda9c032016-04-11 10:32:54 -0700455 switch (event.type()) {
Simon Hunt7092cc42016-04-06 18:40:17 -0700456
Simon Huntcda9c032016-04-11 10:32:54 -0700457 case DEVICE_ADDED:
458 case DEVICE_UPDATED:
459 case DEVICE_AVAILABILITY_CHANGED:
460 case DEVICE_SUSPENDED:
461 cache.addOrUpdateDevice(device);
462 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700463
Simon Huntcda9c032016-04-11 10:32:54 -0700464 case DEVICE_REMOVED:
465 cache.removeDevice(device);
466 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700467
Simon Huntcda9c032016-04-11 10:32:54 -0700468 default:
469 break;
Simon Hunt7092cc42016-04-06 18:40:17 -0700470 }
471 }
472 }
473
Simon Huntcda9c032016-04-11 10:32:54 -0700474 private class InternalLinkListener implements LinkListener {
475 @Override
476 public void event(LinkEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700477 Link link = event.subject();
478
479 switch (event.type()) {
480
481 case LINK_ADDED:
482 case LINK_UPDATED:
Simon Huntc13082f2016-08-03 21:20:23 -0700483 cache.addOrUpdateDeviceLink(link);
Simon Hunt23fb1352016-04-11 12:15:19 -0700484 break;
485
486 case LINK_REMOVED:
Simon Huntc13082f2016-08-03 21:20:23 -0700487 cache.removeDeviceLink(link);
Simon Hunt23fb1352016-04-11 12:15:19 -0700488 break;
489
490 default:
491 break;
492 }
Simon Huntcda9c032016-04-11 10:32:54 -0700493 }
Simon Hunted804d52016-03-30 09:51:40 -0700494 }
495
Simon Huntcda9c032016-04-11 10:32:54 -0700496 private class InternalHostListener implements HostListener {
497 @Override
498 public void event(HostEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700499 Host host = event.subject();
500 Host prevHost = event.prevSubject();
501
502 switch (event.type()) {
503
504 case HOST_ADDED:
505 case HOST_UPDATED:
506 cache.addOrUpdateHost(host);
507 break;
508
509 case HOST_MOVED:
510 cache.moveHost(host, prevHost);
511 break;
512
513 case HOST_REMOVED:
514 cache.removeHost(host);
515 break;
516
517 default:
518 break;
519 }
Simon Huntcda9c032016-04-11 10:32:54 -0700520 }
Simon Hunted804d52016-03-30 09:51:40 -0700521 }
Simon Huntcda9c032016-04-11 10:32:54 -0700522
Simon Hunt23fb1352016-04-11 12:15:19 -0700523 // =======================================================================
524 // NOTE: Neither intents nor flows are modeled by the UiTopology.
525 // Rather, they are serviced directly from this class.
526 // Additionally, since we are only retrieving counts (in the current
527 // implementation), we'll fetch them on demand from the service.
528 // Thus, the following internal listeners are stubs only (for now).
529 // =======================================================================
530
Simon Huntcda9c032016-04-11 10:32:54 -0700531 private class InternalIntentListener implements IntentListener {
532 @Override
533 public void event(IntentEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700534 // do nothing (for now)
Simon Huntcda9c032016-04-11 10:32:54 -0700535 }
536 }
537
538 private class InternalFlowRuleListener implements FlowRuleListener {
539 @Override
540 public void event(FlowRuleEvent event) {
Simon Hunt23fb1352016-04-11 12:15:19 -0700541 // do nothing (for now)
Simon Huntcda9c032016-04-11 10:32:54 -0700542 }
543 }
544
Simon Hunted804d52016-03-30 09:51:40 -0700545}