Merge "Parents pom distribution"
[controller.git] / opendaylight / sal / api / src / main / java / org / opendaylight / controller / sal / match / MatchField.java
index 19c365b29e041c338083e1ccc7f5e26a8e47509f..bd5ef2bafbd4134e74469824962b6e18f42edaeb 100644 (file)
@@ -1,4 +1,3 @@
-
 /*
  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved.
  *
@@ -9,38 +8,53 @@
 
 package org.opendaylight.controller.sal.match;
 
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
-import org.opendaylight.controller.sal.utils.HexEncode;
+import java.io.Serializable;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlRootElement;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Represents the generic matching field
  *
- *
- *
  */
-public class MatchField implements Cloneable {
+
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
+public class MatchField implements Cloneable, Serializable {
+    private static final long serialVersionUID = 1L;
     private static final Logger logger = LoggerFactory
             .getLogger(MatchField.class);
     private MatchType type; // the field we want to match
     private Object value; // the value of the field we want to match
-    private Object mask; // the value of the mask we want to match on the specified field
+    private Object mask; // the value of the mask we want to match on the
+                         // specified field
     private transient boolean isValid;
 
+    // To satisfy JAXB
+    @SuppressWarnings("unused")
+    private MatchField() {
+    }
+
     /**
      * Mask based match constructor
      *
      * @param type
      * @param value
-     * @param mask   has to be of the same class type of value. A null mask means full match
+     * @param mask
+     *            has to be of the same class type of value. A null mask means
+     *            full match
      */
     public MatchField(MatchType type, Object value, Object mask) {
         this.type = type;
         this.value = value;
         this.mask = mask;
-        this.isValid = checkValueType() && checkValues(); // Keep this logic, value checked only if type check is fine
+        // Keep this logic, value checked only if type check is fine
+        this.isValid = checkValueType() && checkValues();
     }
 
     /**
@@ -53,7 +67,8 @@ public class MatchField implements Cloneable {
         this.type = type;
         this.value = value;
         this.mask = null;
-        this.isValid = checkValueType() && checkValues(); // Keep this logic, value checked only if type check is fine
+        // Keep this logic, value checked only if type check is fine
+        this.isValid = checkValueType() && checkValues();
     }
 
     /**
@@ -65,6 +80,11 @@ public class MatchField implements Cloneable {
         return value;
     }
 
+    @XmlElement(name = "value")
+    private String getValueString() {
+        return type.stringify(value);
+    }
+
     /**
      * Returns the type field this match field object is for
      *
@@ -74,15 +94,26 @@ public class MatchField implements Cloneable {
         return type;
     }
 
+    @XmlElement(name = "type")
+    private String getTypeString() {
+        return type.toString();
+    }
+
     /**
-     * Returns the mask value set for this field match
-     * A null mask means this is a full match
+     * Returns the mask value set for this field match A null mask means this is
+     * a full match
+     *
      * @return
      */
     public Object getMask() {
         return mask;
     }
 
+    @XmlElement(name = "mask")
+    private String getMaskString() {
+        return type.stringify(mask);
+    }
+
     /**
      * Returns the bitmask set for this field match
      *
@@ -157,30 +188,42 @@ public class MatchField implements Cloneable {
                 }
             }
         } catch (CloneNotSupportedException e) {
-            e.printStackTrace();
+            logger.error("",e);
         }
         return cloned;
     }
 
     @Override
-    public int hashCode() {
-        return HashCodeBuilder.reflectionHashCode(this);
+    public String toString() {
+        return type + "(" + getValueString() + "," + getMaskString() + ")";
     }
 
     @Override
-    public boolean equals(Object obj) {
-        return EqualsBuilder.reflectionEquals(this, obj);
+    public int hashCode() {
+        final int prime = 31;
+        int result = 1;
+        result = prime * result + ((mask == null) ? 0 : mask.hashCode());
+        result = prime * result + ((type == null) ? 0 : type.hashCode());
+        result = prime * result + ((value == null) ? 0 : value.hashCode());
+        return result;
     }
 
     @Override
-    public String toString() {
-        String valueString = (value == null) ? "null"
-                : (value instanceof byte[]) ? HexEncode
-                        .bytesToHexString((byte[]) value) : value.toString();
-        String maskString = (mask == null) ? "null"
-                : (mask instanceof byte[]) ? HexEncode
-                        .bytesToHexString((byte[]) mask) : mask.toString();
-
-        return type + "(" + valueString + "," + maskString + ")";
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null) {
+            return false;
+        }
+        if (getClass() != obj.getClass()) {
+            return false;
+        }
+        MatchField other = (MatchField) obj;
+        if (type != other.type) {
+            return false;
+        }
+        return (type.equalValues(this.value, other.value) && type.equalMasks(
+                this.mask, other.mask));
     }
 }