Committed by
Gerrit Code Review
[WIP][ONOS-3722] Augment TableModel with Annotations Mechanism
Change-Id: I815ce0b0fde254dd730153c34905d9454f019d9a
Showing
21 changed files
with
308 additions
and
8 deletions
| ... | @@ -57,6 +57,8 @@ public class DhcpViewMessageHandler extends UiMessageHandler { | ... | @@ -57,6 +57,8 @@ public class DhcpViewMessageHandler extends UiMessageHandler { |
| 57 | // handler for dhcp table requests | 57 | // handler for dhcp table requests |
| 58 | private final class DataRequestHandler extends TableRequestHandler { | 58 | private final class DataRequestHandler extends TableRequestHandler { |
| 59 | 59 | ||
| 60 | + private static final String NO_ROWS_MESSAGE = "No mappings found"; | ||
| 61 | + | ||
| 60 | private DataRequestHandler() { | 62 | private DataRequestHandler() { |
| 61 | super(DHCP_DATA_REQ, DHCP_DATA_RESP, DHCP); | 63 | super(DHCP_DATA_REQ, DHCP_DATA_RESP, DHCP); |
| 62 | } | 64 | } |
| ... | @@ -72,6 +74,11 @@ public class DhcpViewMessageHandler extends UiMessageHandler { | ... | @@ -72,6 +74,11 @@ public class DhcpViewMessageHandler extends UiMessageHandler { |
| 72 | } | 74 | } |
| 73 | 75 | ||
| 74 | @Override | 76 | @Override |
| 77 | + protected String noRowsMessage() { | ||
| 78 | + return NO_ROWS_MESSAGE; | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + @Override | ||
| 75 | protected void populateTable(TableModel tm, ObjectNode payload) { | 82 | protected void populateTable(TableModel tm, ObjectNode payload) { |
| 76 | DhcpService dhcpService = AbstractShellCommand.get(DhcpService.class); | 83 | DhcpService dhcpService = AbstractShellCommand.get(DhcpService.class); |
| 77 | Map<HostId, IpAssignment> allocationMap = dhcpService.listMapping(); | 84 | Map<HostId, IpAssignment> allocationMap = dhcpService.listMapping(); | ... | ... |
| ... | @@ -63,6 +63,8 @@ public class DriverMatrixMessageHandler extends UiMessageHandler { | ... | @@ -63,6 +63,8 @@ public class DriverMatrixMessageHandler extends UiMessageHandler { |
| 63 | // handler for sample table requests | 63 | // handler for sample table requests |
| 64 | private final class SampleTableDataRequestHandler extends TableRequestHandler { | 64 | private final class SampleTableDataRequestHandler extends TableRequestHandler { |
| 65 | 65 | ||
| 66 | + private static final String NO_ROWS_MESSAGE = "No data found"; | ||
| 67 | + | ||
| 66 | private SampleTableDataRequestHandler() { | 68 | private SampleTableDataRequestHandler() { |
| 67 | super(SAMPLE_TABLE_DATA_REQ, SAMPLE_TABLE_DATA_RESP, SAMPLE_TABLES); | 69 | super(SAMPLE_TABLE_DATA_REQ, SAMPLE_TABLE_DATA_RESP, SAMPLE_TABLES); |
| 68 | } | 70 | } |
| ... | @@ -74,6 +76,11 @@ public class DriverMatrixMessageHandler extends UiMessageHandler { | ... | @@ -74,6 +76,11 @@ public class DriverMatrixMessageHandler extends UiMessageHandler { |
| 74 | return COLUMN_IDS; | 76 | return COLUMN_IDS; |
| 75 | } | 77 | } |
| 76 | 78 | ||
| 79 | + @Override | ||
| 80 | + protected String noRowsMessage() { | ||
| 81 | + return NO_ROWS_MESSAGE; | ||
| 82 | + } | ||
| 83 | + | ||
| 77 | // if required, override createTableModel() to set column formatters / comparators | 84 | // if required, override createTableModel() to set column formatters / comparators |
| 78 | 85 | ||
| 79 | @Override | 86 | @Override | ... | ... |
| ... | @@ -74,6 +74,8 @@ public class AlarmTableMessageHandler extends UiMessageHandler { | ... | @@ -74,6 +74,8 @@ public class AlarmTableMessageHandler extends UiMessageHandler { |
| 74 | // handler for alarm table requests | 74 | // handler for alarm table requests |
| 75 | private final class AlarmTableDataRequestHandler extends TableRequestHandler { | 75 | private final class AlarmTableDataRequestHandler extends TableRequestHandler { |
| 76 | 76 | ||
| 77 | + private static final String NO_ROWS_MESSAGE = "No alarms found"; | ||
| 78 | + | ||
| 77 | private AlarmTableDataRequestHandler() { | 79 | private AlarmTableDataRequestHandler() { |
| 78 | super(ALARM_TABLE_DATA_REQ, ALARM_TABLE_DATA_RESP, ALARM_TABLES); | 80 | super(ALARM_TABLE_DATA_REQ, ALARM_TABLE_DATA_RESP, ALARM_TABLES); |
| 79 | } | 81 | } |
| ... | @@ -90,6 +92,11 @@ public class AlarmTableMessageHandler extends UiMessageHandler { | ... | @@ -90,6 +92,11 @@ public class AlarmTableMessageHandler extends UiMessageHandler { |
| 90 | } | 92 | } |
| 91 | 93 | ||
| 92 | @Override | 94 | @Override |
| 95 | + protected String noRowsMessage() { | ||
| 96 | + return NO_ROWS_MESSAGE; | ||
| 97 | + } | ||
| 98 | + | ||
| 99 | + @Override | ||
| 93 | protected TableModel createTableModel() { | 100 | protected TableModel createTableModel() { |
| 94 | // if required, override createTableModel() to set column formatters / comparators | 101 | // if required, override createTableModel() to set column formatters / comparators |
| 95 | TableModel tm = super.createTableModel(); | 102 | TableModel tm = super.createTableModel(); | ... | ... |
| ... | @@ -22,6 +22,7 @@ import org.onosproject.ui.table.cell.DefaultCellFormatter; | ... | @@ -22,6 +22,7 @@ import org.onosproject.ui.table.cell.DefaultCellFormatter; |
| 22 | 22 | ||
| 23 | import java.util.ArrayList; | 23 | import java.util.ArrayList; |
| 24 | import java.util.Arrays; | 24 | import java.util.Arrays; |
| 25 | +import java.util.Collection; | ||
| 25 | import java.util.Collections; | 26 | import java.util.Collections; |
| 26 | import java.util.Comparator; | 27 | import java.util.Comparator; |
| 27 | import java.util.HashMap; | 28 | import java.util.HashMap; |
| ... | @@ -57,7 +58,7 @@ public class TableModel { | ... | @@ -57,7 +58,7 @@ public class TableModel { |
| 57 | private final Map<String, CellComparator> comparators = new HashMap<>(); | 58 | private final Map<String, CellComparator> comparators = new HashMap<>(); |
| 58 | private final Map<String, CellFormatter> formatters = new HashMap<>(); | 59 | private final Map<String, CellFormatter> formatters = new HashMap<>(); |
| 59 | private final List<Row> rows = new ArrayList<>(); | 60 | private final List<Row> rows = new ArrayList<>(); |
| 60 | - | 61 | + private final Map<String, Annot> annotations = new HashMap<>(); |
| 61 | 62 | ||
| 62 | /** | 63 | /** |
| 63 | * Constructs a table (devoid of data) with the given column IDs. | 64 | * Constructs a table (devoid of data) with the given column IDs. |
| ... | @@ -124,6 +125,28 @@ public class TableModel { | ... | @@ -124,6 +125,28 @@ public class TableModel { |
| 124 | } | 125 | } |
| 125 | 126 | ||
| 126 | /** | 127 | /** |
| 128 | + * Inserts a new annotation. | ||
| 129 | + * | ||
| 130 | + * @param key key of annotation | ||
| 131 | + * @param value value of annotation | ||
| 132 | + */ | ||
| 133 | + public void addAnnotation(String key, Object value) { | ||
| 134 | + Annot annot = new Annot(key, value); | ||
| 135 | + annotations.put(key, annot); | ||
| 136 | + } | ||
| 137 | + | ||
| 138 | + /** | ||
| 139 | + * Returns the annotations in this table. | ||
| 140 | + * | ||
| 141 | + * @return annotations | ||
| 142 | + */ | ||
| 143 | + public Collection<Annot> getAnnotations() { | ||
| 144 | + Collection<Annot> annots = new ArrayList<>(annotations.size()); | ||
| 145 | + annotations.forEach((k, v) -> annots.add(v)); | ||
| 146 | + return annots; | ||
| 147 | + } | ||
| 148 | + | ||
| 149 | + /** | ||
| 127 | * Sets a cell comparator for the specified column. | 150 | * Sets a cell comparator for the specified column. |
| 128 | * | 151 | * |
| 129 | * @param columnId column identifier | 152 | * @param columnId column identifier |
| ... | @@ -233,6 +256,53 @@ public class TableModel { | ... | @@ -233,6 +256,53 @@ public class TableModel { |
| 233 | } | 256 | } |
| 234 | 257 | ||
| 235 | /** | 258 | /** |
| 259 | + * Model of an annotation. | ||
| 260 | + */ | ||
| 261 | + public class Annot { | ||
| 262 | + private final String key; | ||
| 263 | + private final Object value; | ||
| 264 | + | ||
| 265 | + /** | ||
| 266 | + * Constructs an annotation with the given key and value. | ||
| 267 | + * | ||
| 268 | + * @param key the key | ||
| 269 | + * @param value the value | ||
| 270 | + */ | ||
| 271 | + public Annot(String key, Object value) { | ||
| 272 | + this.key = key; | ||
| 273 | + this.value = value; | ||
| 274 | + } | ||
| 275 | + | ||
| 276 | + /** | ||
| 277 | + * Returns the annotation's key. | ||
| 278 | + * | ||
| 279 | + * @return key | ||
| 280 | + */ | ||
| 281 | + public String key() { | ||
| 282 | + return key; | ||
| 283 | + } | ||
| 284 | + | ||
| 285 | + /** | ||
| 286 | + * Returns the annotation's value. | ||
| 287 | + * | ||
| 288 | + * @return value | ||
| 289 | + */ | ||
| 290 | + public Object value() { | ||
| 291 | + return value; | ||
| 292 | + } | ||
| 293 | + | ||
| 294 | + /** | ||
| 295 | + * Returns the value as a string. | ||
| 296 | + * This default implementation uses the value's toString() method. | ||
| 297 | + * | ||
| 298 | + * @return the value as a string | ||
| 299 | + */ | ||
| 300 | + public String valueAsString() { | ||
| 301 | + return value.toString(); | ||
| 302 | + } | ||
| 303 | + } | ||
| 304 | + | ||
| 305 | + /** | ||
| 236 | * Model of a row. | 306 | * Model of a row. |
| 237 | */ | 307 | */ |
| 238 | public class Row { | 308 | public class Row { | ... | ... |
| ... | @@ -25,6 +25,8 @@ import org.onosproject.ui.RequestHandler; | ... | @@ -25,6 +25,8 @@ import org.onosproject.ui.RequestHandler; |
| 25 | */ | 25 | */ |
| 26 | public abstract class TableRequestHandler extends RequestHandler { | 26 | public abstract class TableRequestHandler extends RequestHandler { |
| 27 | 27 | ||
| 28 | + private static final String ANNOTS = "annots"; | ||
| 29 | + private static final String NO_ROWS_MSG_KEY = "no_rows_msg"; | ||
| 28 | private final String respType; | 30 | private final String respType; |
| 29 | private final String nodeName; | 31 | private final String nodeName; |
| 30 | 32 | ||
| ... | @@ -53,8 +55,11 @@ public abstract class TableRequestHandler extends RequestHandler { | ... | @@ -53,8 +55,11 @@ public abstract class TableRequestHandler extends RequestHandler { |
| 53 | String sortDir = JsonUtils.string(payload, "sortDir", "asc"); | 55 | String sortDir = JsonUtils.string(payload, "sortDir", "asc"); |
| 54 | tm.sort(sortCol, TableModel.sortDir(sortDir)); | 56 | tm.sort(sortCol, TableModel.sortDir(sortDir)); |
| 55 | 57 | ||
| 58 | + addTableConfigAnnotations(tm); | ||
| 59 | + | ||
| 56 | ObjectNode rootNode = MAPPER.createObjectNode(); | 60 | ObjectNode rootNode = MAPPER.createObjectNode(); |
| 57 | - rootNode.set(nodeName, TableUtils.generateArrayNode(tm)); | 61 | + rootNode.set(nodeName, TableUtils.generateRowArrayNode(tm)); |
| 62 | + rootNode.set(ANNOTS, TableUtils.generateAnnotObjectNode(tm)); | ||
| 58 | sendMessage(respType, 0, rootNode); | 63 | sendMessage(respType, 0, rootNode); |
| 59 | } | 64 | } |
| 60 | 65 | ||
| ... | @@ -72,6 +77,15 @@ public abstract class TableRequestHandler extends RequestHandler { | ... | @@ -72,6 +77,15 @@ public abstract class TableRequestHandler extends RequestHandler { |
| 72 | } | 77 | } |
| 73 | 78 | ||
| 74 | /** | 79 | /** |
| 80 | + * Adds all annotations to table model. | ||
| 81 | + * | ||
| 82 | + * @param tm a table model | ||
| 83 | + */ | ||
| 84 | + protected void addTableConfigAnnotations(TableModel tm) { | ||
| 85 | + tm.addAnnotation(NO_ROWS_MSG_KEY, noRowsMessage()); | ||
| 86 | + } | ||
| 87 | + | ||
| 88 | + /** | ||
| 75 | * Returns the default column ID to be used when one is not supplied in | 89 | * Returns the default column ID to be used when one is not supplied in |
| 76 | * the payload as the column on which to sort. | 90 | * the payload as the column on which to sort. |
| 77 | * <p> | 91 | * <p> |
| ... | @@ -92,6 +106,15 @@ public abstract class TableRequestHandler extends RequestHandler { | ... | @@ -92,6 +106,15 @@ public abstract class TableRequestHandler extends RequestHandler { |
| 92 | protected abstract String[] getColumnIds(); | 106 | protected abstract String[] getColumnIds(); |
| 93 | 107 | ||
| 94 | /** | 108 | /** |
| 109 | + * Subclasses should return the message to display in the table when there | ||
| 110 | + * are no rows to display. For example, a host table might return | ||
| 111 | + * "No hosts found". | ||
| 112 | + * | ||
| 113 | + * @return the message | ||
| 114 | + */ | ||
| 115 | + protected abstract String noRowsMessage(); | ||
| 116 | + | ||
| 117 | + /** | ||
| 95 | * Subclasses should populate the table model by adding | 118 | * Subclasses should populate the table model by adding |
| 96 | * {@link TableModel.Row rows}. | 119 | * {@link TableModel.Row rows}. |
| 97 | * <pre> | 120 | * <pre> | ... | ... |
| ... | @@ -32,12 +32,12 @@ public final class TableUtils { | ... | @@ -32,12 +32,12 @@ public final class TableUtils { |
| 32 | private TableUtils() { } | 32 | private TableUtils() { } |
| 33 | 33 | ||
| 34 | /** | 34 | /** |
| 35 | - * Generates a JSON array node from a table model. | 35 | + * Generates a JSON array node from the rows of the given table model. |
| 36 | * | 36 | * |
| 37 | * @param tm the table model | 37 | * @param tm the table model |
| 38 | - * @return the array node representation | 38 | + * @return the array node representation of rows |
| 39 | */ | 39 | */ |
| 40 | - public static ArrayNode generateArrayNode(TableModel tm) { | 40 | + public static ArrayNode generateRowArrayNode(TableModel tm) { |
| 41 | ArrayNode array = MAPPER.createArrayNode(); | 41 | ArrayNode array = MAPPER.createArrayNode(); |
| 42 | for (TableModel.Row r : tm.getRows()) { | 42 | for (TableModel.Row r : tm.getRows()) { |
| 43 | array.add(toJsonNode(r, tm)); | 43 | array.add(toJsonNode(r, tm)); |
| ... | @@ -45,6 +45,20 @@ public final class TableUtils { | ... | @@ -45,6 +45,20 @@ public final class TableUtils { |
| 45 | return array; | 45 | return array; |
| 46 | } | 46 | } |
| 47 | 47 | ||
| 48 | + /** | ||
| 49 | + * Generates a JSON object node from the annotations of the given table model. | ||
| 50 | + * | ||
| 51 | + * @param tm the table model | ||
| 52 | + * @return the object node representation of the annotations | ||
| 53 | + */ | ||
| 54 | + public static ObjectNode generateAnnotObjectNode(TableModel tm) { | ||
| 55 | + ObjectNode node = MAPPER.createObjectNode(); | ||
| 56 | + for (TableModel.Annot a : tm.getAnnotations()) { | ||
| 57 | + node.put(a.key(), a.valueAsString()); | ||
| 58 | + } | ||
| 59 | + return node; | ||
| 60 | + } | ||
| 61 | + | ||
| 48 | private static JsonNode toJsonNode(TableModel.Row row, TableModel tm) { | 62 | private static JsonNode toJsonNode(TableModel.Row row, TableModel tm) { |
| 49 | ObjectNode result = MAPPER.createObjectNode(); | 63 | ObjectNode result = MAPPER.createObjectNode(); |
| 50 | String[] keys = tm.getColumnIds(); | 64 | String[] keys = tm.getColumnIds(); | ... | ... |
| ... | @@ -21,6 +21,8 @@ import org.onosproject.ui.table.TableModel.SortDir; | ... | @@ -21,6 +21,8 @@ import org.onosproject.ui.table.TableModel.SortDir; |
| 21 | import org.onosproject.ui.table.cell.DefaultCellFormatter; | 21 | import org.onosproject.ui.table.cell.DefaultCellFormatter; |
| 22 | import org.onosproject.ui.table.cell.HexFormatter; | 22 | import org.onosproject.ui.table.cell.HexFormatter; |
| 23 | 23 | ||
| 24 | +import java.util.Collection; | ||
| 25 | + | ||
| 24 | import static org.junit.Assert.*; | 26 | import static org.junit.Assert.*; |
| 25 | 27 | ||
| 26 | /** | 28 | /** |
| ... | @@ -122,7 +124,6 @@ public class TableModelTest { | ... | @@ -122,7 +124,6 @@ public class TableModelTest { |
| 122 | assertEquals("bad cell", true, row.get(BAR)); | 124 | assertEquals("bad cell", true, row.get(BAR)); |
| 123 | } | 125 | } |
| 124 | 126 | ||
| 125 | - | ||
| 126 | private static final String ONE = "one"; | 127 | private static final String ONE = "one"; |
| 127 | private static final String TWO = "two"; | 128 | private static final String TWO = "two"; |
| 128 | private static final String THREE = "three"; | 129 | private static final String THREE = "three"; |
| ... | @@ -313,7 +314,6 @@ public class TableModelTest { | ... | @@ -313,7 +314,6 @@ public class TableModelTest { |
| 313 | assertEquals("null sort dir", SortDir.ASC, TableModel.sortDir(null)); | 314 | assertEquals("null sort dir", SortDir.ASC, TableModel.sortDir(null)); |
| 314 | } | 315 | } |
| 315 | 316 | ||
| 316 | - | ||
| 317 | @Test | 317 | @Test |
| 318 | public void enumSort() { | 318 | public void enumSort() { |
| 319 | tm = new TableModel(FOO); | 319 | tm = new TableModel(FOO); |
| ... | @@ -335,4 +335,83 @@ public class TableModelTest { | ... | @@ -335,4 +335,83 @@ public class TableModelTest { |
| 335 | assertEquals(UNEX_SORT + i, ordered[i], rows[i].get(FOO)); | 335 | assertEquals(UNEX_SORT + i, ordered[i], rows[i].get(FOO)); |
| 336 | } | 336 | } |
| 337 | } | 337 | } |
| 338 | + | ||
| 339 | + @Test | ||
| 340 | + public void stringAnnotation() { | ||
| 341 | + tm = new TableModel(FOO); | ||
| 342 | + tm.addAnnotation(BAR, ZOO); | ||
| 343 | + Collection<TableModel.Annot> annots = tm.getAnnotations(); | ||
| 344 | + assertEquals("wrong size", 1, annots.size()); | ||
| 345 | + | ||
| 346 | + TableModel.Annot annot = annots.iterator().next(); | ||
| 347 | + assertEquals("wrong key", BAR, annot.key()); | ||
| 348 | + assertEquals("wrong value", ZOO, annot.value()); | ||
| 349 | + } | ||
| 350 | + | ||
| 351 | + private static final String K_INT = "int"; | ||
| 352 | + private static final String K_BOOL = "bool"; | ||
| 353 | + private static final String K_FLOAT = "float"; | ||
| 354 | + private static final String K_DOUBLE = "double"; | ||
| 355 | + private static final String K_ENUM = "enum"; | ||
| 356 | + | ||
| 357 | + private TableModel.Annot getAnnotation(Collection<TableModel.Annot> annots, String key) { | ||
| 358 | + final TableModel.Annot[] annot = {null}; | ||
| 359 | + annots.forEach(a -> { | ||
| 360 | + if (a.key().equals(key)) { | ||
| 361 | + annot[0] = a; | ||
| 362 | + } | ||
| 363 | + }); | ||
| 364 | + return annot[0]; | ||
| 365 | + } | ||
| 366 | + | ||
| 367 | + private void verifyCollectionContains(Collection<TableModel.Annot> annots, | ||
| 368 | + String key, int i) { | ||
| 369 | + TableModel.Annot a = getAnnotation(annots, key); | ||
| 370 | + assertEquals("wrong int value", i, a.value()); | ||
| 371 | + } | ||
| 372 | + | ||
| 373 | + private void verifyCollectionContains(Collection<TableModel.Annot> annots, | ||
| 374 | + String key, boolean b) { | ||
| 375 | + TableModel.Annot a = getAnnotation(annots, key); | ||
| 376 | + assertEquals("wrong boolean value", b, a.value()); | ||
| 377 | + } | ||
| 378 | + | ||
| 379 | + private void verifyCollectionContains(Collection<TableModel.Annot> annots, | ||
| 380 | + String key, float f) { | ||
| 381 | + TableModel.Annot a = getAnnotation(annots, key); | ||
| 382 | + assertEquals("wrong float value", f, a.value()); | ||
| 383 | + } | ||
| 384 | + | ||
| 385 | + private void verifyCollectionContains(Collection<TableModel.Annot> annots, | ||
| 386 | + String key, double d) { | ||
| 387 | + TableModel.Annot a = getAnnotation(annots, key); | ||
| 388 | + assertEquals("wrong double value", d, a.value()); | ||
| 389 | + } | ||
| 390 | + | ||
| 391 | + private void verifyCollectionContains(Collection<TableModel.Annot> annots, | ||
| 392 | + String key, Enum<?> e) { | ||
| 393 | + TableModel.Annot a = getAnnotation(annots, key); | ||
| 394 | + assertEquals("wrong double value", e, a.value()); | ||
| 395 | + } | ||
| 396 | + | ||
| 397 | + @Test | ||
| 398 | + public void primitivesAnnotation() { | ||
| 399 | + tm = new TableModel(FOO); | ||
| 400 | + tm.addAnnotation(K_INT, 1); | ||
| 401 | + tm.addAnnotation(K_BOOL, true); | ||
| 402 | + tm.addAnnotation(K_FLOAT, 3.14f); | ||
| 403 | + tm.addAnnotation(K_DOUBLE, 2.71828); | ||
| 404 | + tm.addAnnotation(K_ENUM, StarWars.LUKE_SKYWALKER); | ||
| 405 | + | ||
| 406 | + Collection<TableModel.Annot> annots = tm.getAnnotations(); | ||
| 407 | + assertEquals("wrong size", 5, annots.size()); | ||
| 408 | + | ||
| 409 | + verifyCollectionContains(annots, K_INT, 1); | ||
| 410 | + verifyCollectionContains(annots, K_BOOL, true); | ||
| 411 | + verifyCollectionContains(annots, K_FLOAT, 3.14f); | ||
| 412 | + verifyCollectionContains(annots, K_DOUBLE, 2.71828); | ||
| 413 | + verifyCollectionContains(annots, K_ENUM, StarWars.LUKE_SKYWALKER); | ||
| 414 | + } | ||
| 415 | + | ||
| 416 | + // TODO: add support for compound object value | ||
| 338 | } | 417 | } | ... | ... |
| ... | @@ -37,7 +37,7 @@ public class TableUtilsTest { | ... | @@ -37,7 +37,7 @@ public class TableUtilsTest { |
| 37 | tm.addRow().cell(FOO, 1).cell(BAR, 2); | 37 | tm.addRow().cell(FOO, 1).cell(BAR, 2); |
| 38 | tm.addRow().cell(FOO, 3).cell(BAR, 4); | 38 | tm.addRow().cell(FOO, 3).cell(BAR, 4); |
| 39 | 39 | ||
| 40 | - ArrayNode array = TableUtils.generateArrayNode(tm); | 40 | + ArrayNode array = TableUtils.generateRowArrayNode(tm); |
| 41 | Assert.assertEquals("wrong results", ARRAY_AS_STRING, array.toString()); | 41 | Assert.assertEquals("wrong results", ARRAY_AS_STRING, array.toString()); |
| 42 | } | 42 | } |
| 43 | 43 | ... | ... |
| ... | @@ -66,6 +66,8 @@ public class ApplicationViewMessageHandler extends UiMessageHandler { | ... | @@ -66,6 +66,8 @@ public class ApplicationViewMessageHandler extends UiMessageHandler { |
| 66 | 66 | ||
| 67 | // handler for application table requests | 67 | // handler for application table requests |
| 68 | private final class AppDataRequest extends TableRequestHandler { | 68 | private final class AppDataRequest extends TableRequestHandler { |
| 69 | + private static final String NO_ROWS_MESSAGE = "No applications found"; | ||
| 70 | + | ||
| 69 | private AppDataRequest() { | 71 | private AppDataRequest() { |
| 70 | super(APP_DATA_REQ, APP_DATA_RESP, APPS); | 72 | super(APP_DATA_REQ, APP_DATA_RESP, APPS); |
| 71 | } | 73 | } |
| ... | @@ -76,6 +78,11 @@ public class ApplicationViewMessageHandler extends UiMessageHandler { | ... | @@ -76,6 +78,11 @@ public class ApplicationViewMessageHandler extends UiMessageHandler { |
| 76 | } | 78 | } |
| 77 | 79 | ||
| 78 | @Override | 80 | @Override |
| 81 | + protected String noRowsMessage() { | ||
| 82 | + return NO_ROWS_MESSAGE; | ||
| 83 | + } | ||
| 84 | + | ||
| 85 | + @Override | ||
| 79 | protected void populateTable(TableModel tm, ObjectNode payload) { | 86 | protected void populateTable(TableModel tm, ObjectNode payload) { |
| 80 | ApplicationService as = get(ApplicationService.class); | 87 | ApplicationService as = get(ApplicationService.class); |
| 81 | for (Application app : as.getApplications()) { | 88 | for (Application app : as.getApplications()) { | ... | ... |
| ... | @@ -60,6 +60,8 @@ public class ClusterViewMessageHandler extends UiMessageHandler { | ... | @@ -60,6 +60,8 @@ public class ClusterViewMessageHandler extends UiMessageHandler { |
| 60 | 60 | ||
| 61 | // handler for cluster table requests | 61 | // handler for cluster table requests |
| 62 | private final class ClusterDataRequest extends TableRequestHandler { | 62 | private final class ClusterDataRequest extends TableRequestHandler { |
| 63 | + private static final String NO_ROWS_MESSAGE = "No cluster nodes found"; | ||
| 64 | + | ||
| 63 | private ClusterDataRequest() { | 65 | private ClusterDataRequest() { |
| 64 | super(CLUSTER_DATA_REQ, CLUSTER_DATA_RESP, CLUSTERS); | 66 | super(CLUSTER_DATA_REQ, CLUSTER_DATA_RESP, CLUSTERS); |
| 65 | } | 67 | } |
| ... | @@ -70,6 +72,11 @@ public class ClusterViewMessageHandler extends UiMessageHandler { | ... | @@ -70,6 +72,11 @@ public class ClusterViewMessageHandler extends UiMessageHandler { |
| 70 | } | 72 | } |
| 71 | 73 | ||
| 72 | @Override | 74 | @Override |
| 75 | + protected String noRowsMessage() { | ||
| 76 | + return NO_ROWS_MESSAGE; | ||
| 77 | + } | ||
| 78 | + | ||
| 79 | + @Override | ||
| 73 | protected TableModel createTableModel() { | 80 | protected TableModel createTableModel() { |
| 74 | TableModel tm = super.createTableModel(); | 81 | TableModel tm = super.createTableModel(); |
| 75 | tm.setFormatter(UPDATED, new TimeFormatter()); | 82 | tm.setFormatter(UPDATED, new TimeFormatter()); | ... | ... |
| ... | @@ -127,6 +127,8 @@ public class DeviceViewMessageHandler extends UiMessageHandler { | ... | @@ -127,6 +127,8 @@ public class DeviceViewMessageHandler extends UiMessageHandler { |
| 127 | 127 | ||
| 128 | // handler for device table requests | 128 | // handler for device table requests |
| 129 | private final class DataRequestHandler extends TableRequestHandler { | 129 | private final class DataRequestHandler extends TableRequestHandler { |
| 130 | + private static final String NO_ROWS_MESSAGE = "No devices found"; | ||
| 131 | + | ||
| 130 | private DataRequestHandler() { | 132 | private DataRequestHandler() { |
| 131 | super(DEV_DATA_REQ, DEV_DATA_RESP, DEVICES); | 133 | super(DEV_DATA_REQ, DEV_DATA_RESP, DEVICES); |
| 132 | } | 134 | } |
| ... | @@ -137,6 +139,11 @@ public class DeviceViewMessageHandler extends UiMessageHandler { | ... | @@ -137,6 +139,11 @@ public class DeviceViewMessageHandler extends UiMessageHandler { |
| 137 | } | 139 | } |
| 138 | 140 | ||
| 139 | @Override | 141 | @Override |
| 142 | + protected String noRowsMessage() { | ||
| 143 | + return NO_ROWS_MESSAGE; | ||
| 144 | + } | ||
| 145 | + | ||
| 146 | + @Override | ||
| 140 | protected void populateTable(TableModel tm, ObjectNode payload) { | 147 | protected void populateTable(TableModel tm, ObjectNode payload) { |
| 141 | DeviceService ds = get(DeviceService.class); | 148 | DeviceService ds = get(DeviceService.class); |
| 142 | MastershipService ms = get(MastershipService.class); | 149 | MastershipService ms = get(MastershipService.class); | ... | ... |
| ... | @@ -75,6 +75,8 @@ public class FlowViewMessageHandler extends UiMessageHandler { | ... | @@ -75,6 +75,8 @@ public class FlowViewMessageHandler extends UiMessageHandler { |
| 75 | // handler for flow table requests | 75 | // handler for flow table requests |
| 76 | private final class FlowDataRequest extends TableRequestHandler { | 76 | private final class FlowDataRequest extends TableRequestHandler { |
| 77 | 77 | ||
| 78 | + private static final String NO_ROWS_MESSAGE = "No flows found"; | ||
| 79 | + | ||
| 78 | private FlowDataRequest() { | 80 | private FlowDataRequest() { |
| 79 | super(FLOW_DATA_REQ, FLOW_DATA_RESP, FLOWS); | 81 | super(FLOW_DATA_REQ, FLOW_DATA_RESP, FLOWS); |
| 80 | } | 82 | } |
| ... | @@ -85,6 +87,11 @@ public class FlowViewMessageHandler extends UiMessageHandler { | ... | @@ -85,6 +87,11 @@ public class FlowViewMessageHandler extends UiMessageHandler { |
| 85 | } | 87 | } |
| 86 | 88 | ||
| 87 | @Override | 89 | @Override |
| 90 | + protected String noRowsMessage() { | ||
| 91 | + return NO_ROWS_MESSAGE; | ||
| 92 | + } | ||
| 93 | + | ||
| 94 | + @Override | ||
| 88 | protected TableModel createTableModel() { | 95 | protected TableModel createTableModel() { |
| 89 | TableModel tm = super.createTableModel(); | 96 | TableModel tm = super.createTableModel(); |
| 90 | tm.setFormatter(ID, HexLongFormatter.INSTANCE); | 97 | tm.setFormatter(ID, HexLongFormatter.INSTANCE); | ... | ... |
| ... | @@ -65,6 +65,8 @@ public class GroupViewMessageHandler extends UiMessageHandler { | ... | @@ -65,6 +65,8 @@ public class GroupViewMessageHandler extends UiMessageHandler { |
| 65 | // handler for group table requests | 65 | // handler for group table requests |
| 66 | private final class GroupDataRequest extends TableRequestHandler { | 66 | private final class GroupDataRequest extends TableRequestHandler { |
| 67 | 67 | ||
| 68 | + private static final String NO_ROWS_MESSAGE = "No groups found"; | ||
| 69 | + | ||
| 68 | private GroupDataRequest() { | 70 | private GroupDataRequest() { |
| 69 | super(GROUP_DATA_REQ, GROUP_DATA_RESP, GROUPS); | 71 | super(GROUP_DATA_REQ, GROUP_DATA_RESP, GROUPS); |
| 70 | } | 72 | } |
| ... | @@ -75,6 +77,12 @@ public class GroupViewMessageHandler extends UiMessageHandler { | ... | @@ -75,6 +77,12 @@ public class GroupViewMessageHandler extends UiMessageHandler { |
| 75 | } | 77 | } |
| 76 | 78 | ||
| 77 | @Override | 79 | @Override |
| 80 | + protected String noRowsMessage() { | ||
| 81 | + // TODO: if devices with OF 1.0, should return not support message | ||
| 82 | + return NO_ROWS_MESSAGE; | ||
| 83 | + } | ||
| 84 | + | ||
| 85 | + @Override | ||
| 78 | protected TableModel createTableModel() { | 86 | protected TableModel createTableModel() { |
| 79 | TableModel tm = super.createTableModel(); | 87 | TableModel tm = super.createTableModel(); |
| 80 | tm.setFormatter(ID, HexFormatter.INSTANCE); | 88 | tm.setFormatter(ID, HexFormatter.INSTANCE); | ... | ... |
| ... | @@ -62,6 +62,8 @@ public class HostViewMessageHandler extends UiMessageHandler { | ... | @@ -62,6 +62,8 @@ public class HostViewMessageHandler extends UiMessageHandler { |
| 62 | 62 | ||
| 63 | // handler for host table requests | 63 | // handler for host table requests |
| 64 | private final class HostDataRequest extends TableRequestHandler { | 64 | private final class HostDataRequest extends TableRequestHandler { |
| 65 | + private static final String NO_ROWS_MESSAGE = "No hosts found"; | ||
| 66 | + | ||
| 65 | private HostDataRequest() { | 67 | private HostDataRequest() { |
| 66 | super(HOST_DATA_REQ, HOST_DATA_RESP, HOSTS); | 68 | super(HOST_DATA_REQ, HOST_DATA_RESP, HOSTS); |
| 67 | } | 69 | } |
| ... | @@ -72,6 +74,11 @@ public class HostViewMessageHandler extends UiMessageHandler { | ... | @@ -72,6 +74,11 @@ public class HostViewMessageHandler extends UiMessageHandler { |
| 72 | } | 74 | } |
| 73 | 75 | ||
| 74 | @Override | 76 | @Override |
| 77 | + protected String noRowsMessage() { | ||
| 78 | + return NO_ROWS_MESSAGE; | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + @Override | ||
| 75 | protected TableModel createTableModel() { | 82 | protected TableModel createTableModel() { |
| 76 | TableModel tm = super.createTableModel(); | 83 | TableModel tm = super.createTableModel(); |
| 77 | tm.setFormatter(LOCATION, HostLocationFormatter.INSTANCE); | 84 | tm.setFormatter(LOCATION, HostLocationFormatter.INSTANCE); | ... | ... |
| ... | @@ -71,6 +71,8 @@ public class IntentViewMessageHandler extends UiMessageHandler { | ... | @@ -71,6 +71,8 @@ public class IntentViewMessageHandler extends UiMessageHandler { |
| 71 | 71 | ||
| 72 | // handler for intent table requests | 72 | // handler for intent table requests |
| 73 | private final class IntentDataRequest extends TableRequestHandler { | 73 | private final class IntentDataRequest extends TableRequestHandler { |
| 74 | + private static final String NO_ROWS_MESSAGE = "No intents found"; | ||
| 75 | + | ||
| 74 | private IntentDataRequest() { | 76 | private IntentDataRequest() { |
| 75 | super(INTENT_DATA_REQ, INTENT_DATA_RESP, INTENTS); | 77 | super(INTENT_DATA_REQ, INTENT_DATA_RESP, INTENTS); |
| 76 | } | 78 | } |
| ... | @@ -86,6 +88,11 @@ public class IntentViewMessageHandler extends UiMessageHandler { | ... | @@ -86,6 +88,11 @@ public class IntentViewMessageHandler extends UiMessageHandler { |
| 86 | } | 88 | } |
| 87 | 89 | ||
| 88 | @Override | 90 | @Override |
| 91 | + protected String noRowsMessage() { | ||
| 92 | + return NO_ROWS_MESSAGE; | ||
| 93 | + } | ||
| 94 | + | ||
| 95 | + @Override | ||
| 89 | protected TableModel createTableModel() { | 96 | protected TableModel createTableModel() { |
| 90 | TableModel tm = super.createTableModel(); | 97 | TableModel tm = super.createTableModel(); |
| 91 | tm.setFormatter(APP_ID, AppIdFormatter.INSTANCE); | 98 | tm.setFormatter(APP_ID, AppIdFormatter.INSTANCE); | ... | ... |
| ... | @@ -65,6 +65,8 @@ public class LinkViewMessageHandler extends UiMessageHandler { | ... | @@ -65,6 +65,8 @@ public class LinkViewMessageHandler extends UiMessageHandler { |
| 65 | 65 | ||
| 66 | // handler for link table requests | 66 | // handler for link table requests |
| 67 | private final class LinkDataRequest extends TableRequestHandler { | 67 | private final class LinkDataRequest extends TableRequestHandler { |
| 68 | + private static final String NO_ROWS_MESSAGE = "No links found"; | ||
| 69 | + | ||
| 68 | private LinkDataRequest() { | 70 | private LinkDataRequest() { |
| 69 | super(LINK_DATA_REQ, LINK_DATA_RESP, LINKS); | 71 | super(LINK_DATA_REQ, LINK_DATA_RESP, LINKS); |
| 70 | } | 72 | } |
| ... | @@ -75,6 +77,11 @@ public class LinkViewMessageHandler extends UiMessageHandler { | ... | @@ -75,6 +77,11 @@ public class LinkViewMessageHandler extends UiMessageHandler { |
| 75 | } | 77 | } |
| 76 | 78 | ||
| 77 | @Override | 79 | @Override |
| 80 | + protected String noRowsMessage() { | ||
| 81 | + return NO_ROWS_MESSAGE; | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + @Override | ||
| 78 | protected String defaultColumnId() { | 85 | protected String defaultColumnId() { |
| 79 | return ONE; | 86 | return ONE; |
| 80 | } | 87 | } | ... | ... |
| ... | @@ -61,6 +61,8 @@ public class MeterViewMessageHandler extends UiMessageHandler { | ... | @@ -61,6 +61,8 @@ public class MeterViewMessageHandler extends UiMessageHandler { |
| 61 | // handler for meter table requests | 61 | // handler for meter table requests |
| 62 | private final class MeterDataRequest extends TableRequestHandler { | 62 | private final class MeterDataRequest extends TableRequestHandler { |
| 63 | 63 | ||
| 64 | + private static final String NO_ROWS_MESSAGE = "No meters found"; | ||
| 65 | + | ||
| 64 | private MeterDataRequest() { | 66 | private MeterDataRequest() { |
| 65 | super(METER_DATA_REQ, METER_DATA_RESP, METERS); | 67 | super(METER_DATA_REQ, METER_DATA_RESP, METERS); |
| 66 | } | 68 | } |
| ... | @@ -71,6 +73,12 @@ public class MeterViewMessageHandler extends UiMessageHandler { | ... | @@ -71,6 +73,12 @@ public class MeterViewMessageHandler extends UiMessageHandler { |
| 71 | } | 73 | } |
| 72 | 74 | ||
| 73 | @Override | 75 | @Override |
| 76 | + protected String noRowsMessage() { | ||
| 77 | + // TODO: if the device with OF 1.0, return not support message | ||
| 78 | + return NO_ROWS_MESSAGE; | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + @Override | ||
| 74 | protected TableModel createTableModel() { | 82 | protected TableModel createTableModel() { |
| 75 | TableModel tm = super.createTableModel(); | 83 | TableModel tm = super.createTableModel(); |
| 76 | tm.setFormatter(ID, HexLongFormatter.INSTANCE); | 84 | tm.setFormatter(ID, HexLongFormatter.INSTANCE); | ... | ... |
| ... | @@ -62,6 +62,8 @@ public class PortViewMessageHandler extends UiMessageHandler { | ... | @@ -62,6 +62,8 @@ public class PortViewMessageHandler extends UiMessageHandler { |
| 62 | // handler for port table requests | 62 | // handler for port table requests |
| 63 | private final class PortDataRequest extends TableRequestHandler { | 63 | private final class PortDataRequest extends TableRequestHandler { |
| 64 | 64 | ||
| 65 | + private static final String NO_ROWS_MESSAGE = "No ports found"; | ||
| 66 | + | ||
| 65 | private PortDataRequest() { | 67 | private PortDataRequest() { |
| 66 | super(PORT_DATA_REQ, PORT_DATA_RESP, PORTS); | 68 | super(PORT_DATA_REQ, PORT_DATA_RESP, PORTS); |
| 67 | } | 69 | } |
| ... | @@ -72,6 +74,11 @@ public class PortViewMessageHandler extends UiMessageHandler { | ... | @@ -72,6 +74,11 @@ public class PortViewMessageHandler extends UiMessageHandler { |
| 72 | } | 74 | } |
| 73 | 75 | ||
| 74 | @Override | 76 | @Override |
| 77 | + protected String noRowsMessage() { | ||
| 78 | + return NO_ROWS_MESSAGE; | ||
| 79 | + } | ||
| 80 | + | ||
| 81 | + @Override | ||
| 75 | protected TableModel createTableModel() { | 82 | protected TableModel createTableModel() { |
| 76 | TableModel tm = super.createTableModel(); | 83 | TableModel tm = super.createTableModel(); |
| 77 | tm.setFormatter(PKT_RX, NumberFormatter.INTEGER); | 84 | tm.setFormatter(PKT_RX, NumberFormatter.INTEGER); | ... | ... |
| ... | @@ -64,6 +64,8 @@ public class ProcessorViewMessageHandler extends UiMessageHandler { | ... | @@ -64,6 +64,8 @@ public class ProcessorViewMessageHandler extends UiMessageHandler { |
| 64 | 64 | ||
| 65 | // handler for packet processor table requests | 65 | // handler for packet processor table requests |
| 66 | private final class ProcessorDataRequest extends TableRequestHandler { | 66 | private final class ProcessorDataRequest extends TableRequestHandler { |
| 67 | + private static final String NO_ROWS_MESSAGE = "No packet processors found"; | ||
| 68 | + | ||
| 67 | private ProcessorDataRequest() { | 69 | private ProcessorDataRequest() { |
| 68 | super(PROCESSOR_DATA_REQ, PROCESSOR_DATA_RESP, PROCESSORS); | 70 | super(PROCESSOR_DATA_REQ, PROCESSOR_DATA_RESP, PROCESSORS); |
| 69 | } | 71 | } |
| ... | @@ -74,6 +76,11 @@ public class ProcessorViewMessageHandler extends UiMessageHandler { | ... | @@ -74,6 +76,11 @@ public class ProcessorViewMessageHandler extends UiMessageHandler { |
| 74 | } | 76 | } |
| 75 | 77 | ||
| 76 | @Override | 78 | @Override |
| 79 | + protected String noRowsMessage() { | ||
| 80 | + return NO_ROWS_MESSAGE; | ||
| 81 | + } | ||
| 82 | + | ||
| 83 | + @Override | ||
| 77 | protected TableModel createTableModel() { | 84 | protected TableModel createTableModel() { |
| 78 | TableModel tm = super.createTableModel(); | 85 | TableModel tm = super.createTableModel(); |
| 79 | tm.setFormatter(AVG_MS, NumberFormatter.TO_5DP); | 86 | tm.setFormatter(AVG_MS, NumberFormatter.TO_5DP); | ... | ... |
| ... | @@ -53,6 +53,8 @@ public class SettingsViewMessageHandler extends UiMessageHandler { | ... | @@ -53,6 +53,8 @@ public class SettingsViewMessageHandler extends UiMessageHandler { |
| 53 | 53 | ||
| 54 | // handler for host table requests | 54 | // handler for host table requests |
| 55 | private final class SettingsRequest extends TableRequestHandler { | 55 | private final class SettingsRequest extends TableRequestHandler { |
| 56 | + private static final String NO_ROWS_MESSAGE = "No settings found"; | ||
| 57 | + | ||
| 56 | private SettingsRequest() { | 58 | private SettingsRequest() { |
| 57 | super(DATA_REQUEST, DATA_RESPONSE, SETTINGS); | 59 | super(DATA_REQUEST, DATA_RESPONSE, SETTINGS); |
| 58 | } | 60 | } |
| ... | @@ -63,6 +65,11 @@ public class SettingsViewMessageHandler extends UiMessageHandler { | ... | @@ -63,6 +65,11 @@ public class SettingsViewMessageHandler extends UiMessageHandler { |
| 63 | } | 65 | } |
| 64 | 66 | ||
| 65 | @Override | 67 | @Override |
| 68 | + protected String noRowsMessage() { | ||
| 69 | + return NO_ROWS_MESSAGE; | ||
| 70 | + } | ||
| 71 | + | ||
| 72 | + @Override | ||
| 66 | protected String defaultColumnId() { | 73 | protected String defaultColumnId() { |
| 67 | return COMPONENT; | 74 | return COMPONENT; |
| 68 | } | 75 | } | ... | ... |
| ... | @@ -55,6 +55,8 @@ public class TunnelViewMessageHandler extends UiMessageHandler { | ... | @@ -55,6 +55,8 @@ public class TunnelViewMessageHandler extends UiMessageHandler { |
| 55 | 55 | ||
| 56 | private final class TunnelDataRequestHandler extends TableRequestHandler { | 56 | private final class TunnelDataRequestHandler extends TableRequestHandler { |
| 57 | 57 | ||
| 58 | + private static final String NO_ROWS_MESSAGE = "No tunnels found"; | ||
| 59 | + | ||
| 58 | public TunnelDataRequestHandler() { | 60 | public TunnelDataRequestHandler() { |
| 59 | super(TUNNEL_DATA_REQ, TUNNEL_DATA_RESP, TUNNELS); | 61 | super(TUNNEL_DATA_REQ, TUNNEL_DATA_RESP, TUNNELS); |
| 60 | } | 62 | } |
| ... | @@ -65,6 +67,11 @@ public class TunnelViewMessageHandler extends UiMessageHandler { | ... | @@ -65,6 +67,11 @@ public class TunnelViewMessageHandler extends UiMessageHandler { |
| 65 | } | 67 | } |
| 66 | 68 | ||
| 67 | @Override | 69 | @Override |
| 70 | + protected String noRowsMessage() { | ||
| 71 | + return NO_ROWS_MESSAGE; | ||
| 72 | + } | ||
| 73 | + | ||
| 74 | + @Override | ||
| 68 | protected TableModel createTableModel() { | 75 | protected TableModel createTableModel() { |
| 69 | TableModel tm = super.createTableModel(); | 76 | TableModel tm = super.createTableModel(); |
| 70 | //TODO add more formater class so that we can get a more readable table | 77 | //TODO add more formater class so that we can get a more readable table | ... | ... |
-
Please register or login to post a comment