Committed by
Gerrit Code Review
UI topo model - Started fleshing out the UiSharedTopologyModel
- marked model listeners in TopolgyViewMessageHandler as deprecated. - UiWebSocket now creates a (currently inert) UiTopoSession. Change-Id: Ic385d782a2f56a90565ad744128f8e469678bcc7
Showing
4 changed files
with
191 additions
and
21 deletions
| ... | @@ -714,6 +714,8 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { | ... | @@ -714,6 +714,8 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { |
| 714 | } | 714 | } |
| 715 | 715 | ||
| 716 | // Cluster event listener. | 716 | // Cluster event listener. |
| 717 | + // TODO: Superceded by UiSharedTopologyModel.ModelEventListener | ||
| 718 | + @Deprecated | ||
| 717 | private class InternalClusterListener implements ClusterEventListener { | 719 | private class InternalClusterListener implements ClusterEventListener { |
| 718 | @Override | 720 | @Override |
| 719 | public void event(ClusterEvent event) { | 721 | public void event(ClusterEvent event) { |
| ... | @@ -722,6 +724,8 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { | ... | @@ -722,6 +724,8 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { |
| 722 | } | 724 | } |
| 723 | 725 | ||
| 724 | // Mastership change listener | 726 | // Mastership change listener |
| 727 | + // TODO: Superceded by UiSharedTopologyModel.ModelEventListener | ||
| 728 | + @Deprecated | ||
| 725 | private class InternalMastershipListener implements MastershipListener { | 729 | private class InternalMastershipListener implements MastershipListener { |
| 726 | @Override | 730 | @Override |
| 727 | public void event(MastershipEvent event) { | 731 | public void event(MastershipEvent event) { |
| ... | @@ -736,6 +740,8 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { | ... | @@ -736,6 +740,8 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { |
| 736 | } | 740 | } |
| 737 | 741 | ||
| 738 | // Device event listener. | 742 | // Device event listener. |
| 743 | + // TODO: Superceded by UiSharedTopologyModel.ModelEventListener | ||
| 744 | + @Deprecated | ||
| 739 | private class InternalDeviceListener implements DeviceListener { | 745 | private class InternalDeviceListener implements DeviceListener { |
| 740 | @Override | 746 | @Override |
| 741 | public void event(DeviceEvent event) { | 747 | public void event(DeviceEvent event) { |
| ... | @@ -748,6 +754,8 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { | ... | @@ -748,6 +754,8 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { |
| 748 | } | 754 | } |
| 749 | 755 | ||
| 750 | // Link event listener. | 756 | // Link event listener. |
| 757 | + // TODO: Superceded by UiSharedTopologyModel.ModelEventListener | ||
| 758 | + @Deprecated | ||
| 751 | private class InternalLinkListener implements LinkListener { | 759 | private class InternalLinkListener implements LinkListener { |
| 752 | @Override | 760 | @Override |
| 753 | public void event(LinkEvent event) { | 761 | public void event(LinkEvent event) { |
| ... | @@ -758,6 +766,8 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { | ... | @@ -758,6 +766,8 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { |
| 758 | } | 766 | } |
| 759 | 767 | ||
| 760 | // Host event listener. | 768 | // Host event listener. |
| 769 | + // TODO: Superceded by UiSharedTopologyModel.ModelEventListener | ||
| 770 | + @Deprecated | ||
| 761 | private class InternalHostListener implements HostListener { | 771 | private class InternalHostListener implements HostListener { |
| 762 | @Override | 772 | @Override |
| 763 | public void event(HostEvent event) { | 773 | public void event(HostEvent event) { |
| ... | @@ -768,6 +778,8 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { | ... | @@ -768,6 +778,8 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { |
| 768 | } | 778 | } |
| 769 | 779 | ||
| 770 | // Intent event listener. | 780 | // Intent event listener. |
| 781 | + // TODO: Superceded by UiSharedTopologyModel.ModelEventListener | ||
| 782 | + @Deprecated | ||
| 771 | private class InternalIntentListener implements IntentListener { | 783 | private class InternalIntentListener implements IntentListener { |
| 772 | @Override | 784 | @Override |
| 773 | public void event(IntentEvent event) { | 785 | public void event(IntentEvent event) { |
| ... | @@ -777,6 +789,8 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { | ... | @@ -777,6 +789,8 @@ public class TopologyViewMessageHandler extends TopologyViewMessageHandlerBase { |
| 777 | } | 789 | } |
| 778 | 790 | ||
| 779 | // Intent event listener. | 791 | // Intent event listener. |
| 792 | + // TODO: Superceded by UiSharedTopologyModel.ModelEventListener | ||
| 793 | + @Deprecated | ||
| 780 | private class InternalFlowListener implements FlowRuleListener { | 794 | private class InternalFlowListener implements FlowRuleListener { |
| 781 | @Override | 795 | @Override |
| 782 | public void event(FlowRuleEvent event) { | 796 | public void event(FlowRuleEvent event) { | ... | ... |
| ... | @@ -28,6 +28,7 @@ import org.onosproject.ui.UiExtensionService; | ... | @@ -28,6 +28,7 @@ import org.onosproject.ui.UiExtensionService; |
| 28 | import org.onosproject.ui.UiMessageHandlerFactory; | 28 | import org.onosproject.ui.UiMessageHandlerFactory; |
| 29 | import org.onosproject.ui.UiMessageHandler; | 29 | import org.onosproject.ui.UiMessageHandler; |
| 30 | import org.onosproject.ui.UiTopoOverlayFactory; | 30 | import org.onosproject.ui.UiTopoOverlayFactory; |
| 31 | +import org.onosproject.ui.impl.topo.UiTopoSession; | ||
| 31 | import org.onosproject.ui.topo.TopoConstants; | 32 | import org.onosproject.ui.topo.TopoConstants; |
| 32 | import org.slf4j.Logger; | 33 | import org.slf4j.Logger; |
| 33 | import org.slf4j.LoggerFactory; | 34 | import org.slf4j.LoggerFactory; |
| ... | @@ -37,7 +38,7 @@ import java.util.HashMap; | ... | @@ -37,7 +38,7 @@ import java.util.HashMap; |
| 37 | import java.util.Map; | 38 | import java.util.Map; |
| 38 | 39 | ||
| 39 | /** | 40 | /** |
| 40 | - * Web socket capable of interacting with the GUI. | 41 | + * Web socket capable of interacting with the Web UI. |
| 41 | */ | 42 | */ |
| 42 | public class UiWebSocket | 43 | public class UiWebSocket |
| 43 | implements UiConnection, WebSocket.OnTextMessage, WebSocket.OnControl { | 44 | implements UiConnection, WebSocket.OnTextMessage, WebSocket.OnControl { |
| ... | @@ -50,14 +51,14 @@ public class UiWebSocket | ... | @@ -50,14 +51,14 @@ public class UiWebSocket |
| 50 | private static final byte PONG = 0xA; | 51 | private static final byte PONG = 0xA; |
| 51 | private static final byte[] PING_DATA = new byte[]{(byte) 0xde, (byte) 0xad}; | 52 | private static final byte[] PING_DATA = new byte[]{(byte) 0xde, (byte) 0xad}; |
| 52 | 53 | ||
| 54 | + private final ObjectMapper mapper = new ObjectMapper(); | ||
| 53 | private final ServiceDirectory directory; | 55 | private final ServiceDirectory directory; |
| 56 | + private final UiTopoSession topoSession; | ||
| 54 | 57 | ||
| 55 | private Connection connection; | 58 | private Connection connection; |
| 56 | private FrameConnection control; | 59 | private FrameConnection control; |
| 57 | private String userName; | 60 | private String userName; |
| 58 | 61 | ||
| 59 | - private final ObjectMapper mapper = new ObjectMapper(); | ||
| 60 | - | ||
| 61 | private long lastActive = System.currentTimeMillis(); | 62 | private long lastActive = System.currentTimeMillis(); |
| 62 | 63 | ||
| 63 | private Map<String, UiMessageHandler> handlers; | 64 | private Map<String, UiMessageHandler> handlers; |
| ... | @@ -72,6 +73,7 @@ public class UiWebSocket | ... | @@ -72,6 +73,7 @@ public class UiWebSocket |
| 72 | public UiWebSocket(ServiceDirectory directory, String userName) { | 73 | public UiWebSocket(ServiceDirectory directory, String userName) { |
| 73 | this.directory = directory; | 74 | this.directory = directory; |
| 74 | this.userName = userName; | 75 | this.userName = userName; |
| 76 | + this.topoSession = new UiTopoSession(this); | ||
| 75 | } | 77 | } |
| 76 | 78 | ||
| 77 | @Override | 79 | @Override |
| ... | @@ -115,6 +117,7 @@ public class UiWebSocket | ... | @@ -115,6 +117,7 @@ public class UiWebSocket |
| 115 | this.connection = connection; | 117 | this.connection = connection; |
| 116 | this.control = (FrameConnection) connection; | 118 | this.control = (FrameConnection) connection; |
| 117 | try { | 119 | try { |
| 120 | + topoSession.init(); | ||
| 118 | createHandlersAndOverlays(); | 121 | createHandlersAndOverlays(); |
| 119 | sendInstanceData(); | 122 | sendInstanceData(); |
| 120 | log.info("GUI client connected"); | 123 | log.info("GUI client connected"); |
| ... | @@ -129,6 +132,7 @@ public class UiWebSocket | ... | @@ -129,6 +132,7 @@ public class UiWebSocket |
| 129 | 132 | ||
| 130 | @Override | 133 | @Override |
| 131 | public synchronized void onClose(int closeCode, String message) { | 134 | public synchronized void onClose(int closeCode, String message) { |
| 135 | + topoSession.destroy(); | ||
| 132 | destroyHandlersAndOverlays(); | 136 | destroyHandlersAndOverlays(); |
| 133 | log.info("GUI client disconnected [close-code={}, message={}]", | 137 | log.info("GUI client disconnected [close-code={}, message={}]", |
| 134 | closeCode, message); | 138 | closeCode, message); | ... | ... |
| ... | @@ -36,31 +36,33 @@ import org.slf4j.LoggerFactory; | ... | @@ -36,31 +36,33 @@ import org.slf4j.LoggerFactory; |
| 36 | public class UiTopoSession { | 36 | public class UiTopoSession { |
| 37 | private final Logger log = LoggerFactory.getLogger(getClass()); | 37 | private final Logger log = LoggerFactory.getLogger(getClass()); |
| 38 | 38 | ||
| 39 | - private final String username; | ||
| 40 | private final UiWebSocket webSocket; | 39 | private final UiWebSocket webSocket; |
| 41 | - private final UiSharedTopologyModel sharedModel; | 40 | + private final String username; |
| 41 | + | ||
| 42 | + final UiSharedTopologyModel sharedModel; | ||
| 42 | 43 | ||
| 43 | private boolean registered = false; | 44 | private boolean registered = false; |
| 44 | 45 | ||
| 45 | private UiTopoLayoutService service; | 46 | private UiTopoLayoutService service; |
| 46 | - private UiTopoLayout layout; | 47 | + private UiTopoLayout currentLayout; |
| 47 | 48 | ||
| 48 | /** | 49 | /** |
| 49 | - * Creates a new topology layout. | 50 | + * Creates a new topology session for the specified web socket connection. |
| 50 | - * @param username user name | 51 | + * |
| 51 | * @param webSocket web socket | 52 | * @param webSocket web socket |
| 52 | */ | 53 | */ |
| 53 | - public UiTopoSession(String username, UiWebSocket webSocket) { | 54 | + public UiTopoSession(UiWebSocket webSocket) { |
| 54 | - this.username = username; | ||
| 55 | this.webSocket = webSocket; | 55 | this.webSocket = webSocket; |
| 56 | + this.username = webSocket.userName(); | ||
| 56 | this.sharedModel = UiSharedTopologyModel.instance(); | 57 | this.sharedModel = UiSharedTopologyModel.instance(); |
| 57 | } | 58 | } |
| 58 | 59 | ||
| 59 | /** | 60 | /** |
| 60 | - * Initializes the layout; registering with the shared model. | 61 | + * Initializes the session; registering with the shared model. |
| 61 | */ | 62 | */ |
| 62 | public void init() { | 63 | public void init() { |
| 63 | if (!registered) { | 64 | if (!registered) { |
| 65 | + log.debug("{} : Registering with shared model", this); | ||
| 64 | sharedModel.register(this); | 66 | sharedModel.register(this); |
| 65 | registered = true; | 67 | registered = true; |
| 66 | } else { | 68 | } else { |
| ... | @@ -69,10 +71,11 @@ public class UiTopoSession { | ... | @@ -69,10 +71,11 @@ public class UiTopoSession { |
| 69 | } | 71 | } |
| 70 | 72 | ||
| 71 | /** | 73 | /** |
| 72 | - * Destroys the layout; unregistering from the shared model. | 74 | + * Destroys the session; unregistering from the shared model. |
| 73 | */ | 75 | */ |
| 74 | public void destroy() { | 76 | public void destroy() { |
| 75 | - if (!registered) { | 77 | + if (registered) { |
| 78 | + log.debug("{} : Unregistering from shared model", this); | ||
| 76 | sharedModel.unregister(this); | 79 | sharedModel.unregister(this); |
| 77 | registered = false; | 80 | registered = false; |
| 78 | } else { | 81 | } else { | ... | ... |
| ... | @@ -16,10 +16,43 @@ | ... | @@ -16,10 +16,43 @@ |
| 16 | 16 | ||
| 17 | package org.onosproject.ui.impl.topo.model; | 17 | package org.onosproject.ui.impl.topo.model; |
| 18 | 18 | ||
| 19 | +import org.onlab.osgi.DefaultServiceDirectory; | ||
| 20 | +import org.onlab.osgi.ServiceDirectory; | ||
| 21 | +import org.onosproject.cluster.ClusterEvent; | ||
| 22 | +import org.onosproject.cluster.ClusterEventListener; | ||
| 23 | +import org.onosproject.cluster.ClusterService; | ||
| 24 | +import org.onosproject.incubator.net.PortStatisticsService; | ||
| 25 | +import org.onosproject.incubator.net.tunnel.TunnelService; | ||
| 26 | +import org.onosproject.mastership.MastershipEvent; | ||
| 27 | +import org.onosproject.mastership.MastershipListener; | ||
| 28 | +import org.onosproject.mastership.MastershipService; | ||
| 29 | +import org.onosproject.net.device.DeviceEvent; | ||
| 30 | +import org.onosproject.net.device.DeviceListener; | ||
| 31 | +import org.onosproject.net.device.DeviceService; | ||
| 32 | +import org.onosproject.net.flow.FlowRuleEvent; | ||
| 33 | +import org.onosproject.net.flow.FlowRuleListener; | ||
| 34 | +import org.onosproject.net.flow.FlowRuleService; | ||
| 35 | +import org.onosproject.net.host.HostEvent; | ||
| 36 | +import org.onosproject.net.host.HostListener; | ||
| 37 | +import org.onosproject.net.host.HostService; | ||
| 38 | +import org.onosproject.net.intent.IntentEvent; | ||
| 39 | +import org.onosproject.net.intent.IntentListener; | ||
| 40 | +import org.onosproject.net.intent.IntentService; | ||
| 41 | +import org.onosproject.net.link.LinkEvent; | ||
| 42 | +import org.onosproject.net.link.LinkListener; | ||
| 43 | +import org.onosproject.net.link.LinkService; | ||
| 44 | +import org.onosproject.net.region.RegionEvent; | ||
| 45 | +import org.onosproject.net.region.RegionListener; | ||
| 46 | +import org.onosproject.net.region.RegionService; | ||
| 47 | +import org.onosproject.net.statistic.StatisticService; | ||
| 48 | +import org.onosproject.net.topology.TopologyService; | ||
| 19 | import org.onosproject.ui.impl.topo.UiTopoSession; | 49 | import org.onosproject.ui.impl.topo.UiTopoSession; |
| 20 | import org.slf4j.Logger; | 50 | import org.slf4j.Logger; |
| 21 | import org.slf4j.LoggerFactory; | 51 | import org.slf4j.LoggerFactory; |
| 22 | 52 | ||
| 53 | +import java.util.HashSet; | ||
| 54 | +import java.util.Set; | ||
| 55 | + | ||
| 23 | /** | 56 | /** |
| 24 | * A lazily-initialized Singleton that creates and maintains the UI-model | 57 | * A lazily-initialized Singleton that creates and maintains the UI-model |
| 25 | * of the network topology. | 58 | * of the network topology. |
| ... | @@ -29,15 +62,17 @@ public final class UiSharedTopologyModel { | ... | @@ -29,15 +62,17 @@ public final class UiSharedTopologyModel { |
| 29 | private static final Logger log = | 62 | private static final Logger log = |
| 30 | LoggerFactory.getLogger(UiSharedTopologyModel.class); | 63 | LoggerFactory.getLogger(UiSharedTopologyModel.class); |
| 31 | 64 | ||
| 65 | + private final ModelEventListener modelEventListener; | ||
| 32 | 66 | ||
| 33 | - private UiSharedTopologyModel() { | 67 | + private final Set<UiTopoSession> sessions = new HashSet<>(); |
| 34 | - // TODO: set up core model listeners and build the state of the model | ||
| 35 | - } | ||
| 36 | 68 | ||
| 37 | - // TODO: Note to Thomas (or others).. | 69 | + private UiSharedTopologyModel() { |
| 38 | - // Don't we have a common pattern for adding/removing listeners and | 70 | + modelEventListener = new ModelEventListener().init(); |
| 39 | - // invoking them when things happen? | ||
| 40 | 71 | ||
| 72 | + // TODO: build and maintain the state of the model | ||
| 73 | + // (1) query model for current state | ||
| 74 | + // (2) update state as model events arrive | ||
| 75 | + } | ||
| 41 | 76 | ||
| 42 | /** | 77 | /** |
| 43 | * Registers a UI topology session with the topology model. | 78 | * Registers a UI topology session with the topology model. |
| ... | @@ -46,7 +81,7 @@ public final class UiSharedTopologyModel { | ... | @@ -46,7 +81,7 @@ public final class UiSharedTopologyModel { |
| 46 | */ | 81 | */ |
| 47 | public void register(UiTopoSession session) { | 82 | public void register(UiTopoSession session) { |
| 48 | log.info("Registering topology session {}", session); | 83 | log.info("Registering topology session {}", session); |
| 49 | - // TODO: register the session | 84 | + sessions.add(session); |
| 50 | } | 85 | } |
| 51 | 86 | ||
| 52 | /** | 87 | /** |
| ... | @@ -56,9 +91,123 @@ public final class UiSharedTopologyModel { | ... | @@ -56,9 +91,123 @@ public final class UiSharedTopologyModel { |
| 56 | */ | 91 | */ |
| 57 | public void unregister(UiTopoSession session) { | 92 | public void unregister(UiTopoSession session) { |
| 58 | log.info("Unregistering topology session {}", session); | 93 | log.info("Unregistering topology session {}", session); |
| 59 | - // TODO: unregister the session | 94 | + sessions.remove(session); |
| 95 | + } | ||
| 96 | + | ||
| 97 | + | ||
| 98 | + // TODO: notify registered sessions when changes happen to the model | ||
| 99 | + | ||
| 100 | + | ||
| 101 | + // ---------- | ||
| 102 | + | ||
| 103 | + // inner class to encapsulate the model listeners | ||
| 104 | + private final class ModelEventListener { | ||
| 105 | + | ||
| 106 | + // TODO: Review - is this good enough? couldn't otherwise see how to inject | ||
| 107 | + private final ServiceDirectory directory = new DefaultServiceDirectory(); | ||
| 108 | + | ||
| 109 | + private ClusterService clusterService; | ||
| 110 | + private MastershipService mastershipService; | ||
| 111 | + private RegionService regionService; | ||
| 112 | + private DeviceService deviceService; | ||
| 113 | + private LinkService linkService; | ||
| 114 | + private HostService hostService; | ||
| 115 | + private IntentService intentService; | ||
| 116 | + private FlowRuleService flowService; | ||
| 117 | + | ||
| 118 | + private StatisticService flowStatsService; | ||
| 119 | + private PortStatisticsService portStatsService; | ||
| 120 | + private TopologyService topologyService; | ||
| 121 | + private TunnelService tunnelService; | ||
| 122 | + | ||
| 123 | + private ModelEventListener init() { | ||
| 124 | + clusterService = directory.get(ClusterService.class); | ||
| 125 | + mastershipService = directory.get(MastershipService.class); | ||
| 126 | + regionService = directory.get(RegionService.class); | ||
| 127 | + deviceService = directory.get(DeviceService.class); | ||
| 128 | + linkService = directory.get(LinkService.class); | ||
| 129 | + hostService = directory.get(HostService.class); | ||
| 130 | + intentService = directory.get(IntentService.class); | ||
| 131 | + flowService = directory.get(FlowRuleService.class); | ||
| 132 | + | ||
| 133 | + // passive services (?) to whom we are not listening... | ||
| 134 | + flowStatsService = directory.get(StatisticService.class); | ||
| 135 | + portStatsService = directory.get(PortStatisticsService.class); | ||
| 136 | + topologyService = directory.get(TopologyService.class); | ||
| 137 | + tunnelService = directory.get(TunnelService.class); | ||
| 138 | + | ||
| 139 | + return this; | ||
| 140 | + } | ||
| 141 | + | ||
| 142 | + private class InternalClusterListener implements ClusterEventListener { | ||
| 143 | + @Override | ||
| 144 | + public void event(ClusterEvent event) { | ||
| 145 | + // TODO: handle cluster event | ||
| 146 | + // (1) emit cluster member event | ||
| 147 | + } | ||
| 148 | + } | ||
| 149 | + | ||
| 150 | + private class InternalMastershipListener implements MastershipListener { | ||
| 151 | + @Override | ||
| 152 | + public void event(MastershipEvent event) { | ||
| 153 | + // TODO: handle mastership event | ||
| 154 | + // (1) emit cluster member update for all members | ||
| 155 | + // (2) emit update device event for he whose mastership changed | ||
| 156 | + } | ||
| 157 | + } | ||
| 158 | + | ||
| 159 | + private class InternalRegionListener implements RegionListener { | ||
| 160 | + @Override | ||
| 161 | + public void event(RegionEvent event) { | ||
| 162 | + // TODO: handle region event | ||
| 163 | + // (1) emit region event | ||
| 164 | + } | ||
| 165 | + } | ||
| 166 | + | ||
| 167 | + private class InternalDeviceListener implements DeviceListener { | ||
| 168 | + @Override | ||
| 169 | + public void event(DeviceEvent event) { | ||
| 170 | + // TODO: handle device event | ||
| 171 | + // (1) emit device event | ||
| 172 | + } | ||
| 173 | + } | ||
| 174 | + | ||
| 175 | + private class InternalLinkListener implements LinkListener { | ||
| 176 | + @Override | ||
| 177 | + public void event(LinkEvent event) { | ||
| 178 | + // TODO: handle link event | ||
| 179 | + // (1) consolidate infrastructure links -> UiLink (?) | ||
| 180 | + // (2) emit link event | ||
| 181 | + } | ||
| 182 | + } | ||
| 183 | + | ||
| 184 | + private class InternalHostListener implements HostListener { | ||
| 185 | + @Override | ||
| 186 | + public void event(HostEvent event) { | ||
| 187 | + // TODO: handle host event | ||
| 188 | + // (1) emit host event | ||
| 189 | + } | ||
| 190 | + } | ||
| 191 | + | ||
| 192 | + private class InternalIntentListener implements IntentListener { | ||
| 193 | + @Override | ||
| 194 | + public void event(IntentEvent event) { | ||
| 195 | + // TODO: handle intent event | ||
| 196 | + // (1) update cache of intent counts? | ||
| 197 | + } | ||
| 198 | + } | ||
| 199 | + | ||
| 200 | + private class InternalFlowRuleListener implements FlowRuleListener { | ||
| 201 | + @Override | ||
| 202 | + public void event(FlowRuleEvent event) { | ||
| 203 | + // TODO: handle flowrule event | ||
| 204 | + // (1) update cache of flow counts? | ||
| 205 | + } | ||
| 206 | + } | ||
| 60 | } | 207 | } |
| 61 | 208 | ||
| 209 | + // ---------- | ||
| 210 | + | ||
| 62 | /** | 211 | /** |
| 63 | * Bill Pugh Singleton pattern. INSTANCE won't be instantiated until the | 212 | * Bill Pugh Singleton pattern. INSTANCE won't be instantiated until the |
| 64 | * LazyHolder class is loaded via a call to the instance() method below. | 213 | * LazyHolder class is loaded via a call to the instance() method below. | ... | ... |
-
Please register or login to post a comment