diff options
Diffstat (limited to 'framework/src/onos/tools/package/archetypes/uitopo/src/main/resources/archetype-resources/src/main/java/AppUiTopovMessageHandler.java')
-rw-r--r-- | framework/src/onos/tools/package/archetypes/uitopo/src/main/resources/archetype-resources/src/main/java/AppUiTopovMessageHandler.java | 319 |
1 files changed, 319 insertions, 0 deletions
diff --git a/framework/src/onos/tools/package/archetypes/uitopo/src/main/resources/archetype-resources/src/main/java/AppUiTopovMessageHandler.java b/framework/src/onos/tools/package/archetypes/uitopo/src/main/resources/archetype-resources/src/main/java/AppUiTopovMessageHandler.java new file mode 100644 index 00000000..fe28186b --- /dev/null +++ b/framework/src/onos/tools/package/archetypes/uitopo/src/main/resources/archetype-resources/src/main/java/AppUiTopovMessageHandler.java @@ -0,0 +1,319 @@ +#set( $symbol_pound = '#' ) +#set( $symbol_dollar = '$' ) +#set( $symbol_escape = '\' ) +/* + * Copyright 2014,2015 Open Networking Laboratory + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ${package}; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.google.common.base.Strings; +import com.google.common.collect.ImmutableSet; +import org.onlab.osgi.ServiceDirectory; +import org.onosproject.net.Device; +import org.onosproject.net.DeviceId; +import org.onosproject.net.Element; +import org.onosproject.net.HostId; +import org.onosproject.net.Link; +import org.onosproject.net.device.DeviceService; +import org.onosproject.net.host.HostService; +import org.onosproject.net.link.LinkService; +import org.onosproject.ui.RequestHandler; +import org.onosproject.ui.UiConnection; +import org.onosproject.ui.UiMessageHandler; +import org.onosproject.ui.topo.Highlights; +import org.onosproject.ui.topo.TopoJson; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; +import java.util.Timer; +import java.util.TimerTask; + +/** + * Skeletal ONOS UI Topology-Overlay message handler. + */ +public class AppUiTopovMessageHandler extends UiMessageHandler { + + private static final String SAMPLE_DISPLAY_START = "sampleDisplayStart"; + private static final String SAMPLE_DISPLAY_UPDATE = "sampleDisplayUpdate"; + private static final String SAMPLE_DISPLAY_STOP = "sampleDisplayStop"; + + private static final String ID = "id"; + private static final String MODE = "mode"; + + private static final long UPDATE_PERIOD_MS = 1000; + + private static final Link[] EMPTY_LINK_SET = new Link[0]; + + private enum Mode { IDLE, MOUSE, LINK } + + private final Logger log = LoggerFactory.getLogger(getClass()); + + private DeviceService deviceService; + private HostService hostService; + private LinkService linkService; + + private final Timer timer = new Timer("sample-overlay"); + private TimerTask demoTask = null; + private Mode currentMode = Mode.IDLE; + private Element elementOfNote; + private Link[] linkSet = EMPTY_LINK_SET; + private int linkIndex; + + + // ===============-=-=-=-=-=-======================-=-=-=-=-=-=-================================ + + + @Override + public void init(UiConnection connection, ServiceDirectory directory) { + super.init(connection, directory); + deviceService = directory.get(DeviceService.class); + hostService = directory.get(HostService.class); + linkService = directory.get(LinkService.class); + } + + @Override + protected Collection<RequestHandler> createRequestHandlers() { + return ImmutableSet.of( + new DisplayStartHandler(), + new DisplayUpdateHandler(), + new DisplayStopHandler() + ); + } + + // === ------------------------- + // === Handler classes + + private final class DisplayStartHandler extends RequestHandler { + public DisplayStartHandler() { + super(SAMPLE_DISPLAY_START); + } + + @Override + public void process(long sid, ObjectNode payload) { + String mode = string(payload, MODE); + + log.debug("Start Display: mode [{}]", mode); + clearState(); + clearForMode(); + + switch (mode) { + case "mouse": + currentMode = Mode.MOUSE; + cancelTask(); + sendMouseData(); + break; + + case "link": + currentMode = Mode.LINK; + scheduleTask(); + initLinkSet(); + sendLinkData(); + break; + + default: + currentMode = Mode.IDLE; + cancelTask(); + break; + } + } + } + + private final class DisplayUpdateHandler extends RequestHandler { + public DisplayUpdateHandler() { + super(SAMPLE_DISPLAY_UPDATE); + } + + @Override + public void process(long sid, ObjectNode payload) { + String id = string(payload, ID); + log.debug("Update Display: id [{}]", id); + if (!Strings.isNullOrEmpty(id)) { + updateForMode(id); + } else { + clearForMode(); + } + } + } + + private final class DisplayStopHandler extends RequestHandler { + public DisplayStopHandler() { + super(SAMPLE_DISPLAY_STOP); + } + + @Override + public void process(long sid, ObjectNode payload) { + log.debug("Stop Display"); + cancelTask(); + clearState(); + clearForMode(); + } + } + + // === ------------ + + private void clearState() { + currentMode = Mode.IDLE; + elementOfNote = null; + linkSet = EMPTY_LINK_SET; + } + + private void updateForMode(String id) { + log.debug("host service: {}", hostService); + log.debug("device service: {}", deviceService); + + try { + HostId hid = HostId.hostId(id); + log.debug("host id {}", hid); + elementOfNote = hostService.getHost(hid); + log.debug("host element {}", elementOfNote); + + } catch (Exception e) { + try { + DeviceId did = DeviceId.deviceId(id); + log.debug("device id {}", did); + elementOfNote = deviceService.getDevice(did); + log.debug("device element {}", elementOfNote); + + } catch (Exception e2) { + log.debug("Unable to process ID [{}]", id); + elementOfNote = null; + } + } + + switch (currentMode) { + case MOUSE: + sendMouseData(); + break; + + case LINK: + sendLinkData(); + break; + + default: + break; + } + + } + + private void clearForMode() { + sendHighlights(new Highlights()); + } + + private void sendHighlights(Highlights highlights) { + sendMessage(TopoJson.highlightsMessage(highlights)); + } + + + private void sendMouseData() { + if (elementOfNote != null && elementOfNote instanceof Device) { + DeviceId devId = (DeviceId) elementOfNote.id(); + Set<Link> links = linkService.getDeviceEgressLinks(devId); + sendHighlights(fromLinks(links, devId)); + } + // Note: could also process Host, if available + } + + private Highlights fromLinks(Set<Link> links, DeviceId devId) { + DemoLinkMap linkMap = new DemoLinkMap(); + if (links != null) { + log.debug("Processing {} links", links.size()); + links.forEach(linkMap::add); + } else { + log.debug("No egress links found for device {}", devId); + } + + Highlights highlights = new Highlights(); + + for (DemoLink dlink : linkMap.biLinks()) { + dlink.makeImportant().setLabel("Yo!"); + highlights.add(dlink.highlight(null)); + } + return highlights; + } + + private void initLinkSet() { + Set<Link> links = new HashSet<>(); + for (Link link : linkService.getActiveLinks()) { + links.add(link); + } + linkSet = links.toArray(new Link[links.size()]); + linkIndex = 0; + log.debug("initialized link set to {}", linkSet.length); + } + + private void sendLinkData() { + DemoLinkMap linkMap = new DemoLinkMap(); + for (Link link : linkSet) { + linkMap.add(link); + } + DemoLink dl = linkMap.add(linkSet[linkIndex]); + dl.makeImportant().setLabel(Integer.toString(linkIndex)); + log.debug("sending link data (index {})", linkIndex); + + linkIndex += 1; + if (linkIndex >= linkSet.length) { + linkIndex = 0; + } + + Highlights highlights = new Highlights(); + for (DemoLink dlink : linkMap.biLinks()) { + highlights.add(dlink.highlight(null)); + } + + sendHighlights(highlights); + } + + private synchronized void scheduleTask() { + if (demoTask == null) { + log.debug("Starting up demo task..."); + demoTask = new DisplayUpdateTask(); + timer.schedule(demoTask, UPDATE_PERIOD_MS, UPDATE_PERIOD_MS); + } else { + log.debug("(demo task already running"); + } + } + + private synchronized void cancelTask() { + if (demoTask != null) { + demoTask.cancel(); + demoTask = null; + } + } + + + private class DisplayUpdateTask extends TimerTask { + @Override + public void run() { + try { + switch (currentMode) { + case LINK: + sendLinkData(); + break; + + default: + break; + } + } catch (Exception e) { + log.warn("Unable to process demo task: {}", e.getMessage()); + log.debug("Oops", e); + } + } + } + +}
\ No newline at end of file |