DefaultTrafficTreatment: Build all-instructions list at creation time
so that we don't have to join the two lists each time we want to see all instructions

Change-Id: I7f1ad252776abcb6768372eeaabfa661bdded36c
diff --git a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
index da3cac6..bba3e91 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/DefaultTrafficTreatment.java
@@ -41,6 +41,7 @@
 
     private final List<Instruction> immediate;
     private final List<Instruction> deferred;
+    private final List<Instruction> all;
     private final Instructions.TableTypeTransition table;
 
     private final boolean hasClear;
@@ -51,21 +52,31 @@
     /**
      * Creates a new traffic treatment from the specified list of instructions.
      *
-     * @param instructions treatment instructions
+     * @param immediate immediate instructions
      */
-    private DefaultTrafficTreatment(List<Instruction> instructions) {
-        this.immediate = ImmutableList.copyOf(checkNotNull(instructions));
+    private DefaultTrafficTreatment(List<Instruction> immediate) {
+        this.immediate = ImmutableList.copyOf(checkNotNull(immediate));
         this.deferred = ImmutableList.of();
+        this.all = this.immediate;
         this.hasClear = false;
         this.table = null;
     }
 
+    /**
+     * Creates a new traffic treatment from the specified list of instructions.
+     *
+     * @param deferred deferred instructions
+     * @param immediate immediate instructions
+     * @param table table transition instruction
+     * @param clear instruction to clear the deferred actions list
+     */
     private DefaultTrafficTreatment(List<Instruction> deferred,
                                    List<Instruction> immediate,
                                    Instructions.TableTypeTransition table,
                                    boolean clear) {
         this.immediate = ImmutableList.copyOf(checkNotNull(immediate));
         this.deferred = ImmutableList.copyOf(checkNotNull(deferred));
+        this.all = ListUtils.union(this.immediate, this.deferred);
         this.table = table;
         this.hasClear = clear;
 
@@ -83,7 +94,7 @@
 
     @Override
     public List<Instruction> allInstructions() {
-        return ListUtils.union(immediate, deferred);
+        return all;
     }
 
     @Override
@@ -92,7 +103,7 @@
     }
 
     @Override
-    public Boolean clearedDeferred() {
+    public boolean clearedDeferred() {
         return hasClear;
     }
 
@@ -162,8 +173,6 @@
      */
     public static final class Builder implements TrafficTreatment.Builder {
 
-        boolean drop = false;
-
         boolean clear = false;
 
         Instructions.TableTypeTransition table;
@@ -179,11 +188,14 @@
         }
 
         // Creates a new builder based off an existing treatment
-        //FIXME only works for immediate instruction sets.
         private Builder(TrafficTreatment treatment) {
-            for (Instruction instruction : treatment.immediate()) {
-                add(instruction);
-            }
+            deferred();
+            treatment.deferred().forEach(i -> add(i));
+
+            immediate();
+            treatment.immediate().forEach(i -> add(i));
+
+            clear = treatment.clearedDeferred();
         }
 
         @Override