/* * Copyright 2015-present 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 org.onosproject.ui.topo; import com.google.common.base.Preconditions; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import static com.google.common.base.Preconditions.checkNotNull; /** * Encapsulates highlights to be applied to the topology view, such as * highlighting links, displaying link labels, perhaps even decorating * nodes with badges, etc. */ public class Highlights { private static final String EMPTY = ""; private static final String MIN = "min"; private static final String MAX = "max"; /** * A notion of amount. */ public enum Amount { ZERO(EMPTY), MINIMALLY(MIN), MAXIMALLY(MAX); private final String s; Amount(String str) { s = str; } @Override public String toString() { return s; } } private final Map<String, DeviceHighlight> devices = new HashMap<>(); private final Map<String, HostHighlight> hosts = new HashMap<>(); private final Map<String, LinkHighlight> links = new HashMap<>(); private Amount subdueLevel = Amount.ZERO; private int delayMs = 0; //TODO: Think of a better solution for topology events race conditions /** * Sets the number of milliseconds to delay processing of highlights * events on the client side. * * @param ms milliseconds to delay * @return self, for chaining */ public Highlights delay(int ms) { Preconditions.checkArgument(ms >= 0, "Delay cannot be lower than 0"); delayMs = ms; return this; } /** * Return the delay for the highlight event. * * @return delay in milliseconds */ public int delayMs() { return delayMs; } /** * Adds highlighting information for a device. * * @param dh device highlight * @return self, for chaining */ public Highlights add(DeviceHighlight dh) { devices.put(dh.elementId(), dh); return this; } /** * Adds highlighting information for a host. * * @param hh host highlight * @return self, for chaining */ public Highlights add(HostHighlight hh) { hosts.put(hh.elementId(), hh); return this; } /** * Adds highlighting information for a link. * * @param lh link highlight * @return self, for chaining */ public Highlights add(LinkHighlight lh) { links.put(lh.elementId(), lh); return this; } /** * Marks the amount by which all other elements (devices, hosts, links) * not explicitly referenced here will be "subdued" visually. * * @param amount amount to subdue other elements * @return self, for chaining */ public Highlights subdueAllElse(Amount amount) { subdueLevel = checkNotNull(amount); return this; } /** * Returns the collection of device highlights. * * @return device highlights */ public Collection<DeviceHighlight> devices() { return Collections.unmodifiableCollection(devices.values()); } /** * Returns the collection of host highlights. * * @return host highlights */ public Collection<HostHighlight> hosts() { return Collections.unmodifiableCollection(hosts.values()); } /** * Returns the collection of link highlights. * * @return link highlights */ public Collection<LinkHighlight> links() { return Collections.unmodifiableCollection(links.values()); } /** * Returns the amount by which all other elements not explicitly * referenced here should be "subdued". * * @return amount to subdue other elements */ public Amount subdueLevel() { return subdueLevel; } /** * Returns the node highlight (device or host) for the given element * identifier, or null if no match. * * @param id element identifier * @return corresponding node highlight */ public NodeHighlight getNode(String id) { NodeHighlight nh = devices.get(id); return nh != null ? nh : hosts.get(id); } /** * Returns the device highlight for the given device identifier, * or null if no match. * * @param id device identifier * @return corresponding device highlight */ public DeviceHighlight getDevice(String id) { return devices.get(id); } /** * Returns the host highlight for the given host identifier, * or null if no match. * * @param id host identifier * @return corresponding host highlight */ public HostHighlight getHost(String id) { return hosts.get(id); } /** * Returns the link highlight for the given link identifier, * or null if no match. * * @param id link identifier * @return corresponding link highlight */ public LinkHighlight getLink(String id) { return links.get(id); } }