adding support of WCMP weights to Next Objective

Change-Id: Id8f9a4222d0d9d98995f727dbfbf467ab2104468
diff --git a/core/api/src/main/java/org/onosproject/net/flowobjective/DefaultNextTreatment.java b/core/api/src/main/java/org/onosproject/net/flowobjective/DefaultNextTreatment.java
index 4387b56..554be28 100644
--- a/core/api/src/main/java/org/onosproject/net/flowobjective/DefaultNextTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flowobjective/DefaultNextTreatment.java
@@ -22,13 +22,15 @@
 import static com.google.common.base.MoreObjects.toStringHelper;
 
 /**
- * Represents a next action specified by traffic treatment.
+ * Represents a next action specified by traffic treatment and weight.
  */
 public final class DefaultNextTreatment implements NextTreatment {
     private final TrafficTreatment treatment;
+    private final int weight;
 
-    private DefaultNextTreatment(TrafficTreatment treatment) {
+    private DefaultNextTreatment(TrafficTreatment treatment, int weight) {
         this.treatment = treatment;
+        this.weight = weight;
     }
 
     /**
@@ -47,7 +49,23 @@
      * @return an instance of DefaultNextTreatment
      */
     public static DefaultNextTreatment of(TrafficTreatment treatment) {
-        return new DefaultNextTreatment(treatment);
+        return new DefaultNextTreatment(treatment, DEFAULT_WEIGHT);
+    }
+
+    /**
+     * Returns an instance of DefaultNextTreatment with given traffic treatment and weight.
+     *
+     * @param treatment traffic treatment
+     * @param weight the weight of next treatment
+     * @return an instance of DefaultNextTreatment
+     */
+    public static DefaultNextTreatment of(TrafficTreatment treatment, int weight) {
+        return new DefaultNextTreatment(treatment, weight);
+    }
+
+    @Override
+    public int weight() {
+        return weight;
     }
 
     @Override
@@ -57,7 +75,7 @@
 
     @Override
     public int hashCode() {
-        return Objects.hash(treatment);
+        return Objects.hash(treatment, weight);
     }
 
     @Override
@@ -67,7 +85,7 @@
         }
         if (obj instanceof DefaultNextTreatment) {
             final DefaultNextTreatment other = (DefaultNextTreatment) obj;
-            return Objects.equals(this.treatment, other.treatment);
+            return Objects.equals(this.treatment, other.treatment) && Objects.equals(this.weight, other.weight);
         }
         return false;
     }
@@ -76,6 +94,7 @@
     public String toString() {
         return toStringHelper(this)
                 .add("treatment", treatment)
+                .add("weight", weight)
                 .toString();
     }
 }
diff --git a/core/api/src/main/java/org/onosproject/net/flowobjective/IdNextTreatment.java b/core/api/src/main/java/org/onosproject/net/flowobjective/IdNextTreatment.java
index 98a8928..8b47361 100644
--- a/core/api/src/main/java/org/onosproject/net/flowobjective/IdNextTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flowobjective/IdNextTreatment.java
@@ -24,14 +24,17 @@
  */
 public final class IdNextTreatment implements NextTreatment {
     private final int nextId;
+    private final int weight;
 
     /**
      * Constructs IdNextTreatment.
      *
      * @param nextId next id
+     * @param weight weight
      */
-    private IdNextTreatment(int nextId) {
+    private IdNextTreatment(int nextId, int weight) {
         this.nextId = nextId;
+        this.weight = weight;
     }
 
     /**
@@ -50,7 +53,22 @@
      * @return an instance of IdNextTreatment
      */
     public static IdNextTreatment of(int nextId) {
-        return new IdNextTreatment(nextId);
+        return new IdNextTreatment(nextId, DEFAULT_WEIGHT);
+    }
+    /**
+     * Returns an instance of IdNextTreatment with given next id and weight.
+     *
+     * @param nextId next id
+     * @param weight weight
+     * @return an instance of IdNextTreatment
+     */
+    public static IdNextTreatment of(int nextId, int weight) {
+        return new IdNextTreatment(nextId, weight);
+    }
+
+    @Override
+    public int weight() {
+        return weight;
     }
 
     @Override
@@ -59,7 +77,7 @@
     }
     @Override
     public int hashCode() {
-        return Objects.hash(nextId);
+        return Objects.hash(nextId, weight);
     }
 
     @Override
@@ -69,7 +87,7 @@
         }
         if (obj instanceof IdNextTreatment) {
             final IdNextTreatment other = (IdNextTreatment) obj;
-            return this.nextId == other.nextId;
+            return this.nextId == other.nextId && this.weight == other.weight;
         }
         return false;
     }
@@ -78,6 +96,7 @@
     public String toString() {
         return toStringHelper(this)
                 .add("nextId", nextId)
+                .add("weight", weight)
                 .toString();
     }
 }
diff --git a/core/api/src/main/java/org/onosproject/net/flowobjective/NextTreatment.java b/core/api/src/main/java/org/onosproject/net/flowobjective/NextTreatment.java
index af849a2..cdeff98 100644
--- a/core/api/src/main/java/org/onosproject/net/flowobjective/NextTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flowobjective/NextTreatment.java
@@ -19,6 +19,7 @@
  * Represents next action in the NextObjective.
  */
 public interface NextTreatment {
+    int DEFAULT_WEIGHT = 1;
     /**
      * Types of next action.
      */
@@ -40,4 +41,10 @@
      * @return type
      */
     Type type();
+    /**
+     * weight of this next action.
+     *
+     * @return weight
+     */
+    int weight();
 }