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;
@XmlRootElement
@XmlAccessorType(XmlAccessType.NONE)
public class Match implements Cloneable, Serializable {
- private static final long serialVersionUID = 1L;
- private static final Map<MatchType, MatchType> reversableMatches;
+ private static final long serialVersionUID = 1L;
+ private static final Map<MatchType, MatchType> reversableMatches;
static {
Map<MatchType, MatchType> map = new HashMap<MatchType, MatchType>();
map.put(MatchType.DL_SRC, MatchType.DL_DST);
* 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);
* 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);
/**
* 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) {
/**
* 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<MatchType> getMatchesList() {
return new ArrayList<MatchType>(fields.keySet());
/**
* Returns the list of MatchFields the match is set for
*
- * @return List of individual MatchField values.
+ * @return List of individual MatchField values.
*/
@XmlElement(name="matchField")
public List<MatchField> getMatchFields() {
- return new ArrayList<MatchField>(fields.values());
+ return new ArrayList<MatchField>(fields.values());
}
-
+
/**
* Returns whether this match is for an IPv6 flow
*/
Match cloned = null;
try {
cloned = (Match) super.clone();
+ cloned.matches = matches;
cloned.fields = new HashMap<MatchType, MatchField>();
for (Entry<MatchType, MatchField> entry : this.fields.entrySet()) {
cloned.fields.put(entry.getKey(), entry.getValue().clone());
Match reverse = this.clone();
// Flip symmetric fields
- for (Map.Entry<MatchType, MatchType> entry : Match.reversableMatches
- .entrySet()) {
+ for (Map.Entry<MatchType, MatchType> 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);
+ }
}
}
&& 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)) {
@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