...
Code Block | ||
---|---|---|
| ||
private static final String MAC = "mac"; ... @Override protected String defaultColumnId() { return MAC; } |
The sample table uses the default column identifier of "id", so can rely on the default implementation.
(2b) define column identifiers:
...
Note that the column identifiers defined here must match the identifiers defined in the HTML snippet for (sample.html) for the view.
(2c) optionally override createTableModel() to specify custom cell formatters / comparators. The following example sets both a formatter and a comparator for the "code" column:
...
Info |
---|
See additional details about table models, formatters, and comparators. |
The sample table relies on the default formatter and comparator.
(2d) implement populateTable() to add rows to the supplied table model:
Code Block | ||
---|---|---|
| ||
@Override protected void populateTable(TableModel tm, ObjectNode payload) { // ... List<Item> items = getItems(); for (Item item: items) { populateRow(tm.addRow(), item); } } private void populateRow(TableModel.Row row, Item item) { row.cell(ID, item.id()) .cell(LABEL, item.label()) .cell(CODE, item.code()); } |
The sample template table uses fake data for demonstration purposes. A more realistic implementation would use one or more services to obtain the required data. The device table, for example, has an implementation something like this:
Code Block | ||
---|---|---|
| ||
@Override
protected void populateTable(TableModel tm, ObjectNode payload) {
DeviceService ds = get(DeviceService.class);
MastershipService ms = get(MastershipService.class);
for (Device dev : ds.getDevices()) {
populateRow(tm.addRow(), dev, ds, ms);
}
}
private void populateRow(TableModel.Row row, Device dev,
DeviceService ds, MastershipService ms) {
DeviceId id = dev.id();
String protocol = dev.annotations().value(PROTOCOL);
row.cell(ID, id)
.cell(MFR, dev.manufacturer())
.cell(HW, dev.hwVersion())
.cell(SW, dev.swVersion())
.cell(PROTOCOL, protocol != null ? protocol : "")
.cell(NUM_PORTS, ds.getPorts(id).size())
.cell(MASTER_ID, ms.getMasterFor(id));
}
} |
(3) define SampleDetailRequestHandler class to handle "sampleDetailRequest" events from the client. Note that this class extends the base RequestHandler class:
Code Block | ||
---|---|---|
| ||
private static final String SAMPLE_DETAIL_REQ = "sampleDetailsRequest";
...
private final class SampleDetailRequestHandler extends RequestHandler {
private SampleDetailRequestHandler() {
super(SAMPLE_DETAIL_REQ);
}
...
} |
(3a) implement process(...) to return detail information about the "selected" row:
Code Block | ||
---|---|---|
| ||
private static final String SAMPLE_DETAIL_RESP = "sampleDetailsResponse"; private static final String DETAILS = "details"; ... private static final String COMMENT = "comment"; private static final String RESULT = "result"; ... @Override public void process(long sid, ObjectNode payload) { String id = string(payload, ID, "(none)"); // SomeService ss = get(SomeService.class); // Item item = ss.getItemDetails(id) // fake data for demonstration purposes... Item item = getItem(id); ObjectNode rootNode = MAPPER.createObjectNode(); ObjectNode data = MAPPER.createObjectNode(); rootNode.set(DETAILS, data); if (item == null) { rootNode.put(RESULT, "Item with id '" + id + "' not found"); log.warn("attempted to get item detail for id '{}'", id); } else { rootNode.put(RESULT, "Found item with id '" + id + "'"); data.put(ID, item.id()); data.put(LABEL, item.label()); data.put(CODE, item.code()); data.put(COMMENT, "Some arbitrary comment"); } sendMessage(SAMPLE_DETAIL_RESP, 0, rootNode); } |