fixes for Meter Service

Change-Id: I83d5b8a2e0a955c050f7afe96761d5709d4f9f18
diff --git a/core/api/src/main/java/org/onosproject/net/meter/DefaultBand.java b/core/api/src/main/java/org/onosproject/net/meter/DefaultBand.java
index a3a4fc2..58a2476 100644
--- a/core/api/src/main/java/org/onosproject/net/meter/DefaultBand.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/DefaultBand.java
@@ -15,6 +15,7 @@
  */
 package org.onosproject.net.meter;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkArgument;
 
 /**
@@ -24,13 +25,14 @@
 
     private final Type type;
     private final long rate;
-    private final long burstSize;
-    private final short prec;
+    //TODO: should be made optional
+    private final Long burstSize;
+    private final Short prec;
     private long packets;
     private long bytes;
 
     public DefaultBand(Type type, long rate,
-                       long burstSize, short prec) {
+                       Long burstSize, Short prec) {
         this.type = type;
         this.rate = rate;
         this.burstSize = burstSize;
@@ -77,6 +79,15 @@
         this.bytes = bytes;
     }
 
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("rate", rate)
+                .add("burst-size", burstSize)
+                .add("type", type)
+                .add("drop-precedence", prec).toString();
+    }
+
     public static Builder builder() {
         return new Builder();
     }
@@ -84,7 +95,7 @@
     public static final class Builder implements Band.Builder {
 
         private long rate;
-        private long burstSize;
+        private Long burstSize;
         private Short prec;
         private Type type;
 
@@ -114,7 +125,7 @@
 
         @Override
         public DefaultBand build() {
-            checkArgument(prec != null && type == Type.REMARK,
+            checkArgument(type != Type.REMARK && prec == null,
                           "Only REMARK bands can have a precendence.");
 
             return new DefaultBand(type, rate, burstSize, prec);
diff --git a/core/api/src/main/java/org/onosproject/net/meter/DefaultMeter.java b/core/api/src/main/java/org/onosproject/net/meter/DefaultMeter.java
index 611a23e..ab6b444 100644
--- a/core/api/src/main/java/org/onosproject/net/meter/DefaultMeter.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/DefaultMeter.java
@@ -15,12 +15,13 @@
  */
 package org.onosproject.net.meter;
 
+import com.google.common.collect.ImmutableSet;
 import org.onosproject.core.ApplicationId;
 import org.onosproject.net.DeviceId;
 
 import java.util.Collection;
-import java.util.Collections;
 
+import static com.google.common.base.MoreObjects.toStringHelper;
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
@@ -138,6 +139,18 @@
         this.bytes = bytes;
     }
 
+    @Override
+    public String toString() {
+        return toStringHelper(this)
+                .add("device", deviceId)
+                .add("id", id)
+                .add("appId", appId.name())
+                .add("unit", unit)
+                .add("isBurst", burst)
+                .add("state", state)
+                .add("bands", bands).toString();
+    }
+
     public static final class Builder implements Meter.Builder {
 
         private MeterId id;
@@ -155,8 +168,8 @@
         }
 
         @Override
-        public Meter.Builder withId(long id) {
-            this.id = MeterId.meterId(id);
+        public Meter.Builder withId(MeterId id) {
+            this.id = id;
             return this;
         }
 
@@ -180,7 +193,7 @@
 
         @Override
         public Meter.Builder withBands(Collection<Band> bands) {
-            this.bands = Collections.unmodifiableCollection(bands);
+            this.bands = ImmutableSet.copyOf(bands);
             return this;
         }
 
diff --git a/core/api/src/main/java/org/onosproject/net/meter/Meter.java b/core/api/src/main/java/org/onosproject/net/meter/Meter.java
index 5181c92..8ea04b0 100644
--- a/core/api/src/main/java/org/onosproject/net/meter/Meter.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/Meter.java
@@ -130,10 +130,10 @@
         /**
          * Assigns the id to this meter.
          *
-         * @param id a long
+         * @param id a meter id
          * @return this
          */
-        Builder withId(long id);
+        Builder withId(MeterId id);
 
         /**
          * Assigns the application that built this meter.
diff --git a/core/api/src/main/java/org/onosproject/net/meter/MeterId.java b/core/api/src/main/java/org/onosproject/net/meter/MeterId.java
index f479ac5..872de2d 100644
--- a/core/api/src/main/java/org/onosproject/net/meter/MeterId.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterId.java
@@ -32,7 +32,7 @@
     public static final MeterId ALL = new MeterId(0xFFFFFFFF);
 
     private MeterId(long id) {
-        checkArgument(id <= MAX, "id cannot be larger than 0xFFFF0000");
+        checkArgument(id >= MAX, "id cannot be larger than 0xFFFF0000");
         this.id = id;
     }
 
@@ -65,6 +65,11 @@
         return Long.hashCode(id);
     }
 
+    @Override
+    public String toString() {
+        return Long.toHexString(this.id);
+    }
+
     public static MeterId meterId(long id) {
         return new MeterId(id);
 
diff --git a/core/api/src/main/java/org/onosproject/net/meter/MeterService.java b/core/api/src/main/java/org/onosproject/net/meter/MeterService.java
index eaa2a50..31aa17f 100644
--- a/core/api/src/main/java/org/onosproject/net/meter/MeterService.java
+++ b/core/api/src/main/java/org/onosproject/net/meter/MeterService.java
@@ -17,6 +17,8 @@
 
 import org.onosproject.event.ListenerService;
 
+import java.util.Collection;
+
 /**
  * Service for add/updating and removing meters. Meters are
  * are assigned to flow to rate limit them and provide a certain
@@ -55,6 +57,13 @@
     Meter getMeter(MeterId id);
 
     /**
+     * Fetches all the meters.
+     *
+     * @return a collection of meters
+     */
+    Collection<Meter> getAllMeters();
+
+    /**
      * Allocate a meter id which must be used to create the meter.
      *
      * @return a meter id