[ONOS-7989] add sync button on roadm GUI view.

Change-Id: I0f27ac6c9c100f54180c490fc043da65ef1225e0
diff --git a/apps/roadm/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java b/apps/roadm/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java
index c137c13..e13b2c7 100644
--- a/apps/roadm/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java
+++ b/apps/roadm/src/main/java/org/onosproject/roadm/DistributedRoadmStore.java
@@ -95,4 +95,11 @@
         }
         return null;
     }
+
+    @Override
+    public void removeTargetPower(DeviceId deviceId, PortNumber portNumber) {
+        if (powerMap.get(deviceId) != null) {
+            powerMap.get(deviceId).remove(portNumber);
+        }
+    }
 }
diff --git a/apps/roadm/src/main/java/org/onosproject/roadm/RoadmManager.java b/apps/roadm/src/main/java/org/onosproject/roadm/RoadmManager.java
index 323f32e..9f83df5 100644
--- a/apps/roadm/src/main/java/org/onosproject/roadm/RoadmManager.java
+++ b/apps/roadm/src/main/java/org/onosproject/roadm/RoadmManager.java
@@ -203,8 +203,29 @@
     public Long getTargetPortPower(DeviceId deviceId, PortNumber portNumber) {
         checkNotNull(deviceId);
         checkNotNull(portNumber);
-        // getTargetPortPower is not yet implemented in PowerConfig so we access store instead
-        return roadmStore.getTargetPower(deviceId, portNumber);
+        // Request target port power when it doesn't exist. Inactive updating mode.
+        Long power = roadmStore.getTargetPower(deviceId, portNumber);
+        if (power == null) {
+            return syncTargetPortPower(deviceId, portNumber);
+        }
+        return power;
+    }
+
+    @Override
+    public Long syncTargetPortPower(DeviceId deviceId, PortNumber portNumber) {
+        checkNotNull(deviceId);
+        checkNotNull(portNumber);
+        PowerConfig<Object> powerConfig = getPowerConfig(deviceId);
+        if (powerConfig != null) {
+            Optional<Long> pl = powerConfig.getTargetPower(portNumber, Direction.ALL);
+            if (pl.isPresent()) {
+                roadmStore.setTargetPower(deviceId, portNumber, pl.get());
+                return pl.get();
+            } else {
+                roadmStore.removeTargetPower(deviceId, portNumber);
+            }
+        }
+        return null;
     }
 
     @Override
diff --git a/apps/roadm/src/main/java/org/onosproject/roadm/RoadmPortViewMessageHandler.java b/apps/roadm/src/main/java/org/onosproject/roadm/RoadmPortViewMessageHandler.java
index 192eb2e..dea83b0 100644
--- a/apps/roadm/src/main/java/org/onosproject/roadm/RoadmPortViewMessageHandler.java
+++ b/apps/roadm/src/main/java/org/onosproject/roadm/RoadmPortViewMessageHandler.java
@@ -64,6 +64,8 @@
     private static final String ROADM_PORTS = "roadmPorts";
     private static final String ROADM_SET_TARGET_POWER_REQ = "roadmSetTargetPowerRequest";
     private static final String ROADM_SET_TARGET_POWER_RESP = "roadmSetTargetPowerResponse";
+    private static final String ROADM_SYNC_TARGET_POWER_REQ = "roadmSyncTargetPowerRequest";
+    private static final String ROADM_SYNC_TARGET_POWER_RESP = "roadmSyncTargetPowerResp";
     private static final String ROADM_SHOW_ITEMS_REQ = "roadmShowPortItemsRequest";
     private static final String ROADM_SHOW_ITEMS_RESP = "roadmShowPortItemsResponse";
     private static final String ROADM_SET_OPS_MODE_REQ = "roadmSetOpsModeRequest";
@@ -105,7 +107,8 @@
         return ImmutableSet.of(new PortTableDataRequestHandler(),
                 new SetTargetPowerRequestHandler(),
                 new CreateShowItemsRequestHandler(),
-                new CreateOpsModeSetRequestHandler()
+                new CreateOpsModeSetRequestHandler(),
+                new SyncTargetPowerRequestHandler()
                 );
     }
 
@@ -250,6 +253,28 @@
         }
     }
 
+    // Handler for sync-up port target power
+    private final class SyncTargetPowerRequestHandler extends RequestHandler {
+
+        private static final String SYNCED_TARGET_POWER = "Synced target power is %s.";
+        private SyncTargetPowerRequestHandler() {
+            super(ROADM_SYNC_TARGET_POWER_REQ);
+        }
+
+        @Override
+        public void process(ObjectNode payload) {
+            DeviceId deviceId = DeviceId.deviceId(string(payload, RoadmUtil.DEV_ID));
+            PortNumber portNumber = PortNumber.portNumber(payload.get(ID).asLong());
+            Long targetPower = roadmService.syncTargetPortPower(deviceId, portNumber);
+            String power = RoadmUtil.objectToString(targetPower, RoadmUtil.UNKNOWN);
+            ObjectNode rootNode = objectNode();
+            rootNode.put(ID, payload.get(ID).asText())
+                    .put(RoadmUtil.VALID, true)
+                    .put(RoadmUtil.MESSAGE, String.format(SYNCED_TARGET_POWER, power));
+            sendMessage(ROADM_SYNC_TARGET_POWER_RESP, rootNode);
+        }
+    }
+
     // Protection switch operation type and path index
     private static final String OPS_ARRAY_INDEX = "index";
     private static final String OPS_ARRAY_OPERATION = "operation";
diff --git a/apps/roadm/src/main/java/org/onosproject/roadm/RoadmService.java b/apps/roadm/src/main/java/org/onosproject/roadm/RoadmService.java
index 4cd5fcf2..c9e65d8 100644
--- a/apps/roadm/src/main/java/org/onosproject/roadm/RoadmService.java
+++ b/apps/roadm/src/main/java/org/onosproject/roadm/RoadmService.java
@@ -93,7 +93,7 @@
     void setTargetPortPower(DeviceId deviceId, PortNumber portNumber, long power);
 
     /**
-     * Returns the target power for a port if the port has configurable target power.
+     * Returns the target power stored in storage for a port if the port has configurable target power.
      *
      * @param deviceId DeviceId of the device to configure
      * @param portNumber PortNumber of the port to configure
@@ -102,6 +102,14 @@
     Long getTargetPortPower(DeviceId deviceId, PortNumber portNumber);
 
     /**
+     * Sync-up the target power for a port if the operator want to check the configuration.
+     * @param deviceId DeviceId of the device to configure
+     * @param portNumber PortNumber of the port to configure
+     * @return the target power if the port has a target power, null otherwise
+     */
+    Long syncTargetPortPower(DeviceId deviceId, PortNumber portNumber);
+
+    /**
      * Sets the attenuation of a connection. This does not check that attenuation
      * is within the acceptable range.
      *
diff --git a/apps/roadm/src/main/java/org/onosproject/roadm/RoadmStore.java b/apps/roadm/src/main/java/org/onosproject/roadm/RoadmStore.java
index 695c5b7..6c7abac 100644
--- a/apps/roadm/src/main/java/org/onosproject/roadm/RoadmStore.java
+++ b/apps/roadm/src/main/java/org/onosproject/roadm/RoadmStore.java
@@ -64,4 +64,12 @@
      * @return target power if target power has already been set, null otherwise
      */
     Long getTargetPower(DeviceId deviceId, PortNumber portNumber);
+
+    /**
+     * Remove the targetPower for a port on a device. The power value is removed,
+     * however, the device isn't.
+     * @param deviceId DeviceId of the device
+     * @param portNumber PortNumber of the port
+     */
+    void removeTargetPower(DeviceId deviceId, PortNumber portNumber);
 }