REST API to create flows

Change-Id: I5d001782249c0eab249d7aa857ae465da95b5955
diff --git a/core/common/src/main/java/org/onosproject/codec/impl/TrafficSelectorCodec.java b/core/common/src/main/java/org/onosproject/codec/impl/TrafficSelectorCodec.java
index 29b1969..eea9fae 100644
--- a/core/common/src/main/java/org/onosproject/codec/impl/TrafficSelectorCodec.java
+++ b/core/common/src/main/java/org/onosproject/codec/impl/TrafficSelectorCodec.java
@@ -15,11 +15,15 @@
  */
 package org.onosproject.codec.impl;
 
+import java.util.stream.IntStream;
+
 import org.onosproject.codec.CodecContext;
 import org.onosproject.codec.JsonCodec;
+import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.criteria.Criterion;
 
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
@@ -29,12 +33,14 @@
  * Traffic selector codec.
  */
 public final class TrafficSelectorCodec extends JsonCodec<TrafficSelector> {
+    private static final String CRITERIA = "criteria";
+
     @Override
     public ObjectNode encode(TrafficSelector selector, CodecContext context) {
         checkNotNull(selector, "Traffic selector cannot be null");
 
         final ObjectNode result = context.mapper().createObjectNode();
-        final ArrayNode jsonCriteria = result.putArray("criteria");
+        final ArrayNode jsonCriteria = result.putArray(CRITERIA);
 
         if (selector.criteria() != null) {
             final JsonCodec<Criterion> criterionCodec =
@@ -46,4 +52,20 @@
 
         return result;
     }
+
+    @Override
+    public TrafficSelector decode(ObjectNode json, CodecContext context) {
+        final JsonCodec<Criterion> criterionCodec =
+                context.codec(Criterion.class);
+
+        JsonNode criteriaJson = json.get(CRITERIA);
+        TrafficSelector.Builder builder = DefaultTrafficSelector.builder();
+        if (criteriaJson != null) {
+            IntStream.range(0, criteriaJson.size())
+                    .forEach(i -> builder.add(
+                            criterionCodec.decode((ObjectNode) criteriaJson.get(i),
+                                    context)));
+        }
+        return builder.build();
+    }
 }