ONOS-1048 - Define interfaces instead of using IntentManager

- Define IntentProcessor interface containing methods to process an intent
- Pull out IntentCompiler related tasks to CompilerRegistry
- Pull out IntentInstaller related tasks to InstallerRegistry
- Create an IntentProcessor subclass as inner class in IntentManager

Change-Id: Ia3e8d574a1053e7ddc9b961873ef758c9e0b1b26
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/Compiling.java b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/Compiling.java
index b68230a..97ea18e 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/Compiling.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/Compiling.java
@@ -18,7 +18,7 @@
 import org.onosproject.net.intent.Intent;
 import org.onosproject.net.intent.IntentData;
 import org.onosproject.net.intent.IntentException;
-import org.onosproject.net.intent.impl.IntentManager;
+import org.onosproject.net.intent.impl.IntentProcessor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,13 +34,12 @@
 
     private static final Logger log = LoggerFactory.getLogger(Compiling.class);
 
-    // TODO: define an interface and use it, instead of IntentManager
-    private final IntentManager intentManager;
+    private final IntentProcessor processor;
     private final IntentData pending;
     private final IntentData current;
 
-    Compiling(IntentManager intentManager, IntentData pending, IntentData current) {
-        this.intentManager = checkNotNull(intentManager);
+    Compiling(IntentProcessor processor, IntentData pending, IntentData current) {
+        this.processor = checkNotNull(processor);
         this.pending = checkNotNull(pending);
         this.current = current;
     }
@@ -49,11 +48,12 @@
     public Optional<IntentProcessPhase> execute() {
         try {
             List<Intent> installables = (current != null) ? current.installables() : null;
-            pending.setInstallables(intentManager.compileIntent(pending.intent(), installables));
-            return Optional.of(new InstallCoordinating(intentManager, pending, current));
+            pending.setInstallables(processor.compile(pending.intent(), installables));
+            return Optional.of(new InstallCoordinating(processor, pending, current));
         } catch (IntentException e) {
             log.debug("Unable to compile intent {} due to: {}", pending.intent(), e);
             return Optional.of(new CompilingFailed(pending));
         }
     }
+
 }
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/InstallCoordinating.java b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/InstallCoordinating.java
index 5fd82ec..ef76888 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/InstallCoordinating.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/InstallCoordinating.java
@@ -18,7 +18,7 @@
 import org.onosproject.net.flow.FlowRuleOperations;
 import org.onosproject.net.intent.IntentData;
 import org.onosproject.net.intent.IntentException;
-import org.onosproject.net.intent.impl.IntentManager;
+import org.onosproject.net.intent.impl.IntentProcessor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,13 +34,13 @@
 
     private static final Logger log = LoggerFactory.getLogger(InstallCoordinating.class);
 
-    private final IntentManager intentManager;
+    private final IntentProcessor processor;
     private final IntentData pending;
     private final IntentData current;
 
     // TODO: define an interface and use it, instead of IntentManager
-    InstallCoordinating(IntentManager intentManager, IntentData pending, IntentData current) {
-        this.intentManager = checkNotNull(intentManager);
+    InstallCoordinating(IntentProcessor processor, IntentData pending, IntentData current) {
+        this.processor = checkNotNull(processor);
         this.pending = checkNotNull(pending);
         this.current = current;
     }
@@ -50,8 +50,8 @@
         try {
             //FIXME we orphan flow rules that are currently on the data plane
             // ... should either reuse them or remove them
-            FlowRuleOperations flowRules = intentManager.coordinate(current, pending);
-            return Optional.of(new Installing(intentManager, pending, flowRules));
+            FlowRuleOperations flowRules = processor.coordinate(current, pending);
+            return Optional.of(new Installing(processor, pending, flowRules));
         } catch (IntentException e) {
             log.warn("Unable to generate a FlowRuleOperations from intent {} due to:", pending.intent().id(), e);
             return Optional.of(new InstallingFailed(pending));
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/InstallRequest.java b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/InstallRequest.java
index e54b10a..90e0fd2 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/InstallRequest.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/InstallRequest.java
@@ -16,7 +16,7 @@
 package org.onosproject.net.intent.impl.phase;
 
 import org.onosproject.net.intent.IntentData;
-import org.onosproject.net.intent.impl.IntentManager;
+import org.onosproject.net.intent.impl.IntentProcessor;
 
 import java.util.Optional;
 
@@ -27,13 +27,12 @@
  */
 public final class InstallRequest implements IntentProcessPhase {
 
-    // TODO: define an interface and use it, instead of IntentManager
-    private final IntentManager intentManager;
+    private final IntentProcessor intentManager;
     private final IntentData pending;
     private final Optional<IntentData> current;
 
-    public InstallRequest(IntentManager intentManager, IntentData intentData, Optional<IntentData> current) {
-        this.intentManager = checkNotNull(intentManager);
+    public InstallRequest(IntentProcessor processor, IntentData intentData, Optional<IntentData> current) {
+        this.intentManager = checkNotNull(processor);
         this.pending = checkNotNull(intentData);
         this.current = checkNotNull(current);
     }
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/Installing.java b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/Installing.java
index 05c499f..3a290ae 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/Installing.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/Installing.java
@@ -18,7 +18,7 @@
 import org.onosproject.net.flow.FlowRuleOperations;
 import org.onosproject.net.intent.IntentData;
 import org.onosproject.net.intent.IntentException;
-import org.onosproject.net.intent.impl.IntentManager;
+import org.onosproject.net.intent.impl.IntentProcessor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,13 +34,12 @@
 
     private static final Logger log = LoggerFactory.getLogger(Installing.class);
 
-    private final IntentManager intentManager;
+    private final IntentProcessor processor;
     private final IntentData pending;
     private final FlowRuleOperations flowRules;
 
-    // TODO: define an interface and use it, instead of IntentManager
-    Installing(IntentManager intentManager, IntentData pending, FlowRuleOperations flowRules) {
-        this.intentManager = checkNotNull(intentManager);
+    Installing(IntentProcessor processor, IntentData pending, FlowRuleOperations flowRules) {
+        this.processor = checkNotNull(processor);
         this.pending = checkNotNull(pending);
         this.flowRules = flowRules;
     }
@@ -48,7 +47,7 @@
     @Override
     public Optional<IntentProcessPhase> execute() {
         try {
-            intentManager.flowRuleService.apply(flowRules); // FIXME we need to provide a context
+            processor.applyFlowRules(flowRules);
             return Optional.of(new Installed(pending));
         // What kinds of exceptions are thrown by FlowRuleService.apply()?
         // Is IntentException a correct exception abstraction?
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/WithdrawCoordinating.java b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/WithdrawCoordinating.java
index 24d6dd5..ee854c8 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/WithdrawCoordinating.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/WithdrawCoordinating.java
@@ -18,7 +18,7 @@
 import org.onosproject.net.flow.FlowRuleOperations;
 import org.onosproject.net.intent.IntentData;
 import org.onosproject.net.intent.IntentException;
-import org.onosproject.net.intent.impl.IntentManager;
+import org.onosproject.net.intent.impl.IntentProcessor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,13 +34,12 @@
 
     private static final Logger log = LoggerFactory.getLogger(WithdrawCoordinating.class);
 
-    // TODO: define an interface and use it, instead of IntentManager
-    private final IntentManager intentManager;
+    private final IntentProcessor processor;
     private final IntentData pending;
     private final IntentData current;
 
-    WithdrawCoordinating(IntentManager intentManager, IntentData pending, IntentData current) {
-        this.intentManager = checkNotNull(intentManager);
+    WithdrawCoordinating(IntentProcessor processor, IntentData pending, IntentData current) {
+        this.processor = checkNotNull(processor);
         this.pending = checkNotNull(pending);
         this.current = checkNotNull(current);
     }
@@ -49,9 +48,9 @@
     public Optional<IntentProcessPhase> execute() {
         try {
             // Note: current.installables() are not null or empty due to createIntentUpdate check
-            FlowRuleOperations flowRules = intentManager.uninstallCoordinate(current, pending);
+            FlowRuleOperations flowRules = processor.uninstallCoordinate(current, pending);
             pending.setInstallables(current.installables());
-            return Optional.of(new Withdrawing(intentManager, pending, flowRules));
+            return Optional.of(new Withdrawing(processor, pending, flowRules));
         } catch (IntentException e) {
             log.warn("Unable to generate generate a FlowRuleOperations from intent {} due to:", pending.intent(), e);
             return Optional.of(new WithdrawingFailed(pending));
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/WithdrawRequest.java b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/WithdrawRequest.java
index bbc7f34..f2e120f 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/WithdrawRequest.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/WithdrawRequest.java
@@ -16,7 +16,7 @@
 package org.onosproject.net.intent.impl.phase;
 
 import org.onosproject.net.intent.IntentData;
-import org.onosproject.net.intent.impl.IntentManager;
+import org.onosproject.net.intent.impl.IntentProcessor;
 
 import java.util.Optional;
 
@@ -27,13 +27,12 @@
  */
 public final class WithdrawRequest implements IntentProcessPhase {
 
-    // TODO: define an interface and use it, instead of IntentManager
-    private final IntentManager intentManager;
+    private final IntentProcessor processor;
     private final IntentData pending;
     private final IntentData current;
 
-    public WithdrawRequest(IntentManager intentManager, IntentData intentData, IntentData current) {
-        this.intentManager = checkNotNull(intentManager);
+    public WithdrawRequest(IntentProcessor processor, IntentData intentData, IntentData current) {
+        this.processor = checkNotNull(processor);
         this.pending = checkNotNull(intentData);
         this.current = checkNotNull(current);
     }
@@ -43,6 +42,6 @@
         //TODO perhaps we want to validate that the pending and current are the
         // same version i.e. they are the same
         // Note: this call is not just the symmetric version of submit
-        return Optional.of(new WithdrawCoordinating(intentManager, pending, current));
+        return Optional.of(new WithdrawCoordinating(processor, pending, current));
     }
 }
diff --git a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/Withdrawing.java b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/Withdrawing.java
index 676c3c7..9198d0e 100644
--- a/core/net/src/main/java/org/onosproject/net/intent/impl/phase/Withdrawing.java
+++ b/core/net/src/main/java/org/onosproject/net/intent/impl/phase/Withdrawing.java
@@ -17,7 +17,7 @@
 
 import org.onosproject.net.flow.FlowRuleOperations;
 import org.onosproject.net.intent.IntentData;
-import org.onosproject.net.intent.impl.IntentManager;
+import org.onosproject.net.intent.impl.IntentProcessor;
 
 import java.util.Optional;
 
@@ -29,20 +29,19 @@
  */
 class Withdrawing implements IntentProcessPhase {
 
-    // TODO: define an interface and use it, instead of IntentManager
-    private final IntentManager intentManager;
+    private final IntentProcessor processor;
     private final IntentData pending;
     private final FlowRuleOperations flowRules;
 
-    Withdrawing(IntentManager intentManager, IntentData pending, FlowRuleOperations flowRules) {
-        this.intentManager = checkNotNull(intentManager);
+    Withdrawing(IntentProcessor processor, IntentData pending, FlowRuleOperations flowRules) {
+        this.processor = checkNotNull(processor);
         this.pending = checkNotNull(pending);
         this.flowRules = checkNotNull(flowRules);
     }
 
     @Override
     public Optional<IntentProcessPhase> execute() {
-        intentManager.flowRuleService.apply(flowRules);
+        processor.applyFlowRules(flowRules);
         return Optional.of(new Withdrawn(pending));
     }
 }