X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fforwardingrulesmanager%2Fapi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fforwardingrulesmanager%2FFlowEntry.java;h=83106a391cb7bdc00ff0911fa703e7dee1c1c2f4;hb=144cfa4b4a926b7d0c3d5f60ada050c609762699;hp=6aa5b07e2a0e782c81f15de11835758ce1cc4cea;hpb=6510d201fe8a60cb7092f3a5e5bec2dbed44a73b;p=controller.git diff --git a/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowEntry.java b/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowEntry.java index 6aa5b07e2a..83106a391c 100644 --- a/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowEntry.java +++ b/opendaylight/forwardingrulesmanager/api/src/main/java/org/opendaylight/controller/forwardingrulesmanager/FlowEntry.java @@ -25,8 +25,7 @@ import org.slf4j.LoggerFactory; * instance the flows constituting a policy all share the same group name. */ public class FlowEntry implements Cloneable, Serializable { - protected static final Logger logger = LoggerFactory - .getLogger(FlowEntry.class); + protected static final Logger logger = LoggerFactory.getLogger(FlowEntry.class); private static final long serialVersionUID = 1L; private static final Logger log = LoggerFactory.getLogger(FlowEntry.class); private String groupName; // group name @@ -51,7 +50,7 @@ public class FlowEntry implements Cloneable, Serializable { /** * Return the actual Flow contained in this entry - * + * * @return the flow */ public Flow getFlow() { @@ -86,55 +85,65 @@ public class FlowEntry implements Cloneable, Serializable { return cloned; } + /* + * Only accounts fields which uniquely identify a flow for collision + * purposes: node, match and priority + */ @Override public int hashCode() { final int prime = 31; int result = 1; - result = prime * result + ((flow == null) ? 0 : flow.hashCode()); - result = prime * result - + ((flowName == null) ? 0 : flowName.hashCode()); - result = prime * result - + ((groupName == null) ? 0 : groupName.hashCode()); result = prime * result + ((node == null) ? 0 : node.hashCode()); + result = prime * result + ((flow == null) ? 0 : (int) flow.getPriority()); + result = prime * result + ((flow == null || flow.getMatch() == null) ? 0 : flow.getMatch().hashCode()); + return result; } @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; + } FlowEntry other = (FlowEntry) obj; - if (flow == null) { - if (other.flow != null) + + if (node == null) { + if (other.node != null) { return false; - } else if (!flow.equals(other.flow)) + } + } else if (!node.equals(other.node)) { return false; - if (flowName == null) { - if (other.flowName != null) - return false; - } else if (!flowName.equals(other.flowName)) + } + + if (flow == null) { + return (other.flow == null) ? true : false; + } else if (other.flow == null) { return false; - if (groupName == null) { - if (other.groupName != null) - return false; - } else if (!groupName.equals(other.groupName)) + } + if (flow.getPriority() != other.flow.getPriority()) { return false; - if (node == null) { - if (other.node != null) + } + if (flow.getMatch() == null) { + if (other.flow.getMatch() != null) { return false; - } else if (!node.equals(other.node)) + } + } else if (!flow.getMatch().equals(other.flow.getMatch())) { return false; + } + return true; } @Override public String toString() { - return "FlowEntry[flowName = " + flowName + ", groupName = " - + groupName + ",node = " + node + ", flow = " + flow + "]"; + return "FlowEntry[flowName = " + flowName + ", groupName = " + groupName + ", node = " + node + ", flow = " + + flow + "]"; } private String constructFlowName() { @@ -147,27 +156,37 @@ public class FlowEntry implements Cloneable, Serializable { /** * Merges the current Flow with the passed Container Flow - * + * * Note: Container Flow merging is not an injective function. Be m1 and m2 * two different matches, and be f() the flow merge function, such that y1 = * f(m1) and y2 = f(m2) are the two merged matches, we may have: y1 = y2 - * - * + * + * * @param containerFlow * @return this merged FlowEntry */ public FlowEntry mergeWith(ContainerFlow containerFlow) { Match myMatch = flow.getMatch(); - // Based on this flow direction, rearrange the match - Match match = containerFlow.getMatch(); + Match filter = containerFlow.getMatch(); // Merge - myMatch.mergeWithFilter(match); + Match merge = myMatch.mergeWithFilter(filter); // Replace this Flow's match with merged version - flow.setMatch(myMatch); + flow.setMatch(merge); return this; } + + /** + * Returns whether this entry is the result of an internal generated static + * flow + * + * @return true if internal generated static flow, false otherwise + */ + public boolean isInternal() { + return flowName.startsWith(FlowConfig.INTERNALSTATICFLOWBEGIN) + && flowName.endsWith(FlowConfig.INTERNALSTATICFLOWEND); + } }