ONOS-3515 Added ability to configure different link-weight functions as defaults; or inject custom ones.

ONOS-3516 Added ability to inject alternate graph path search algorithms.

Change-Id: If5831c198a831ae79a9933fc794eb7deab776e2f
diff --git a/core/api/src/main/java/org/onosproject/net/topology/HopCountLinkWeight.java b/core/api/src/main/java/org/onosproject/net/topology/HopCountLinkWeight.java
new file mode 100644
index 0000000..c557016
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/topology/HopCountLinkWeight.java
@@ -0,0 +1,36 @@
+package org.onosproject.net.topology;
+
+import static org.onosproject.net.Link.State.ACTIVE;
+import static org.onosproject.net.Link.Type.INDIRECT;
+
+/**
+ * Link weight for measuring link cost as hop count with indirect links
+ * being as expensive as traversing the entire graph to assume the worst.
+ */
+public class HopCountLinkWeight implements LinkWeight {
+    private final int indirectLinkCost;
+
+    /**
+     * Creates a new hop-count weight.
+     */
+    public HopCountLinkWeight() {
+        this.indirectLinkCost = Short.MAX_VALUE;
+    }
+
+    /**
+     * Creates a new hop-count weight with the specified cost of indirect links.
+     */
+    public HopCountLinkWeight(int indirectLinkCost) {
+        this.indirectLinkCost = indirectLinkCost;
+    }
+
+    @Override
+    public double weight(TopologyEdge edge) {
+        // To force preference to use direct paths first, make indirect
+        // links as expensive as the linear vertex traversal.
+        return edge.link().state() ==
+                ACTIVE ? (edge.link().type() ==
+                INDIRECT ? indirectLinkCost : 1) : -1;
+    }
+}
+