Refactored cross connect helpers to optical drivers package.

Change-Id: Iae23025cf0b33c51123911f3ff1249cabc812be2
diff --git a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/CrossConnect.java b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/CrossConnect.java
deleted file mode 100644
index cd397ba..0000000
--- a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/CrossConnect.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.drivers.lumentum;
-
-import org.onosproject.net.OchSignal;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.flow.FlowRule;
-
-/**
- * Interface for cross connects as common in optical networking.
- */
-public interface CrossConnect extends FlowRule {
-    /**
-     * Returns the add/drop port of the cross connect.
-     *
-     * @return port number
-     */
-    PortNumber addDrop();
-
-    /**
-     * Returns the wavelength of the cross connect.
-     *
-     * @return OCh signal
-     */
-    OchSignal ochSignal();
-
-    /**
-     * Returns true if cross connect is adding traffic.
-     *
-     * @return true if add rule, false if drop rule
-     */
-    boolean isAddRule();
-}
diff --git a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/CrossConnectCache.java b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/CrossConnectCache.java
deleted file mode 100644
index ca2aa87..0000000
--- a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/CrossConnectCache.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.drivers.lumentum;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.onosproject.net.flow.FlowId;
-
-/**
- * Simple interface to cache flow ID and priority of cross connect flows.
- */
-interface CrossConnectCache {
-    /**
-     * Returns the flow ID and priority corresponding to the flow hash.
-     *
-     * @param hash flow hash
-     * @return flow ID and priority, null if not in cache
-     */
-    Pair<FlowId, Integer> get(int hash);
-
-    /**
-     * Stores the flow ID and priority corresponding to the flow hash.
-     *
-     * @param hash flow hash
-     * @param flowId flow ID
-     * @param priority flow priority
-     */
-    void set(int hash, FlowId flowId, int priority);
-
-    /**
-     * Removes the given hash from the cache.
-     *
-     * @param hash flow hash
-     */
-    void remove(int hash);
-}
diff --git a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/CrossConnectFlowRule.java b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/CrossConnectFlowRule.java
deleted file mode 100644
index 56cceef..0000000
--- a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/CrossConnectFlowRule.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.drivers.lumentum;
-
-import org.onosproject.net.OchSignal;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.flow.DefaultFlowRule;
-import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.criteria.Criterion;
-import org.onosproject.net.flow.criteria.OchSignalCriterion;
-import org.onosproject.net.flow.criteria.OchSignalTypeCriterion;
-import org.onosproject.net.flow.criteria.PortCriterion;
-import org.onosproject.net.flow.instructions.Instruction;
-import org.onosproject.net.flow.instructions.Instructions;
-
-import java.util.List;
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-/**
- * Cross connect abstraction based on a flow rule.
- */
-public class CrossConnectFlowRule extends DefaultFlowRule implements CrossConnect {
-    private PortNumber addDrop;
-    private OchSignal ochSignal;
-    private boolean isAddRule;
-
-    public CrossConnectFlowRule(FlowRule rule, List<PortNumber> linePorts) {
-        super(rule);
-
-        Set<Criterion> criteria = rule.selector().criteria();
-        List<Instruction> instructions = rule.treatment().immediate();
-
-        // Proper cross connect has criteria for input port, OChSignal and OCh signal type.
-        // Instruction must be output to port.
-        checkArgument(criteria.size() == 3, "Wrong size of flow rule criteria for cross connect.");
-        checkArgument(instructions.size() == 1, "Wrong size of flow rule instructions for cross connect.");
-        // FIXME: Ensure criteria has exactly one of each match type
-        criteria.forEach(
-                c -> checkArgument(c instanceof OchSignalCriterion ||
-                        c instanceof OchSignalTypeCriterion ||
-                        c instanceof PortCriterion,
-                        "Incompatible flow rule criteria for cross connect: " + criteria
-                )
-        );
-        checkArgument(instructions.get(0).type() == Instruction.Type.OUTPUT,
-                "Incompatible flow rule instructions for cross connect: " + instructions);
-
-        ochSignal = criteria.stream()
-                .filter(c -> c instanceof OchSignalCriterion)
-                .map(c -> ((OchSignalCriterion) c).lambda())
-                .findAny()
-                .orElse(null);
-
-        // Add or drop rule?
-        Instructions.OutputInstruction outInstruction = (Instructions.OutputInstruction) instructions.get(0);
-        if (linePorts.contains(outInstruction.port())) {
-            addDrop = criteria.stream()
-                    .filter(c -> c instanceof PortCriterion)
-                    .map(c -> ((PortCriterion) c).port())
-                    .findAny()
-                    .orElse(null);
-            isAddRule = true;
-        } else {
-            addDrop = outInstruction.port();
-            isAddRule = false;
-        }
-    }
-
-    @Override
-    public PortNumber addDrop() {
-        return addDrop;
-    }
-
-    @Override
-    public OchSignal ochSignal() {
-        return ochSignal;
-    }
-
-    @Override
-    public boolean isAddRule() {
-        return isAddRule;
-    }
-}
diff --git a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/DefaultCrossConnectCache.java b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/DefaultCrossConnectCache.java
deleted file mode 100644
index 032ddbc..0000000
--- a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/DefaultCrossConnectCache.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onosproject.drivers.lumentum;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Service;
-import org.onosproject.net.flow.FlowId;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Simple implementation of a local flow rule cache that stores the flow ID and priority.
- *
- * Use this if you have a device that does not allow you to store these fields.
- *
- * WARNING: Be aware that this implementation makes no attempt to use a distributed store
- * for the cache, so do not rely on it to support fail-over in multi-instance deployments.
- * If the instance which holds the cache goes down, you *will* be in trouble.
- */
-@Component(immediate = true, enabled = true)
-@Service
-public class DefaultCrossConnectCache implements CrossConnectCache {
-    private final Map<Integer, Pair<FlowId, Integer>> cache = new HashMap<>();
-
-    @Override
-    public Pair<FlowId, Integer> get(int hash) {
-        return cache.get(hash);
-    }
-
-    @Override
-    public void set(int hash, FlowId flowId, int priority) {
-        cache.put(hash, Pair.of(flowId, priority));
-    }
-
-    @Override
-    public void remove(int hash) {
-        cache.remove(hash);
-    }
-}
diff --git a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumSdnRoadmFlowRuleProgrammable.java b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumSdnRoadmFlowRuleProgrammable.java
index 7dde491..840fc99 100644
--- a/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumSdnRoadmFlowRuleProgrammable.java
+++ b/drivers/lumentum/src/main/java/org/onosproject/drivers/lumentum/LumentumSdnRoadmFlowRuleProgrammable.java
@@ -17,6 +17,8 @@
 
 import com.google.common.collect.Lists;
 import org.apache.commons.lang3.tuple.Pair;
+import org.onosproject.driver.optical.flowrule.CrossConnectCache;
+import org.onosproject.driver.optical.flowrule.CrossConnectFlowRule;
 import org.onosproject.net.ChannelSpacing;
 import org.onosproject.net.GridType;
 import org.onosproject.net.OchSignal;