/* * 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); } }