default single table pipeline supports filtering objectives

Change-Id: Idff7720b478e1c36e541d698768dbf8c4cc49d8c
diff --git a/drivers/default/src/main/java/org/onosproject/driver/pipeline/DefaultSingleTablePipeline.java b/drivers/default/src/main/java/org/onosproject/driver/pipeline/DefaultSingleTablePipeline.java
index d42650f..7e22501 100644
--- a/drivers/default/src/main/java/org/onosproject/driver/pipeline/DefaultSingleTablePipeline.java
+++ b/drivers/default/src/main/java/org/onosproject/driver/pipeline/DefaultSingleTablePipeline.java
@@ -21,6 +21,7 @@
 import org.onosproject.net.behaviour.PipelinerContext;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.onosproject.net.flow.DefaultFlowRule;
+import org.onosproject.net.flow.DefaultTrafficSelector;
 import org.onosproject.net.flow.DefaultTrafficTreatment;
 import org.onosproject.net.flow.FlowRule;
 import org.onosproject.net.flow.FlowRuleOperations;
@@ -32,6 +33,7 @@
 import org.onosproject.net.flowobjective.FilteringObjective;
 import org.onosproject.net.flowobjective.ForwardingObjective;
 import org.onosproject.net.flowobjective.NextObjective;
+import org.onosproject.net.flowobjective.Objective;
 import org.onosproject.net.flowobjective.ObjectiveError;
 import org.slf4j.Logger;
 
@@ -57,12 +59,53 @@
     }
 
     @Override
-    public void filter(FilteringObjective filter) {}
+    public void filter(FilteringObjective filter) {
+
+        TrafficTreatment.Builder actions;
+        switch (filter.type()) {
+            case PERMIT:
+                actions = (filter.meta() == null) ?
+                        DefaultTrafficTreatment.builder().punt() :
+                        DefaultTrafficTreatment.builder(filter.meta());
+                break;
+            case DENY:
+                actions = (filter.meta() == null) ?
+                        DefaultTrafficTreatment.builder() :
+                        DefaultTrafficTreatment.builder(filter.meta());
+                actions.drop();
+                break;
+            default:
+                log.warn("Unknown filter type: {}", filter.type());
+                actions = DefaultTrafficTreatment.builder().drop();
+        }
+
+        TrafficSelector.Builder selector = DefaultTrafficSelector.builder();
+
+        filter.conditions().stream().forEach(selector::add);
+
+        if (filter.key() != null) {
+            selector.add(filter.key());
+        }
+
+        FlowRule.Builder ruleBuilder = DefaultFlowRule.builder()
+                .forDevice(deviceId)
+                .withSelector(selector.build())
+                .withTreatment(actions.build())
+                .fromApp(filter.appId())
+                .withPriority(filter.priority());
+
+        if (filter.permanent()) {
+            ruleBuilder.makePermanent();
+        } else {
+            ruleBuilder.makeTemporary(filter.timeout());
+        }
+
+        installObjective(ruleBuilder, filter);
+
+    }
 
     @Override
     public void forward(ForwardingObjective fwd) {
-        FlowRuleOperations.Builder flowBuilder = FlowRuleOperations.builder();
-
         if (fwd.flag() != ForwardingObjective.Flag.VERSATILE) {
             throw new UnsupportedOperationException(
                     "Only VERSATILE is supported.");
@@ -92,8 +135,13 @@
             ruleBuilder.makeTemporary(fwd.timeout());
         }
 
+        installObjective(ruleBuilder, fwd);
 
-        switch (fwd.op()) {
+    }
+
+    private void installObjective(FlowRule.Builder ruleBuilder, Objective objective) {
+        FlowRuleOperations.Builder flowBuilder = FlowRuleOperations.builder();
+        switch (objective.op()) {
 
             case ADD:
                 flowBuilder.add(ruleBuilder.build());
@@ -102,28 +150,28 @@
                 flowBuilder.remove(ruleBuilder.build());
                 break;
             default:
-                log.warn("Unknown operation {}", fwd.op());
+                log.warn("Unknown operation {}", objective.op());
         }
 
         flowRuleService.apply(flowBuilder.build(new FlowRuleOperationsContext() {
             @Override
             public void onSuccess(FlowRuleOperations ops) {
-                if (fwd.context().isPresent()) {
-                    fwd.context().get().onSuccess(fwd);
+                if (objective.context().isPresent()) {
+                    objective.context().get().onSuccess(objective);
                 }
             }
 
             @Override
             public void onError(FlowRuleOperations ops) {
-                if (fwd.context().isPresent()) {
-                    fwd.context().get().onError(fwd, ObjectiveError.FLOWINSTALLATIONFAILED);
+                if (objective.context().isPresent()) {
+                    objective.context().get().onError(objective, ObjectiveError.FLOWINSTALLATIONFAILED);
                 }
             }
         }));
-
     }
 
     @Override
-    public void next(NextObjective nextObjective) {}
+    public void next(NextObjective nextObjective) {
+    }
 
 }