Committed by
Gerrit Code Review
GUI Topo -- Cleaned up NodeBadge, now that we have a clearer idea of what we want to model.
Change-Id: I754a94cbd1fbe2a2c8affccaca88c48c3fa33b92
Showing
8 changed files
with
249 additions
and
114 deletions
| ... | @@ -23,18 +23,15 @@ public final class NodeBadge { | ... | @@ -23,18 +23,15 @@ public final class NodeBadge { |
| 23 | 23 | ||
| 24 | private static final String EMPTY = ""; | 24 | private static final String EMPTY = ""; |
| 25 | 25 | ||
| 26 | - /** Designates the type of badge. */ | 26 | + /** Designates the badge status. */ |
| 27 | - public enum Type { | 27 | + public enum Status { |
| 28 | INFO("i"), | 28 | INFO("i"), |
| 29 | WARN("w"), | 29 | WARN("w"), |
| 30 | - ERROR("e"), | 30 | + ERROR("e"); |
| 31 | - CHECK_MARK("/"), | ||
| 32 | - X_MARK("X"), | ||
| 33 | - NUMBER("n"); | ||
| 34 | 31 | ||
| 35 | private String code; | 32 | private String code; |
| 36 | 33 | ||
| 37 | - Type(String code) { | 34 | + Status(String code) { |
| 38 | this.code = code; | 35 | this.code = code; |
| 39 | } | 36 | } |
| 40 | 37 | ||
| ... | @@ -43,33 +40,60 @@ public final class NodeBadge { | ... | @@ -43,33 +40,60 @@ public final class NodeBadge { |
| 43 | return "{" + code + "}"; | 40 | return "{" + code + "}"; |
| 44 | } | 41 | } |
| 45 | 42 | ||
| 46 | - /** Returns the type's code in string form. */ | 43 | + /** Returns the status code in string form. */ |
| 47 | public String code() { | 44 | public String code() { |
| 48 | return code; | 45 | return code; |
| 49 | } | 46 | } |
| 50 | } | 47 | } |
| 51 | 48 | ||
| 52 | - private final Type type; | 49 | + private final Status status; |
| 50 | + private final boolean isGlyph; | ||
| 51 | + private final String text; | ||
| 53 | private final String message; | 52 | private final String message; |
| 54 | 53 | ||
| 55 | // only instantiated through static methods. | 54 | // only instantiated through static methods. |
| 56 | - private NodeBadge(Type type, String message) { | 55 | + private NodeBadge(Status status, boolean isGlyph, String text, String message) { |
| 57 | - this.type = type; | 56 | + this.status = status == null ? Status.INFO : status; |
| 57 | + this.isGlyph = isGlyph; | ||
| 58 | + this.text = text; | ||
| 58 | this.message = message; | 59 | this.message = message; |
| 59 | } | 60 | } |
| 60 | 61 | ||
| 61 | @Override | 62 | @Override |
| 62 | public String toString() { | 63 | public String toString() { |
| 63 | - return "{Badge " + type + " \"" + message + "\"}"; | 64 | + return "{Badge " + status + |
| 65 | + " (" + text + ")" + | ||
| 66 | + (isGlyph ? "*G " : " ") + | ||
| 67 | + "\"" + message + "\"}"; | ||
| 64 | } | 68 | } |
| 65 | 69 | ||
| 66 | /** | 70 | /** |
| 67 | - * Returns the badge type. | 71 | + * Returns the badge status. |
| 68 | * | 72 | * |
| 69 | - * @return badge type | 73 | + * @return badge status |
| 70 | */ | 74 | */ |
| 71 | - public Type type() { | 75 | + public Status status() { |
| 72 | - return type; | 76 | + return status; |
| 77 | + } | ||
| 78 | + | ||
| 79 | + /** | ||
| 80 | + * Returns true if the text for this badge designates a glyph ID. | ||
| 81 | + * | ||
| 82 | + * @return true if badge uses glyph | ||
| 83 | + */ | ||
| 84 | + public boolean isGlyph() { | ||
| 85 | + return isGlyph; | ||
| 86 | + } | ||
| 87 | + | ||
| 88 | + /** | ||
| 89 | + * Returns the text for the badge. | ||
| 90 | + * Note that if {@link #isGlyph} is true, the text is a glyph ID, otherwise | ||
| 91 | + * the text is displayed verbatim in the badge. | ||
| 92 | + * | ||
| 93 | + * @return text for badge | ||
| 94 | + */ | ||
| 95 | + public String text() { | ||
| 96 | + return text; | ||
| 73 | } | 97 | } |
| 74 | 98 | ||
| 75 | /** | 99 | /** |
| ... | @@ -86,64 +110,111 @@ public final class NodeBadge { | ... | @@ -86,64 +110,111 @@ public final class NodeBadge { |
| 86 | } | 110 | } |
| 87 | 111 | ||
| 88 | /** | 112 | /** |
| 89 | - * Returns an informational badge, with associated message. | 113 | + * Returns an arbitrary text badge, with default status. |
| 90 | * | 114 | * |
| 91 | - * @param message the message | 115 | + * @param txt the text |
| 92 | - * @return INFO type node badge | 116 | + * @return node badge to display text |
| 93 | */ | 117 | */ |
| 94 | - public static NodeBadge info(String message) { | 118 | + public static NodeBadge text(String txt) { |
| 95 | - return new NodeBadge(Type.INFO, nonNull(message)); | 119 | + // TODO: consider length constraint on txt (3 chars?) |
| 120 | + return new NodeBadge(Status.INFO, false, nonNull(txt), null); | ||
| 96 | } | 121 | } |
| 97 | 122 | ||
| 98 | /** | 123 | /** |
| 99 | - * Returns a warning badge, with associated message. | 124 | + * Returns a glyph badge, with default status. |
| 100 | * | 125 | * |
| 101 | - * @param message the message | 126 | + * @param gid the glyph ID |
| 102 | - * @return WARN type node badge | 127 | + * @return node badge to display glyph |
| 103 | */ | 128 | */ |
| 104 | - public static NodeBadge warn(String message) { | 129 | + public static NodeBadge glyph(String gid) { |
| 105 | - return new NodeBadge(Type.WARN, nonNull(message)); | 130 | + return new NodeBadge(Status.INFO, true, nonNull(gid), null); |
| 106 | } | 131 | } |
| 107 | 132 | ||
| 108 | /** | 133 | /** |
| 109 | - * Returns an error badge, with associated message. | 134 | + * Returns a numeric badge, with default status. |
| 110 | * | 135 | * |
| 111 | - * @param message the message | 136 | + * @param n the number |
| 112 | - * @return ERROR type node badge | 137 | + * @return node badge to display a number |
| 113 | */ | 138 | */ |
| 114 | - public static NodeBadge error(String message) { | 139 | + public static NodeBadge number(int n) { |
| 115 | - return new NodeBadge(Type.ERROR, nonNull(message)); | 140 | + // TODO: consider constraints, e.g. 1 <= n <= 999 |
| 141 | + return new NodeBadge(Status.INFO, false, Integer.toString(n), null); | ||
| 116 | } | 142 | } |
| 117 | 143 | ||
| 118 | /** | 144 | /** |
| 119 | - * Returns a check-mark badge, with associated message. | 145 | + * Returns an arbitrary text badge, with the given status. |
| 120 | * | 146 | * |
| 121 | - * @param message the message | 147 | + * @param s the status |
| 122 | - * @return CHECK_MARK type node badge | 148 | + * @param txt the text |
| 149 | + * @return node badge to display text | ||
| 123 | */ | 150 | */ |
| 124 | - public static NodeBadge checkMark(String message) { | 151 | + public static NodeBadge text(Status s, String txt) { |
| 125 | - return new NodeBadge(Type.CHECK_MARK, nonNull(message)); | 152 | + // TODO: consider length constraint on txt (3 chars?) |
| 153 | + return new NodeBadge(s, false, nonNull(txt), null); | ||
| 126 | } | 154 | } |
| 127 | 155 | ||
| 128 | /** | 156 | /** |
| 129 | - * Returns an X-mark badge, with associated message. | 157 | + * Returns a glyph badge, with the given status. |
| 130 | * | 158 | * |
| 131 | - * @param message the message | 159 | + * @param s the status |
| 132 | - * @return X_MARK type node badge | 160 | + * @param gid the glyph ID |
| 161 | + * @return node badge to display glyph | ||
| 133 | */ | 162 | */ |
| 134 | - public static NodeBadge xMark(String message) { | 163 | + public static NodeBadge glyph(Status s, String gid) { |
| 135 | - return new NodeBadge(Type.X_MARK, nonNull(message)); | 164 | + return new NodeBadge(s, true, nonNull(gid), null); |
| 136 | } | 165 | } |
| 137 | 166 | ||
| 167 | + | ||
| 138 | /** | 168 | /** |
| 139 | - * Returns a numeric badge. | 169 | + * Returns a numeric badge, with the given status and optional message. |
| 140 | * | 170 | * |
| 171 | + * @param s the status | ||
| 141 | * @param n the number | 172 | * @param n the number |
| 142 | - * @return NUMBER type node badge | 173 | + * @return node badge to display a number |
| 143 | */ | 174 | */ |
| 144 | - public static NodeBadge number(int n) { | 175 | + public static NodeBadge number(Status s, int n) { |
| 145 | - // TODO: consider constraints, e.g. 1 <= n <= 99 | 176 | + // TODO: consider constraints, e.g. 1 <= n <= 999 |
| 146 | - return new NodeBadge(Type.NUMBER, Integer.toString(n)); | 177 | + return new NodeBadge(s, false, Integer.toString(n), null); |
| 178 | + } | ||
| 179 | + | ||
| 180 | + /** | ||
| 181 | + * Returns an arbitrary text badge, with the given status and optional | ||
| 182 | + * message. | ||
| 183 | + * | ||
| 184 | + * @param s the status | ||
| 185 | + * @param txt the text | ||
| 186 | + * @param msg the optional message | ||
| 187 | + * @return node badge to display text | ||
| 188 | + */ | ||
| 189 | + public static NodeBadge text(Status s, String txt, String msg) { | ||
| 190 | + // TODO: consider length constraint on txt (3 chars?) | ||
| 191 | + return new NodeBadge(s, false, nonNull(txt), msg); | ||
| 192 | + } | ||
| 193 | + | ||
| 194 | + /** | ||
| 195 | + * Returns a glyph badge, with the given status and optional message. | ||
| 196 | + * | ||
| 197 | + * @param s the status | ||
| 198 | + * @param gid the glyph ID | ||
| 199 | + * @param msg the optional message | ||
| 200 | + * @return node badge to display glyph | ||
| 201 | + */ | ||
| 202 | + public static NodeBadge glyph(Status s, String gid, String msg) { | ||
| 203 | + return new NodeBadge(s, true, nonNull(gid), msg); | ||
| 204 | + } | ||
| 205 | + | ||
| 206 | + | ||
| 207 | + /** | ||
| 208 | + * Returns a numeric badge, with the given status and optional message. | ||
| 209 | + * | ||
| 210 | + * @param s the status | ||
| 211 | + * @param n the number | ||
| 212 | + * @param msg the optional message | ||
| 213 | + * @return node badge to display a number | ||
| 214 | + */ | ||
| 215 | + public static NodeBadge number(Status s, int n, String msg) { | ||
| 216 | + // TODO: consider constraints, e.g. 1 <= n <= 999 | ||
| 217 | + return new NodeBadge(s, false, Integer.toString(n), msg); | ||
| 147 | } | 218 | } |
| 148 | 219 | ||
| 149 | } | 220 | } | ... | ... |
| ... | @@ -38,6 +38,9 @@ public final class TopoJson { | ... | @@ -38,6 +38,9 @@ public final class TopoJson { |
| 38 | static final String LABEL = "label"; | 38 | static final String LABEL = "label"; |
| 39 | static final String CSS = "css"; | 39 | static final String CSS = "css"; |
| 40 | static final String BADGE = "badge"; | 40 | static final String BADGE = "badge"; |
| 41 | + static final String STATUS = "status"; | ||
| 42 | + static final String TXT = "txt"; | ||
| 43 | + static final String GID = "gid"; | ||
| 41 | static final String MSG = "msg"; | 44 | static final String MSG = "msg"; |
| 42 | 45 | ||
| 43 | static final String TITLE = "title"; | 46 | static final String TITLE = "title"; |
| ... | @@ -99,6 +102,16 @@ public final class TopoJson { | ... | @@ -99,6 +102,16 @@ public final class TopoJson { |
| 99 | return payload; | 102 | return payload; |
| 100 | } | 103 | } |
| 101 | 104 | ||
| 105 | + private static ObjectNode json(NodeBadge b) { | ||
| 106 | + ObjectNode n = objectNode() | ||
| 107 | + .put(STATUS, b.status().code()) | ||
| 108 | + .put(b.isGlyph() ? GID : TXT, b.text()); | ||
| 109 | + if (b.message() != null) { | ||
| 110 | + n.put(MSG, b.message()); | ||
| 111 | + } | ||
| 112 | + return n; | ||
| 113 | + } | ||
| 114 | + | ||
| 102 | private static ObjectNode json(DeviceHighlight dh) { | 115 | private static ObjectNode json(DeviceHighlight dh) { |
| 103 | ObjectNode n = objectNode() | 116 | ObjectNode n = objectNode() |
| 104 | .put(ID, dh.elementId()); | 117 | .put(ID, dh.elementId()); |
| ... | @@ -107,10 +120,7 @@ public final class TopoJson { | ... | @@ -107,10 +120,7 @@ public final class TopoJson { |
| 107 | } | 120 | } |
| 108 | NodeBadge badge = dh.badge(); | 121 | NodeBadge badge = dh.badge(); |
| 109 | if (badge != null) { | 122 | if (badge != null) { |
| 110 | - ObjectNode b = objectNode() | 123 | + n.set(BADGE, json(badge)); |
| 111 | - .put(TYPE, badge.type().code()) | ||
| 112 | - .put(MSG, badge.message()); | ||
| 113 | - n.set(BADGE, b); | ||
| 114 | } | 124 | } |
| 115 | return n; | 125 | return n; |
| 116 | } | 126 | } | ... | ... |
| ... | @@ -17,6 +17,7 @@ | ... | @@ -17,6 +17,7 @@ |
| 17 | package org.onosproject.ui.topo; | 17 | package org.onosproject.ui.topo; |
| 18 | 18 | ||
| 19 | import org.junit.Test; | 19 | import org.junit.Test; |
| 20 | +import org.onosproject.ui.topo.NodeBadge.Status; | ||
| 20 | 21 | ||
| 21 | import static org.junit.Assert.assertEquals; | 22 | import static org.junit.Assert.assertEquals; |
| 22 | 23 | ||
| ... | @@ -25,92 +26,87 @@ import static org.junit.Assert.assertEquals; | ... | @@ -25,92 +26,87 @@ import static org.junit.Assert.assertEquals; |
| 25 | */ | 26 | */ |
| 26 | public class NodeBadgeTest { | 27 | public class NodeBadgeTest { |
| 27 | 28 | ||
| 28 | - private static final String SOME_MSG = "a msg"; | 29 | + private static final String MSG = "a msg"; |
| 29 | - private static final String WR_T = "wrong type"; | 30 | + private static final String TXT = "text"; |
| 31 | + private static final String GID = "glyph-id"; | ||
| 32 | + private static final int NUM = 42; | ||
| 33 | + private static final String NUM_STR = Integer.toString(NUM); | ||
| 34 | + | ||
| 35 | + private static final String WR_S = "wrong status"; | ||
| 36 | + private static final String WR_B = "wrong boolean"; | ||
| 37 | + private static final String WR_T = "wrong text"; | ||
| 30 | private static final String WR_M = "wrong message"; | 38 | private static final String WR_M = "wrong message"; |
| 31 | private static final String WR_SF = "wrong string format"; | 39 | private static final String WR_SF = "wrong string format"; |
| 32 | 40 | ||
| 33 | private NodeBadge badge; | 41 | private NodeBadge badge; |
| 34 | 42 | ||
| 35 | - private String expStr(String t) { | 43 | + private void checkFields(NodeBadge b, Status s, boolean g, |
| 36 | - return "{Badge {" + t + "} \"" + SOME_MSG + "\"}"; | 44 | + String txt, String msg) { |
| 45 | + assertEquals(WR_S, s, b.status()); | ||
| 46 | + assertEquals(WR_B, g, b.isGlyph()); | ||
| 47 | + assertEquals(WR_T, txt, b.text()); | ||
| 48 | + assertEquals(WR_M, msg, b.message()); | ||
| 37 | } | 49 | } |
| 38 | 50 | ||
| 39 | - private String expNumStr(String n) { | 51 | + @Test |
| 40 | - return "{Badge {n} \"" + n + "\"}"; | 52 | + public void badgeTypes() { |
| 53 | + assertEquals(WR_SF, "i", Status.INFO.code()); | ||
| 54 | + assertEquals(WR_SF, "w", Status.WARN.code()); | ||
| 55 | + assertEquals(WR_SF, "e", Status.ERROR.code()); | ||
| 56 | + assertEquals("unexpected size", 3, Status.values().length); | ||
| 41 | } | 57 | } |
| 42 | 58 | ||
| 43 | @Test | 59 | @Test |
| 44 | - public void info() { | 60 | + public void textOnly() { |
| 45 | - badge = NodeBadge.info(SOME_MSG); | 61 | + badge = NodeBadge.text(TXT); |
| 46 | - assertEquals(WR_T, NodeBadge.Type.INFO, badge.type()); | 62 | + checkFields(badge, Status.INFO, false, TXT, null); |
| 47 | - assertEquals(WR_M, SOME_MSG, badge.message()); | ||
| 48 | - assertEquals(WR_SF, expStr("i"), badge.toString()); | ||
| 49 | } | 63 | } |
| 50 | 64 | ||
| 51 | @Test | 65 | @Test |
| 52 | - public void warn() { | 66 | + public void glyphOnly() { |
| 53 | - badge = NodeBadge.warn(SOME_MSG); | 67 | + badge = NodeBadge.glyph(GID); |
| 54 | - assertEquals(WR_T, NodeBadge.Type.WARN, badge.type()); | 68 | + checkFields(badge, Status.INFO, true, GID, null); |
| 55 | - assertEquals(WR_M, SOME_MSG, badge.message()); | ||
| 56 | - assertEquals(WR_SF, expStr("w"), badge.toString()); | ||
| 57 | } | 69 | } |
| 58 | 70 | ||
| 59 | @Test | 71 | @Test |
| 60 | - public void error() { | 72 | + public void numberOnly() { |
| 61 | - badge = NodeBadge.error(SOME_MSG); | 73 | + badge = NodeBadge.number(NUM); |
| 62 | - assertEquals(WR_T, NodeBadge.Type.ERROR, badge.type()); | 74 | + checkFields(badge, Status.INFO, false, NUM_STR, null); |
| 63 | - assertEquals(WR_M, SOME_MSG, badge.message()); | ||
| 64 | - assertEquals(WR_SF, expStr("e"), badge.toString()); | ||
| 65 | } | 75 | } |
| 66 | 76 | ||
| 67 | @Test | 77 | @Test |
| 68 | - public void checkMark() { | 78 | + public void textInfo() { |
| 69 | - badge = NodeBadge.checkMark(SOME_MSG); | 79 | + badge = NodeBadge.text(Status.INFO, TXT); |
| 70 | - assertEquals(WR_T, NodeBadge.Type.CHECK_MARK, badge.type()); | 80 | + checkFields(badge, Status.INFO, false, TXT, null); |
| 71 | - assertEquals(WR_M, SOME_MSG, badge.message()); | ||
| 72 | - assertEquals(WR_SF, expStr("/"), badge.toString()); | ||
| 73 | } | 81 | } |
| 74 | 82 | ||
| 75 | @Test | 83 | @Test |
| 76 | - public void xMark() { | 84 | + public void glyphWarn() { |
| 77 | - badge = NodeBadge.xMark(SOME_MSG); | 85 | + badge = NodeBadge.glyph(Status.WARN, GID); |
| 78 | - assertEquals(WR_T, NodeBadge.Type.X_MARK, badge.type()); | 86 | + checkFields(badge, Status.WARN, true, GID, null); |
| 79 | - assertEquals(WR_M, SOME_MSG, badge.message()); | ||
| 80 | - assertEquals(WR_SF, expStr("X"), badge.toString()); | ||
| 81 | } | 87 | } |
| 82 | 88 | ||
| 83 | @Test | 89 | @Test |
| 84 | - public void number0() { | 90 | + public void numberError() { |
| 85 | - badge = NodeBadge.number(0); | 91 | + badge = NodeBadge.number(Status.ERROR, NUM); |
| 86 | - assertEquals(WR_T, NodeBadge.Type.NUMBER, badge.type()); | 92 | + checkFields(badge, Status.ERROR, false, NUM_STR, null); |
| 87 | - assertEquals(WR_M, "0", badge.message()); | ||
| 88 | - assertEquals(WR_SF, expNumStr("0"), badge.toString()); | ||
| 89 | } | 93 | } |
| 90 | 94 | ||
| 91 | @Test | 95 | @Test |
| 92 | - public void number5() { | 96 | + public void textInfoMsg() { |
| 93 | - badge = NodeBadge.number(5); | 97 | + badge = NodeBadge.text(Status.INFO, TXT, MSG); |
| 94 | - assertEquals(WR_T, NodeBadge.Type.NUMBER, badge.type()); | 98 | + checkFields(badge, Status.INFO, false, TXT, MSG); |
| 95 | - assertEquals(WR_M, "5", badge.message()); | ||
| 96 | - assertEquals(WR_SF, expNumStr("5"), badge.toString()); | ||
| 97 | } | 99 | } |
| 98 | 100 | ||
| 99 | @Test | 101 | @Test |
| 100 | - public void number99() { | 102 | + public void glyphWarnMsg() { |
| 101 | - badge = NodeBadge.number(99); | 103 | + badge = NodeBadge.glyph(Status.WARN, GID, MSG); |
| 102 | - assertEquals(WR_T, NodeBadge.Type.NUMBER, badge.type()); | 104 | + checkFields(badge, Status.WARN, true, GID, MSG); |
| 103 | - assertEquals(WR_M, "99", badge.message()); | ||
| 104 | - assertEquals(WR_SF, expNumStr("99"), badge.toString()); | ||
| 105 | } | 105 | } |
| 106 | 106 | ||
| 107 | @Test | 107 | @Test |
| 108 | - public void badgeTypes() { | 108 | + public void numberErrorMsg() { |
| 109 | - assertEquals(WR_SF, "i", NodeBadge.Type.INFO.code()); | 109 | + badge = NodeBadge.number(Status.ERROR, NUM, MSG); |
| 110 | - assertEquals(WR_SF, "w", NodeBadge.Type.WARN.code()); | 110 | + checkFields(badge, Status.ERROR, false, NUM_STR, MSG); |
| 111 | - assertEquals(WR_SF, "e", NodeBadge.Type.ERROR.code()); | ||
| 112 | - assertEquals(WR_SF, "/", NodeBadge.Type.CHECK_MARK.code()); | ||
| 113 | - assertEquals(WR_SF, "X", NodeBadge.Type.X_MARK.code()); | ||
| 114 | - assertEquals(WR_SF, "n", NodeBadge.Type.NUMBER.code()); | ||
| 115 | } | 111 | } |
| 116 | } | 112 | } | ... | ... |
| ... | @@ -21,9 +21,11 @@ import com.fasterxml.jackson.databind.node.ObjectNode; | ... | @@ -21,9 +21,11 @@ import com.fasterxml.jackson.databind.node.ObjectNode; |
| 21 | import org.junit.Test; | 21 | import org.junit.Test; |
| 22 | import org.onosproject.ui.JsonUtils; | 22 | import org.onosproject.ui.JsonUtils; |
| 23 | import org.onosproject.ui.topo.Highlights.Amount; | 23 | import org.onosproject.ui.topo.Highlights.Amount; |
| 24 | +import org.onosproject.ui.topo.NodeBadge.Status; | ||
| 24 | 25 | ||
| 25 | import static org.junit.Assert.assertEquals; | 26 | import static org.junit.Assert.assertEquals; |
| 26 | import static org.junit.Assert.assertNotNull; | 27 | import static org.junit.Assert.assertNotNull; |
| 28 | +import static org.junit.Assert.assertNull; | ||
| 27 | 29 | ||
| 28 | /** | 30 | /** |
| 29 | * Unit tests for {@link TopoJson}. | 31 | * Unit tests for {@link TopoJson}. |
| ... | @@ -32,7 +34,8 @@ public class TopoJsonTest { | ... | @@ -32,7 +34,8 @@ public class TopoJsonTest { |
| 32 | 34 | ||
| 33 | private static final String DEV1 = "device-1"; | 35 | private static final String DEV1 = "device-1"; |
| 34 | private static final String DEV2 = "device-2"; | 36 | private static final String DEV2 = "device-2"; |
| 35 | - private static final String BADGE_MSG = "Hello there"; | 37 | + private static final String SOME_MSG = "Hello there"; |
| 38 | + private static final String GID = "glyph-ID"; | ||
| 36 | 39 | ||
| 37 | private ObjectNode payload; | 40 | private ObjectNode payload; |
| 38 | 41 | ||
| ... | @@ -78,15 +81,15 @@ public class TopoJsonTest { | ... | @@ -78,15 +81,15 @@ public class TopoJsonTest { |
| 78 | public void badgedDevice() { | 81 | public void badgedDevice() { |
| 79 | Highlights h = new Highlights(); | 82 | Highlights h = new Highlights(); |
| 80 | DeviceHighlight dh = new DeviceHighlight(DEV1); | 83 | DeviceHighlight dh = new DeviceHighlight(DEV1); |
| 81 | - dh.setBadge(NodeBadge.info(BADGE_MSG)); | 84 | + dh.setBadge(NodeBadge.number(7)); |
| 82 | h.add(dh); | 85 | h.add(dh); |
| 83 | 86 | ||
| 84 | dh = new DeviceHighlight(DEV2); | 87 | dh = new DeviceHighlight(DEV2); |
| 85 | - dh.setBadge(NodeBadge.number(7)); | 88 | + dh.setBadge(NodeBadge.glyph(Status.WARN, GID, SOME_MSG)); |
| 86 | h.add(dh); | 89 | h.add(dh); |
| 87 | 90 | ||
| 88 | payload = TopoJson.json(h); | 91 | payload = TopoJson.json(h); |
| 89 | - System.out.println(payload); | 92 | +// System.out.println(payload); |
| 90 | 93 | ||
| 91 | // dig into the payload, and verify the badges are set on the devices | 94 | // dig into the payload, and verify the badges are set on the devices |
| 92 | ArrayNode a = (ArrayNode) payload.get(TopoJson.DEVICES); | 95 | ArrayNode a = (ArrayNode) payload.get(TopoJson.DEVICES); |
| ... | @@ -96,15 +99,19 @@ public class TopoJsonTest { | ... | @@ -96,15 +99,19 @@ public class TopoJsonTest { |
| 96 | 99 | ||
| 97 | ObjectNode b = (ObjectNode) d.get(TopoJson.BADGE); | 100 | ObjectNode b = (ObjectNode) d.get(TopoJson.BADGE); |
| 98 | assertNotNull("missing badge", b); | 101 | assertNotNull("missing badge", b); |
| 99 | - assertEquals("wrong type code", "i", b.get(TopoJson.TYPE).asText()); | 102 | + assertEquals("wrong status code", "i", b.get(TopoJson.STATUS).asText()); |
| 100 | - assertEquals("wrong message", BADGE_MSG, b.get(TopoJson.MSG).asText()); | 103 | + assertEquals("wrong text", "7", b.get(TopoJson.TXT).asText()); |
| 104 | + assertNull("glyph?", b.get(TopoJson.GID)); | ||
| 105 | + assertNull("msg?", b.get(TopoJson.MSG)); | ||
| 101 | 106 | ||
| 102 | d = (ObjectNode) a.get(1); | 107 | d = (ObjectNode) a.get(1); |
| 103 | assertEquals("wrong device id", DEV2, d.get(TopoJson.ID).asText()); | 108 | assertEquals("wrong device id", DEV2, d.get(TopoJson.ID).asText()); |
| 104 | 109 | ||
| 105 | b = (ObjectNode) d.get(TopoJson.BADGE); | 110 | b = (ObjectNode) d.get(TopoJson.BADGE); |
| 106 | assertNotNull("missing badge", b); | 111 | assertNotNull("missing badge", b); |
| 107 | - assertEquals("wrong type code", "n", b.get(TopoJson.TYPE).asText()); | 112 | + assertEquals("wrong status code", "w", b.get(TopoJson.STATUS).asText()); |
| 108 | - assertEquals("wrong message", "7", b.get(TopoJson.MSG).asText()); | 113 | + assertNull("text?", b.get(TopoJson.TXT)); |
| 114 | + assertEquals("wrong text", GID, b.get(TopoJson.GID).asText()); | ||
| 115 | + assertEquals("wrong message", SOME_MSG, b.get(TopoJson.MSG).asText()); | ||
| 109 | } | 116 | } |
| 110 | } | 117 | } | ... | ... |
| ... | @@ -218,6 +218,24 @@ | ... | @@ -218,6 +218,24 @@ |
| 218 | .attr('transform', sus.translate(dx, dy)); | 218 | .attr('transform', sus.translate(dx, dy)); |
| 219 | } | 219 | } |
| 220 | 220 | ||
| 221 | + function updateDeviceBadge(d) { | ||
| 222 | + // TODO: Fix this WIP | ||
| 223 | + var node = d.el, | ||
| 224 | + bsel; | ||
| 225 | + | ||
| 226 | + if (d.badge) { | ||
| 227 | + bsel = node.append('g') | ||
| 228 | + .classed('badge', true) | ||
| 229 | + .attr('transform', sus.translate(-14, -14)); | ||
| 230 | + | ||
| 231 | + bsel.append('circle') | ||
| 232 | + .attr('r', 14); | ||
| 233 | + bsel.append('text') | ||
| 234 | + .attr('transform', sus.translate(-5, 3)) | ||
| 235 | + .text('42'); | ||
| 236 | + } | ||
| 237 | + } | ||
| 238 | + | ||
| 221 | function updateHostLabel(d) { | 239 | function updateHostLabel(d) { |
| 222 | var label = trimLabel(hostLabel(d)); | 240 | var label = trimLabel(hostLabel(d)); |
| 223 | d.el.select('text').text(label); | 241 | d.el.select('text').text(label); |
| ... | @@ -241,6 +259,7 @@ | ... | @@ -241,6 +259,7 @@ |
| 241 | var node = d.el; | 259 | var node = d.el; |
| 242 | node.classed('online', d.online); | 260 | node.classed('online', d.online); |
| 243 | updateDeviceLabel(d); | 261 | updateDeviceLabel(d); |
| 262 | + updateDeviceBadge(d); | ||
| 244 | api.posNode(d, true); | 263 | api.posNode(d, true); |
| 245 | } | 264 | } |
| 246 | 265 | ... | ... |
| ... | @@ -860,6 +860,16 @@ | ... | @@ -860,6 +860,16 @@ |
| 860 | }); | 860 | }); |
| 861 | } | 861 | } |
| 862 | 862 | ||
| 863 | + function clearNodeDeco() { | ||
| 864 | + node.selectAll('g.badge').remove(); | ||
| 865 | + } | ||
| 866 | + | ||
| 867 | + function removeNodeBadges() { | ||
| 868 | + network.nodes.forEach(function (d) { | ||
| 869 | + d.badge = null; | ||
| 870 | + }); | ||
| 871 | + } | ||
| 872 | + | ||
| 863 | function updateLinkLabelModel() { | 873 | function updateLinkLabelModel() { |
| 864 | // create the backing data for showing labels.. | 874 | // create the backing data for showing labels.. |
| 865 | var data = []; | 875 | var data = []; |
| ... | @@ -923,6 +933,8 @@ | ... | @@ -923,6 +933,8 @@ |
| 923 | 933 | ||
| 924 | function mkOverlayApi() { | 934 | function mkOverlayApi() { |
| 925 | return { | 935 | return { |
| 936 | + clearNodeDeco: clearNodeDeco, | ||
| 937 | + removeNodeBadges: removeNodeBadges, | ||
| 926 | clearLinkTrafficStyle: clearLinkTrafficStyle, | 938 | clearLinkTrafficStyle: clearLinkTrafficStyle, |
| 927 | removeLinkLabels: removeLinkLabels, | 939 | removeLinkLabels: removeLinkLabels, |
| 928 | findLinkById: tms.findLinkById, | 940 | findLinkById: tms.findLinkById, | ... | ... |
| ... | @@ -294,7 +294,8 @@ | ... | @@ -294,7 +294,8 @@ |
| 294 | unsupLink( key, [less] ) | 294 | unsupLink( key, [less] ) |
| 295 | */ | 295 | */ |
| 296 | 296 | ||
| 297 | - // TODO: clear node highlighting | 297 | + api.clearNodeDeco(); |
| 298 | + api.removeNodeBadges(); | ||
| 298 | api.clearLinkTrafficStyle(); | 299 | api.clearLinkTrafficStyle(); |
| 299 | api.removeLinkLabels(); | 300 | api.removeLinkLabels(); |
| 300 | 301 | ||
| ... | @@ -319,8 +320,11 @@ | ... | @@ -319,8 +320,11 @@ |
| 319 | }); | 320 | }); |
| 320 | 321 | ||
| 321 | data.devices.forEach(function (device) { | 322 | data.devices.forEach(function (device) { |
| 322 | - var ddata = api.findNodeById(device.id); | 323 | + var ddata = api.findNodeById(device.id), |
| 324 | + badgeData = device.badge || null; | ||
| 325 | + | ||
| 323 | if (ddata && !ddata.el.empty()) { | 326 | if (ddata && !ddata.el.empty()) { |
| 327 | + ddata.badge = badgeData; | ||
| 324 | if (!device.subdue) { | 328 | if (!device.subdue) { |
| 325 | api.unsupNode(ddata.id, less); | 329 | api.unsupNode(ddata.id, less); |
| 326 | } | 330 | } | ... | ... |
| 1 | { | 1 | { |
| 2 | "event": "showHighlights", | 2 | "event": "showHighlights", |
| 3 | "payload": { | 3 | "payload": { |
| 4 | - "devices": [], | 4 | + "devices": [ |
| 5 | + { | ||
| 6 | + "id": "of:0000000000000001", | ||
| 7 | + "badge": { | ||
| 8 | + "status": "e", | ||
| 9 | + "gid": "xMark", | ||
| 10 | + "msg": "x marks the spot" | ||
| 11 | + } | ||
| 12 | + }, | ||
| 13 | + { | ||
| 14 | + "id": "of:0000000000000002", | ||
| 15 | + "badge": { | ||
| 16 | + "status": "w", | ||
| 17 | + "txt": "7" | ||
| 18 | + } | ||
| 19 | + } | ||
| 20 | + ], | ||
| 5 | "hosts": [], | 21 | "hosts": [], |
| 6 | "links": [ | 22 | "links": [ |
| 7 | { | 23 | { | ... | ... |
-
Please register or login to post a comment