Fix cast error on execution of "flow -j" command

This resolves ONOS-2037.

Change-Id: Ie6bf0c7ca0644ae8029df72d3ea7084fa0297aca
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/CriterionCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/CriterionCodec.java
index 0421e02..1670361 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/CriterionCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/CriterionCodec.java
@@ -19,6 +19,7 @@
 
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
+import org.onosproject.net.OchSignal;
 import org.onosproject.net.flow.criteria.Criterion;
 import org.onosproject.net.flow.criteria.EthCriterion;
 import org.onosproject.net.flow.criteria.EthTypeCriterion;
@@ -34,9 +35,9 @@
 import org.onosproject.net.flow.criteria.IcmpTypeCriterion;
 import org.onosproject.net.flow.criteria.Icmpv6CodeCriterion;
 import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion;
-import org.onosproject.net.flow.criteria.LambdaCriterion;
 import org.onosproject.net.flow.criteria.MetadataCriterion;
 import org.onosproject.net.flow.criteria.MplsCriterion;
+import org.onosproject.net.flow.criteria.OchSignalCriterion;
 import org.onosproject.net.flow.criteria.OchSignalTypeCriterion;
 import org.onosproject.net.flow.criteria.PortCriterion;
 import org.onosproject.net.flow.criteria.SctpPortCriterion;
@@ -325,9 +326,15 @@
     private static class FormatOchSigId implements CriterionTypeFormatter {
         @Override
         public ObjectNode encodeCriterion(ObjectNode root, Criterion criterion) {
-            final LambdaCriterion lambdaCriterion =
-                    (LambdaCriterion) criterion;
-            return root.put("lambda", lambdaCriterion.lambda());
+            OchSignal ochSignal = ((OchSignalCriterion) criterion).lambda();
+            ObjectNode child = root.putObject("ochSignalId");
+
+            child.put("gridType", ochSignal.gridType().name());
+            child.put("channelSpacing", ochSignal.channelSpacing().name());
+            child.put("spacingMultiplier", ochSignal.spacingMultiplier());
+            child.put("slotGranularity", ochSignal.slotGranularity());
+
+            return root;
         }
     }
 
diff --git a/core/common/src/test/java/org/onosproject/codec/impl/CriterionCodecTest.java b/core/common/src/test/java/org/onosproject/codec/impl/CriterionCodecTest.java
index 6b3d40a..919719c 100644
--- a/core/common/src/test/java/org/onosproject/codec/impl/CriterionCodecTest.java
+++ b/core/common/src/test/java/org/onosproject/codec/impl/CriterionCodecTest.java
@@ -26,6 +26,9 @@
 import org.onlab.packet.VlanId;
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
+import org.onosproject.net.ChannelSpacing;
+import org.onosproject.net.GridType;
+import org.onosproject.net.Lambda;
 import org.onosproject.net.OchSignalType;
 import org.onosproject.net.PortNumber;
 import org.onosproject.net.flow.criteria.Criteria;
@@ -406,8 +409,9 @@
      * Tests lambda criterion.
      */
     @Test
-    public void matchLambdaTest() {
-        Criterion criterion = Criteria.matchLambda((short) 40000);
+    public void matchOchSignal() {
+        Lambda ochSignal = Lambda.ochSignal(GridType.DWDM, ChannelSpacing.CHL_100GHZ, 4, 8);
+        Criterion criterion = Criteria.matchLambda(ochSignal);
         ObjectNode result = criterionCodec.encode(criterion, context);
         assertThat(result, matchesCriterion(criterion));
     }
diff --git a/core/common/src/test/java/org/onosproject/codec/impl/CriterionJsonMatcher.java b/core/common/src/test/java/org/onosproject/codec/impl/CriterionJsonMatcher.java
index df0f3c6..8233826 100644
--- a/core/common/src/test/java/org/onosproject/codec/impl/CriterionJsonMatcher.java
+++ b/core/common/src/test/java/org/onosproject/codec/impl/CriterionJsonMatcher.java
@@ -15,8 +15,10 @@
  */
 package org.onosproject.codec.impl;
 
+import com.google.common.base.Joiner;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeDiagnosingMatcher;
+import org.onosproject.net.OchSignal;
 import org.onosproject.net.flow.criteria.Criterion;
 
 import com.fasterxml.jackson.databind.JsonNode;
@@ -34,9 +36,9 @@
 import org.onosproject.net.flow.criteria.IcmpTypeCriterion;
 import org.onosproject.net.flow.criteria.Icmpv6CodeCriterion;
 import org.onosproject.net.flow.criteria.Icmpv6TypeCriterion;
-import org.onosproject.net.flow.criteria.LambdaCriterion;
 import org.onosproject.net.flow.criteria.MetadataCriterion;
 import org.onosproject.net.flow.criteria.MplsCriterion;
+import org.onosproject.net.flow.criteria.OchSignalCriterion;
 import org.onosproject.net.flow.criteria.OchSignalTypeCriterion;
 import org.onosproject.net.flow.criteria.PortCriterion;
 import org.onosproject.net.flow.criteria.SctpPortCriterion;
@@ -45,6 +47,8 @@
 import org.onosproject.net.flow.criteria.VlanIdCriterion;
 import org.onosproject.net.flow.criteria.VlanPcpCriterion;
 
+import java.util.Objects;
+
 /**
  * Hamcrest matcher for criterion objects.
  */
@@ -448,16 +452,29 @@
     }
 
     /**
-     * Matches a lambda criterion object.
+     * Matches an Och signal criterion object.
      *
      * @param criterion criterion to match
      * @return true if the JSON matches the criterion, false otherwise.
      */
-    private boolean matchCriterion(LambdaCriterion criterion) {
-        final int lambda = criterion.lambda();
-        final int jsonLambda = jsonCriterion.get("lambda").intValue();
-        if (lambda != jsonLambda) {
-            description.appendText("lambda was " + Integer.toString(lambda));
+    private boolean matchCriterion(OchSignalCriterion criterion) {
+        final OchSignal ochSignal = criterion.lambda();
+        final JsonNode jsonOchSignal = jsonCriterion.get("ochSignalId");
+        String jsonGridType = jsonOchSignal.get("gridType").textValue();
+        String jsonChannelSpacing = jsonOchSignal.get("channelSpacing").textValue();
+        int jsonSpacingMultiplier = jsonOchSignal.get("spacingMultiplier").intValue();
+        int jsonSlotGranularity = jsonOchSignal.get("slotGranularity").intValue();
+
+        boolean equality = Objects.equals(ochSignal.gridType().name(), jsonGridType)
+                && Objects.equals(ochSignal.channelSpacing().name(), jsonChannelSpacing)
+                && Objects.equals(ochSignal.spacingMultiplier(), jsonSpacingMultiplier)
+                && Objects.equals(ochSignal.slotGranularity(), jsonSlotGranularity);
+
+        if (!equality) {
+            String joined = Joiner.on(", ")
+                    .join(jsonGridType, jsonChannelSpacing, jsonSpacingMultiplier, jsonSlotGranularity);
+
+            description.appendText("och signal id was " + joined);
             return false;
         }
         return true;
@@ -572,7 +589,7 @@
                         (IPv6ExthdrFlagsCriterion) criterion);
 
             case OCH_SIGID:
-                return matchCriterion((LambdaCriterion) criterion);
+                return matchCriterion((OchSignalCriterion) criterion);
 
             case OCH_SIGTYPE:
                 return matchCriterion((OchSignalTypeCriterion) criterion);
diff --git a/core/common/src/test/java/org/onosproject/codec/impl/IntentCodecTest.java b/core/common/src/test/java/org/onosproject/codec/impl/IntentCodecTest.java
index 2c2e488..95866bf 100644
--- a/core/common/src/test/java/org/onosproject/codec/impl/IntentCodecTest.java
+++ b/core/common/src/test/java/org/onosproject/codec/impl/IntentCodecTest.java
@@ -27,9 +27,12 @@
 import org.onosproject.codec.JsonCodec;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.DefaultApplicationId;
+import org.onosproject.net.ChannelSpacing;
 import org.onosproject.net.ConnectPoint;
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.GridType;
 import org.onosproject.net.HostId;
+import org.onosproject.net.Lambda;
 import org.onosproject.net.NetTestTools;
 import org.onosproject.net.OchSignalType;
 import org.onosproject.net.PortNumber;
@@ -138,11 +141,12 @@
         DeviceId did1 = did("device1");
         DeviceId did2 = did("device2");
         DeviceId did3 = did("device3");
+        Lambda ochSignal = Lambda.ochSignal(GridType.DWDM, ChannelSpacing.CHL_100GHZ, 4, 8);
         final TrafficSelector selector = DefaultTrafficSelector.builder()
                 .matchIPProtocol((byte) 3)
                 .matchMplsLabel(MplsLabel.mplsLabel(4))
                 .add(Criteria.matchOchSignalType(OchSignalType.FIXED_GRID))
-                .matchLambda((short) 6)
+                .add(Criteria.matchLambda(ochSignal))
                 .matchEthDst(MacAddress.BROADCAST)
                 .matchIPDst(IpPrefix.valueOf("1.2.3.4/24"))
                 .build();