ONOS-7050 First stab at PI translation store

Change-Id: I7f48802b1f5d70fbe3e6cead2800855de18b9207
diff --git a/core/net/src/main/java/org/onosproject/net/pi/impl/PiTranslationServiceImpl.java b/core/net/src/main/java/org/onosproject/net/pi/impl/PiTranslationServiceImpl.java
index 3cb0a09..b6d90f0 100644
--- a/core/net/src/main/java/org/onosproject/net/pi/impl/PiTranslationServiceImpl.java
+++ b/core/net/src/main/java/org/onosproject/net/pi/impl/PiTranslationServiceImpl.java
@@ -28,12 +28,17 @@
 import org.onosproject.net.flow.FlowRule;
 import org.onosproject.net.group.Group;
 import org.onosproject.net.pi.model.PiPipeconf;
+import org.onosproject.net.pi.model.PiPipeconfId;
 import org.onosproject.net.pi.runtime.PiActionGroup;
 import org.onosproject.net.pi.runtime.PiTableEntry;
+import org.onosproject.net.pi.service.PiTranslatable;
 import org.onosproject.net.pi.service.PiTranslationService;
+import org.onosproject.net.pi.service.PiTranslationStore;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Optional;
+
 /**
  * Implementation of the protocol-independent translation service.
  */
@@ -48,6 +53,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected DeviceService deviceService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    private PiTranslationStore translationStore;
+
     @Activate
     public void activate() {
         log.info("Started");
@@ -59,19 +67,43 @@
     }
 
     @Override
-    public PiTableEntry translateFlowRule(FlowRule rule, PiPipeconf pipeconf) throws PiTranslationException {
-        return PiFlowRuleTranslator.translate(rule, pipeconf, getDevice(rule.deviceId()));
+    public PiTableEntry translate(FlowRule rule, PiPipeconf pipeconf)
+            throws PiTranslationException {
+        final PiTableEntry piTableEntry = PiFlowRuleTranslator
+                .translate(rule, pipeconf, getDevice(rule.deviceId()));
+        translationStore.addOrUpdate(rule, piTableEntry, pipeconf.id());
+        return piTableEntry;
     }
 
     @Override
-    public PiActionGroup translateGroup(Group group, PiPipeconf pipeconf) throws PiTranslationException {
-        return PiGroupTranslator.translate(group, pipeconf, getDevice(group.deviceId()));
+    public Optional<FlowRule> lookup(PiTableEntry piTableEntry,
+                                     PiPipeconfId pipeconfId) {
+        final PiTranslatable original = translationStore
+                .lookup(piTableEntry, pipeconfId);
+        return original == null
+                ? Optional.empty()
+                : Optional.of((FlowRule) original);
+    }
+
+    @Override
+    public PiActionGroup translate(Group group, PiPipeconf pipeconf)
+            throws PiTranslationException {
+        return PiGroupTranslator.translate(group, pipeconf,
+                                           getDevice(group.deviceId()));
+    }
+
+    @Override
+    public Optional<Group> lookup(PiActionGroup piActionGroup,
+                                  PiPipeconfId pipeconfId) {
+        // TODO: implement learning and lookup of groups
+        return Optional.empty();
     }
 
     private Device getDevice(DeviceId deviceId) throws PiTranslationException {
         final Device device = deviceService.getDevice(deviceId);
         if (device == null) {
-            throw new PiTranslationException("Unable to get device " + deviceId);
+            throw new PiTranslationException(
+                    "Unable to get device " + deviceId);
         }
         return device;
     }