X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fsal%2Fapi%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsal%2Fmatch%2FMatch.java;h=4dcf2b3c3764790e3aab70da16512573b8c3975a;hb=84ca16196357ad899e00eceae27ef75eaf899d14;hp=a4fc2e9ff714c5d75dc5a5aa2a6e646304871953;hpb=42210c03b0a4c54706320ba9f55794c0abd4d201;p=controller.git diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/match/Match.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/match/Match.java index a4fc2e9ff7..4dcf2b3c37 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/match/Match.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/match/Match.java @@ -9,6 +9,7 @@ package org.opendaylight.controller.sal.match; +import java.io.Serializable; import java.net.Inet4Address; import java.net.Inet6Address; import java.net.InetAddress; @@ -25,8 +26,6 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; -import org.apache.commons.lang3.builder.EqualsBuilder; -import org.apache.commons.lang3.builder.HashCodeBuilder; import org.opendaylight.controller.sal.utils.EtherTypes; import org.opendaylight.controller.sal.utils.IPProtocols; import org.opendaylight.controller.sal.utils.NetUtils; @@ -38,8 +37,9 @@ import org.opendaylight.controller.sal.utils.NetUtils; */ @XmlRootElement @XmlAccessorType(XmlAccessType.NONE) -public class Match implements Cloneable { - private static final Map reversableMatches; +public class Match implements Cloneable, Serializable { + private static final long serialVersionUID = 1L; + private static final Map reversableMatches; static { Map map = new HashMap(); map.put(MatchType.DL_SRC, MatchType.DL_DST); @@ -67,9 +67,9 @@ public class Match implements Cloneable { * Generic setter for frame/packet/message's header fields against which to match * Note: For MAC addresses, please pass the cloned value to this function * - * @param type packet's header field type - * @param value field's value to assign to the match - * @param mask field's bitmask to apply to the match (has to be of the same class type of value) + * @param type packet's header field type + * @param value field's value to assign to the match + * @param mask field's bitmask to apply to the match (has to be of the same class type of value) */ public void setField(MatchType type, Object value, Object mask) { MatchField field = new MatchField(type, value, mask); @@ -83,8 +83,8 @@ public class Match implements Cloneable { * Generic setter for frame/packet/message's header fields against which to match * Note: For MAC addresses, please pass the cloned value to this function * - * @param type packet's header field type - * @param value field's value to assign to the match + * @param type packet's header field type + * @param value field's value to assign to the match */ public void setField(MatchType type, Object value) { MatchField field = new MatchField(type, value); @@ -117,7 +117,7 @@ public class Match implements Cloneable { /** * Generic getter for fields against which the match is programmed * - * @param type frame/packet/message's header field type + * @param type frame/packet/message's header field type * @return */ public MatchField getField(MatchType type) { @@ -130,7 +130,6 @@ public class Match implements Cloneable { * * @return the 32 bit long mask (Refer to {@code}org.opendaylight.controller.sal.match.MatchElement) */ - @XmlElement public int getMatches() { return matches; } @@ -138,12 +137,22 @@ public class Match implements Cloneable { /** * Returns the list of MatchType fields the match is set for * - * @return List of individual MatchType fields. + * @return List of individual MatchType fields. */ public List getMatchesList() { return new ArrayList(fields.keySet()); } + /** + * Returns the list of MatchFields the match is set for + * + * @return List of individual MatchField values. + */ + @XmlElement(name="matchField") + public List getMatchFields() { + return new ArrayList(fields.values()); + } + /** * Returns whether this match is for an IPv6 flow */ @@ -216,13 +225,14 @@ public class Match implements Cloneable { Match reverse = this.clone(); // Flip symmetric fields - for (Map.Entry entry : Match.reversableMatches - .entrySet()) { + for (Map.Entry entry : Match.reversableMatches.entrySet()) { MatchType from = entry.getKey(); MatchType to = entry.getValue(); if (this.isPresent(from)) { - reverse.setField(to, this.getField(from).getValue(), this - .getField(from).getMask()); + reverse.setField(to, this.getField(from).getValue(), this.getField(from).getMask()); + if (!this.isPresent(to)) { + reverse.clearField(from); + } } } @@ -282,10 +292,8 @@ public class Match implements Cloneable { && filterAddress instanceof Inet4Address) { return true; } - InetAddress thisMask = (InetAddress) filter.getField(type) - .getMask(); - InetAddress filterMask = (InetAddress) filter.getField(type) - .getMask(); + InetAddress thisMask = (InetAddress) thisField.getMask(); + InetAddress filterMask = (InetAddress) filterField.getMask(); // thisAddress has to be in same subnet of filterAddress if (NetUtils.inetAddressConflict(thisAddress, filterAddress, thisMask, filterMask)) { @@ -328,12 +336,30 @@ public class Match implements Cloneable { @Override public int hashCode() { - return HashCodeBuilder.reflectionHashCode(this); + final int prime = 31; + int result = 1; + result = prime * result + ((fields == null) ? 0 : fields.hashCode()); + result = prime * result + matches; + return result; } @Override public boolean equals(Object obj) { - return EqualsBuilder.reflectionEquals(this, obj); + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Match other = (Match) obj; + if (fields == null) { + if (other.fields != null) + return false; + } else if (!fields.equals(other.fields)) + return false; + if (matches != other.matches) + return false; + return true; } @Override