[ONOS-6375] Implement table view for querying mapping information

Change-Id: I786fe19dc31889b777f55587faecc48e63db6666
diff --git a/apps/mappingmanagement/web/src/main/java/org/onosproject/mapping/web/gui/MappingsViewMessageHandler.java b/apps/mappingmanagement/web/src/main/java/org/onosproject/mapping/web/gui/MappingsViewMessageHandler.java
index 67b570e..b46e3cd 100644
--- a/apps/mappingmanagement/web/src/main/java/org/onosproject/mapping/web/gui/MappingsViewMessageHandler.java
+++ b/apps/mappingmanagement/web/src/main/java/org/onosproject/mapping/web/gui/MappingsViewMessageHandler.java
@@ -20,14 +20,22 @@
 import com.google.common.collect.ImmutableSet;
 import org.onosproject.mapping.MappingEntry;
 import org.onosproject.mapping.MappingService;
+import org.onosproject.mapping.MappingTreatment;
+import org.onosproject.mapping.MappingValue;
+import org.onosproject.mapping.addresses.MappingAddress;
 import org.onosproject.net.DeviceId;
 import org.onosproject.ui.RequestHandler;
 import org.onosproject.ui.UiMessageHandler;
+import org.onosproject.ui.table.CellFormatter;
 import org.onosproject.ui.table.TableModel;
 import org.onosproject.ui.table.TableRequestHandler;
+import org.onosproject.ui.table.cell.EnumFormatter;
+import org.onosproject.ui.table.cell.HexLongFormatter;
 
 import java.util.Collection;
+import java.util.List;
 
+import static org.onosproject.mapping.MappingStore.Type.MAP_CACHE;
 import static org.onosproject.mapping.MappingStore.Type.MAP_DATABASE;
 
 /**
@@ -40,14 +48,32 @@
     private static final String MAPPINGS = "mappings";
 
     private static final String ID = "id";
+    private static final String MAPPING_KEY = "mappingKey";
+    private static final String MAPPING_VALUE = "mappingValue";
+    private static final String MAPPING_ACTION = "mappingAction";
+    private static final String TYPE = "type";
+    private static final String STATE = "state";
+    private static final String DATABASE = "database";
+    private static final String CACHE = "cache";
 
-    private static final String[] COL_IDS = {ID};
+    private static final String COMMA = ", ";
+    private static final String OX = "0x";
+    private static final String EMPTY = "";
+
+    private static final String NULL_ADDRESS_MSG = "(No mapping address for this mapping)";
+
+    private static final String[] COL_IDS = {
+            ID, MAPPING_KEY, MAPPING_VALUE, STATE, MAPPING_ACTION, TYPE
+    };
 
     @Override
     protected Collection<RequestHandler> createRequestHandlers() {
         return ImmutableSet.of(new MappingMessageRequest());
     }
 
+    /**
+     * Handler for mapping message requests.
+     */
     private final class MappingMessageRequest extends TableRequestHandler {
 
         private static final String NO_ROWS_MESSAGE = "No mappings found";
@@ -67,19 +93,88 @@
         }
 
         @Override
+        protected TableModel createTableModel() {
+            TableModel tm = super.createTableModel();
+            tm.setFormatter(ID, HexLongFormatter.INSTANCE);
+            tm.setFormatter(TYPE, EnumFormatter.INSTANCE);
+            tm.setFormatter(STATE, EnumFormatter.INSTANCE);
+            tm.setFormatter(MAPPING_KEY, new MappingKeyFormatter());
+            tm.setFormatter(MAPPING_VALUE, new MappingValueFormatter());
+            return tm;
+        }
+
+        @Override
         protected void populateTable(TableModel tm, ObjectNode payload) {
             String uri = string(payload, "devId");
             if (!Strings.isNullOrEmpty(uri)) {
                 DeviceId deviceId = DeviceId.deviceId(uri);
                 MappingService ms = get(MappingService.class);
+
                 for (MappingEntry mapping : ms.getMappingEntries(MAP_DATABASE, deviceId)) {
-                    populateRow(tm.addRow(), mapping);
+                    populateRow(tm.addRow(), mapping, DATABASE);
+                }
+
+                for (MappingEntry mapping : ms.getMappingEntries(MAP_CACHE, deviceId)) {
+                    populateRow(tm.addRow(), mapping, CACHE);
                 }
             }
         }
 
-        private void populateRow(TableModel.Row row, MappingEntry mapping) {
-            row.cell(ID, mapping.id().value());
+        private void populateRow(TableModel.Row row, MappingEntry mapping,
+                                         String type) {
+            row.cell(ID, mapping.id().value())
+                    .cell(STATE, mapping.state())
+                    .cell(TYPE, type)
+                    .cell(MAPPING_ACTION, mapping.value().action())
+                    .cell(MAPPING_KEY, mapping)
+                    .cell(MAPPING_VALUE, mapping);
+        }
+    }
+
+    /**
+     * A formatter for formatting mapping key.
+     */
+    private final class MappingKeyFormatter implements CellFormatter {
+
+        @Override
+        public String format(Object value) {
+            MappingEntry mapping = (MappingEntry) value;
+            MappingAddress address = mapping.key().address();
+
+            if (address == null) {
+                return NULL_ADDRESS_MSG;
+            }
+            StringBuilder sb = new StringBuilder("Mapping address: ");
+            sb.append(address.toString());
+
+            return sb.toString();
+        }
+    }
+
+    /**
+     * A formatter for formatting mapping value.
+     */
+    private final class MappingValueFormatter implements CellFormatter {
+
+        @Override
+        public String format(Object value) {
+            MappingEntry mapping = (MappingEntry) value;
+            MappingValue mappingValue = mapping.value();
+            List<MappingTreatment> treatments = mappingValue.treatments();
+
+            StringBuilder sb = new StringBuilder("Treatments: ");
+            formatTreatments(sb, treatments);
+
+            return sb.toString();
+        }
+
+        private void formatTreatments(StringBuilder sb,
+                                      List<MappingTreatment> treatments) {
+            if (!treatments.isEmpty()) {
+                for (MappingTreatment t : treatments) {
+                    sb.append(t).append(COMMA);
+                }
+            }
         }
     }
 }