diff options
Diffstat (limited to 'framework/src/onos/core/api/src/main/java/org/onosproject/ui/topo/TopoUtils.java')
-rw-r--r-- | framework/src/onos/core/api/src/main/java/org/onosproject/ui/topo/TopoUtils.java | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/framework/src/onos/core/api/src/main/java/org/onosproject/ui/topo/TopoUtils.java b/framework/src/onos/core/api/src/main/java/org/onosproject/ui/topo/TopoUtils.java new file mode 100644 index 00000000..f92d5798 --- /dev/null +++ b/framework/src/onos/core/api/src/main/java/org/onosproject/ui/topo/TopoUtils.java @@ -0,0 +1,159 @@ +/* + * Copyright 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 org.onosproject.ui.topo; + +import org.onosproject.net.Link; +import org.onosproject.net.LinkKey; + +import java.text.DecimalFormat; + +import static org.onosproject.net.LinkKey.linkKey; + +/** + * Utility methods for helping out with formatting data for the Topology View + * in the web client. + */ +public final class TopoUtils { + + // explicit decision made to not 'javadoc' these self explanatory constants + public static final double KILO = 1024; + public static final double MEGA = 1024 * KILO; + public static final double GIGA = 1024 * MEGA; + + public static final String GBITS_UNIT = "Gb"; + public static final String MBITS_UNIT = "Mb"; + public static final String KBITS_UNIT = "Kb"; + public static final String BITS_UNIT = "b"; + public static final String GBYTES_UNIT = "GB"; + public static final String MBYTES_UNIT = "MB"; + public static final String KBYTES_UNIT = "KB"; + public static final String BYTES_UNIT = "B"; + + + private static final DecimalFormat DF2 = new DecimalFormat("#,###.##"); + + private static final String COMPACT = "%s/%s-%s/%s"; + private static final String EMPTY = ""; + private static final String SPACE = " "; + private static final String PER_SEC = "ps"; + private static final String FLOW = "flow"; + private static final String FLOWS = "flows"; + + // non-instantiable + private TopoUtils() { } + + /** + * Returns a compact identity for the given link, in the form + * used to identify links in the Topology View on the client. + * + * @param link link + * @return compact link identity + */ + public static String compactLinkString(Link link) { + return String.format(COMPACT, link.src().elementId(), link.src().port(), + link.dst().elementId(), link.dst().port()); + } + + /** + * Produces a canonical link key, that is, one that will match both a link + * and its inverse. + * + * @param link the link + * @return canonical key + */ + public static LinkKey canonicalLinkKey(Link link) { + String sn = link.src().elementId().toString(); + String dn = link.dst().elementId().toString(); + return sn.compareTo(dn) < 0 ? + linkKey(link.src(), link.dst()) : linkKey(link.dst(), link.src()); + } + + /** + * Returns human readable count of bytes, to be displayed as a label. + * + * @param bytes number of bytes + * @return formatted byte count + */ + public static String formatBytes(long bytes) { + String unit; + double value; + if (bytes > GIGA) { + value = bytes / GIGA; + unit = GBYTES_UNIT; + } else if (bytes > MEGA) { + value = bytes / MEGA; + unit = MBYTES_UNIT; + } else if (bytes > KILO) { + value = bytes / KILO; + unit = KBYTES_UNIT; + } else { + value = bytes; + unit = BYTES_UNIT; + } + return DF2.format(value) + SPACE + unit; + } + + /** + * Returns human readable bit rate, to be displayed as a label. + * + * @param bytes bytes per second + * @return formatted bits per second + */ + public static String formatBitRate(long bytes) { + String unit; + double value; + + //Convert to bits + long bits = bytes * 8; + if (bits > GIGA) { + value = bits / GIGA; + unit = GBITS_UNIT; + + // NOTE: temporary hack to clip rate at 10.0 Gbps + // Added for the CORD Fabric demo at ONS 2015 + // TODO: provide a more elegant solution to this issue + if (value > 10.0) { + value = 10.0; + } + + } else if (bits > MEGA) { + value = bits / MEGA; + unit = MBITS_UNIT; + } else if (bits > KILO) { + value = bits / KILO; + unit = KBITS_UNIT; + } else { + value = bits; + unit = BITS_UNIT; + } + return DF2.format(value) + SPACE + unit + PER_SEC; + } + + /** + * Returns human readable flow count, to be displayed as a label. + * + * @param flows number of flows + * @return formatted flow count + */ + public static String formatFlows(long flows) { + if (flows < 1) { + return EMPTY; + } + return String.valueOf(flows) + SPACE + (flows > 1 ? FLOWS : FLOW); + } +} |