Add a PathIntents class.

- maintains a list of PathIntent instances
- maintains pointers to PathIntent instances from a link
- calculates available bandwidth for each link

Change-Id: Ibb6f5883c3a0d54c601a4a587a19983da90e4fd4
diff --git a/src/main/java/net/onrc/onos/intent/PathIntents.java b/src/main/java/net/onrc/onos/intent/PathIntents.java
new file mode 100644
index 0000000..1a8deab
--- /dev/null
+++ b/src/main/java/net/onrc/onos/intent/PathIntents.java
@@ -0,0 +1,61 @@
+package net.onrc.onos.intent;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+
+import net.onrc.onos.ofcontroller.networkgraph.Link;
+
+/**
+ * @author Toshio Koide (t-koide@onlab.us)
+ */
+public class PathIntents {
+	protected LinkedList<PathIntent> intents = new LinkedList<PathIntent>();
+	protected HashMap<Link, HashSet<PathIntent>> linkToIntents = new HashMap<Link, HashSet<PathIntent>>();
+
+	public void addIntent(PathIntent intent) {
+		intents.add(intent);
+		for (Link link: intent.getPath()) {
+			HashSet<PathIntent> value = linkToIntents.get(link);
+			if (value == null) {
+				value = new HashSet<PathIntent>();
+				linkToIntents.put(link, value);
+			}
+			value.add(intent);
+		}
+	}
+
+	public void addIntents(PathIntents intents) {
+		for(PathIntent intent: intents.getIntents()) {
+			addIntent(intent);
+		}
+	}
+
+	public Collection<PathIntent> getIntentByLink(Link link) {
+		return Collections.unmodifiableCollection(linkToIntents.get(link));
+	}
+
+	public Collection<PathIntent> getIntents() {
+		return Collections.unmodifiableCollection(intents);
+	}
+
+	/**
+	 * calculate available bandwidth of specified link
+	 * @param link
+	 * @return
+	 */
+	public Double getAvailableBandwidth(Link link) {
+		Double bandwidth = link.getCapacity();
+		if (!bandwidth.isInfinite() && linkToIntents.containsKey(link)) {
+			for (PathIntent intent: getIntentByLink(link)) {
+				Double intentBandwidth = intent.getBandwidth();
+				if (intentBandwidth == null || intentBandwidth.isInfinite() || intentBandwidth.isNaN())
+					continue;
+				bandwidth -= intentBandwidth;
+			}
+		}
+		return bandwidth;
+	}
+}