Renamed devicemanager, flowprogrammer, linkdiscovery and util packages

net.onrc.onos.ofcontroller.devicemanager.* => net.onrc.onos.core.devicemanager.*
net.onrc.onos.ofcontroller.flowprogrammer.* => net.onrc.onos.core.flowprogrammer.*
net.onrc.onos.ofcontroller.linkdiscovery.* => net.onrc.onos.core.linkdiscovery.*
net.onrc.onos.ofcontroller.util.* => net.onrc.onos.core.util.*

Change-Id: Iaa865af552e8fb3a589e73d006569ac79f5a0f08
diff --git a/src/main/java/net/onrc/onos/core/util/FlowPath.java b/src/main/java/net/onrc/onos/core/util/FlowPath.java
new file mode 100644
index 0000000..2bb5ad3
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/util/FlowPath.java
@@ -0,0 +1,316 @@
+package net.onrc.onos.core.util;
+
+import java.util.ArrayList;
+
+import org.codehaus.jackson.annotate.JsonIgnore;
+import org.codehaus.jackson.annotate.JsonProperty;
+
+/**
+ * The class representing the Flow Path.
+ */
+public class FlowPath implements Comparable<FlowPath> {
+    public static final int PRIORITY_DEFAULT = 32768;	// Default Flow Priority
+
+    private FlowId flowId;		// The Flow ID
+    private CallerId installerId;	// The Caller ID of the path installer
+    private FlowPathType flowPathType;	// The Flow Path type
+    private FlowPathUserState flowPathUserState; // The Flow Path User state
+    private FlowPathFlags flowPathFlags; // The Flow Path flags
+    private int		idleTimeout;	// The Flow idle timeout
+    private int		hardTimeout;	// The Flow hard timeout
+    private int		priority;	// The Flow priority
+    private DataPath	dataPath;	// The data path
+    private FlowEntryMatch flowEntryMatch; // Common Flow Entry Match for all
+					// Flow Entries
+    private FlowEntryActions flowEntryActions; // The Flow Entry Actions for
+					// the first Flow Entry
+
+    /**
+     * Default constructor.
+     */
+    public FlowPath() {
+	flowPathType = FlowPathType.FP_TYPE_UNKNOWN;
+	flowPathUserState = FlowPathUserState.FP_USER_UNKNOWN;
+	flowPathFlags = new FlowPathFlags();
+	priority = FlowPath.PRIORITY_DEFAULT;
+	dataPath = new DataPath();
+	flowEntryActions = new FlowEntryActions();
+    }
+
+    /**
+     * Get the flow path Flow ID.
+     *
+     * @return the flow path Flow ID.
+     */
+    @JsonProperty("flowId")
+    public FlowId flowId() { return flowId; }
+
+    /**
+     * Set the flow path Flow ID.
+     *
+     * @param flowId the flow path Flow ID to set.
+     */
+    @JsonProperty("flowId")
+    public void setFlowId(FlowId flowId) {
+	this.flowId = flowId;
+    }
+
+    /**
+     * Test whether the Flow ID is valid.
+     *
+     * @return true if the Flow ID is valid, otherwise false.
+     */
+    @JsonIgnore
+    public boolean isValidFlowId() {
+	if (this.flowId == null)
+	    return false;
+	return (this.flowId.isValid());
+    }
+
+    /**
+     * Get the Caller ID of the flow path installer.
+     *
+     * @return the Caller ID of the flow path installer.
+     */
+    @JsonProperty("installerId")
+    public CallerId installerId() { return installerId; }
+
+    /**
+     * Set the Caller ID of the flow path installer.
+     *
+     * @param installerId the Caller ID of the flow path installer.
+     */
+    @JsonProperty("installerId")
+    public void setInstallerId(CallerId installerId) {
+	this.installerId = installerId;
+    }
+
+    /**
+     * Get the flow path type.
+     *
+     * @return the flow path type.
+     */
+    @JsonProperty("flowPathType")
+    public FlowPathType flowPathType() { return flowPathType; }
+
+    /**
+     * Set the flow path type.
+     *
+     * @param flowPathType the flow path type to set.
+     */
+    @JsonProperty("flowPathType")
+    public void setFlowPathType(FlowPathType flowPathType) {
+	this.flowPathType = flowPathType;
+    }
+
+    /**
+     * Get the flow path user state.
+     *
+     * @return the flow path user state.
+     */
+    @JsonProperty("flowPathUserState")
+    public FlowPathUserState flowPathUserState() { return flowPathUserState; }
+
+    /**
+     * Set the flow path user state.
+     *
+     * @param flowPathUserState the flow path user state to set.
+     */
+    @JsonProperty("flowPathUserState")
+    public void setFlowPathUserState(FlowPathUserState flowPathUserState) {
+	this.flowPathUserState = flowPathUserState;
+    }
+
+    /**
+     * Get the flow path flags.
+     *
+     * @return the flow path flags.
+     */
+    @JsonProperty("flowPathFlags")
+    public FlowPathFlags flowPathFlags() { return flowPathFlags; }
+
+    /**
+     * Set the flow path flags.
+     *
+     * @param flowPathFlags the flow path flags to set.
+     */
+    @JsonProperty("flowPathFlags")
+    public void setFlowPathFlags(FlowPathFlags flowPathFlags) {
+	this.flowPathFlags = flowPathFlags;
+    }
+
+    /**
+     * Get the flow idle timeout in seconds.
+     *
+     * It should be an unsigned integer in the interval [0, 65535].
+     * If zero, the timeout is not set.
+     *
+     * @return the flow idle timeout.
+     */
+    @JsonProperty("idleTimeout")
+    public int idleTimeout() { return idleTimeout; }
+
+    /**
+     * Set the flow idle timeout in seconds.
+     *
+     * It should be an unsigned integer in the interval [0, 65535].
+     * If zero, the timeout is not set.
+     *
+     * @param idleTimeout the flow idle timeout to set.
+     */
+    @JsonProperty("idleTimeout")
+    public void setIdleTimeout(int idleTimeout) {
+	this.idleTimeout = 0xffff & idleTimeout;
+    }
+
+    /**
+     * Get the flow hard timeout in seconds.
+     *
+     * It should be an unsigned integer in the interval [0, 65535].
+     * If zero, the timeout is not set.
+     *
+     * @return the flow hard timeout.
+     */
+    @JsonProperty("hardTimeout")
+    public int hardTimeout() { return hardTimeout; }
+
+    /**
+     * Set the flow hard timeout.
+     *
+     * It should be an unsigned integer in the interval [0, 65535].
+     * If zero, the timeout is not set.
+     *
+     * @param hardTimeout the flow hard timeout to set.
+     */
+    @JsonProperty("hardTimeout")
+    public void setHardTimeout(int hardTimeout) {
+	this.hardTimeout = 0xffff & hardTimeout;
+    }
+
+    /**
+     * Get the flow priority.
+     *
+     * It should be an unsigned integer in the interval [0, 65535].
+     *
+     * @return the flow priority.
+     */
+    @JsonProperty("priority")
+    public int priority() { return priority; }
+
+    /**
+     * Set the flow priority.
+     *
+     * It should be an unsigned integer in the interval [0, 65535].
+     *
+     * @param priority the flow priority to set.
+     */
+    @JsonProperty("priority")
+    public void setPriority(int priority) {
+	this.priority = 0xffff & priority;
+    }
+
+    /**
+     * Get the flow path's data path.
+     *
+     * @return the flow path's data path.
+     */
+    @JsonProperty("dataPath")
+    public DataPath dataPath() { return dataPath; }
+
+    /**
+     * Set the flow path's data path.
+     *
+     * @param dataPath the flow path's data path to set.
+     */
+    @JsonProperty("dataPath")
+    public void setDataPath(DataPath dataPath) {
+	this.dataPath = dataPath;
+    }
+
+    /**
+     * Get the data path flow entries.
+     *
+     * @return the data path flow entries.
+     */
+    public ArrayList<FlowEntry> flowEntries() {
+	return this.dataPath.flowEntries();
+    }
+
+    /**
+     * Get the flow path's match conditions common for all Flow Entries.
+     *
+     * @return the flow path's match conditions common for all Flow Entries.
+     */
+    @JsonProperty("flowEntryMatch")
+    public FlowEntryMatch flowEntryMatch() { return flowEntryMatch; }
+
+    /**
+     * Set the flow path's match conditions common for all Flow Entries.
+     *
+     * @param flowEntryMatch the flow path's match conditions common for all
+     * Flow Entries.
+     */
+    @JsonProperty("flowEntryMatch")
+    public void setFlowEntryMatch(FlowEntryMatch flowEntryMatch) {
+	this.flowEntryMatch = flowEntryMatch;
+    }
+
+    /**
+     * Get the flow path's flow entry actions for the first Flow Entry.
+     *
+     * @return the flow path's flow entry actions for the first Flow Entry.
+     */
+    @JsonProperty("flowEntryActions")
+    public FlowEntryActions flowEntryActions() {
+	return flowEntryActions;
+    }
+
+    /**
+     * Set the flow path's flow entry actions for the first Flow Entry.
+     *
+     * @param flowEntryActions the flow path's flow entry actions for the first
+     * Flow Entry.
+     */
+    @JsonProperty("flowEntryActions")
+    public void setFlowEntryActions(FlowEntryActions flowEntryActions) {
+	this.flowEntryActions = flowEntryActions;
+    }
+
+    /**
+     * Convert the flow path to a string.
+     *
+     * The string has the following form:
+     *  [flowId=XXX installerId=XXX flowPathType = XXX flowPathUserState = XXX
+     *   flowPathFlags=XXX idleTimeout=XXX hardTimeout=XXX priority=XXX
+     *   dataPath=XXX flowEntryMatch=XXX flowEntryActions=XXX]
+     *
+     * @return the flow path as a string.
+     */
+    @Override
+    public String toString() {
+	String ret = "[flowId=" + this.flowId.toString();
+	ret += " installerId=" + this.installerId.toString();
+	ret += " flowPathType=" + this.flowPathType;
+	ret += " flowPathUserState=" + this.flowPathUserState;
+	ret += " flowPathFlags=" + this.flowPathFlags.toString();
+	ret += " idleTimeout=" + this.idleTimeout;
+	ret += " hardTimeout=" + this.hardTimeout;
+	ret += " priority=" + this.priority;
+	if (dataPath != null)
+	    ret += " dataPath=" + this.dataPath.toString();
+	if (flowEntryMatch != null)
+	    ret += " flowEntryMatch=" + this.flowEntryMatch.toString();
+	if (flowEntryActions != null)
+	    ret += " flowEntryActions=" + this.flowEntryActions.toString();
+	ret += "]";
+	return ret;
+    }
+    
+    /**
+     * CompareTo method to order flowPath by Id
+     */
+    @Override
+    public int compareTo(FlowPath f) {
+    	return (int) (this.flowId.value() - f.flowId.value());
+    }
+}