Update net.onrc.onos.core.matchaction.action package.

- Added ModifySrcMacActions class.
- Implemented hashCode() and equals() methods for all Action classes.

Change-Id: I568d5fe7a105bb1553642a9e8af782248835a183
diff --git a/src/main/java/net/onrc/onos/core/matchaction/action/ModifyDstMacAction.java b/src/main/java/net/onrc/onos/core/matchaction/action/ModifyDstMacAction.java
index 47e0d44..491d986 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/action/ModifyDstMacAction.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/action/ModifyDstMacAction.java
@@ -1,7 +1,10 @@
 package net.onrc.onos.core.matchaction.action;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import net.floodlightcontroller.util.MACAddress;
 
+import com.google.common.base.Objects;
+
 /**
  * An action object to modify destination MAC address.
  * <p>
@@ -17,7 +20,7 @@
      * @param dstMac destination MAC address after the modification
      */
     public ModifyDstMacAction(MACAddress dstMac) {
-        this.dstMac = dstMac;
+        this.dstMac = checkNotNull(dstMac);
     }
 
     /**
@@ -29,4 +32,20 @@
         return dstMac;
     }
 
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(dstMac);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null || getClass() != obj.getClass()) {
+            return false;
+        }
+        ModifyDstMacAction that = (ModifyDstMacAction) obj;
+        return Objects.equal(this.dstMac, that.dstMac);
+    }
 }
diff --git a/src/main/java/net/onrc/onos/core/matchaction/action/ModifyLambdaAction.java b/src/main/java/net/onrc/onos/core/matchaction/action/ModifyLambdaAction.java
index f2d313d..ee78481 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/action/ModifyLambdaAction.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/action/ModifyLambdaAction.java
@@ -1,5 +1,7 @@
 package net.onrc.onos.core.matchaction.action;
 
+import java.util.Objects;
+
 /**
  * An action object to modify lambda.
  * <p>
@@ -7,7 +9,7 @@
  * MatchAction, Flow or Intent class.
  */
 public class ModifyLambdaAction implements Action {
-    protected int lambda;
+    private final int lambda;
 
     /**
      * Constructor.
@@ -27,4 +29,21 @@
         return lambda;
     }
 
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(lambda);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null || getClass() != obj.getClass()) {
+            return false;
+        }
+        ModifyLambdaAction other = (ModifyLambdaAction) obj;
+        return lambda == other.lambda;
+    }
+
 }
diff --git a/src/main/java/net/onrc/onos/core/matchaction/action/ModifySrcMacAction.java b/src/main/java/net/onrc/onos/core/matchaction/action/ModifySrcMacAction.java
new file mode 100644
index 0000000..21ecf32
--- /dev/null
+++ b/src/main/java/net/onrc/onos/core/matchaction/action/ModifySrcMacAction.java
@@ -0,0 +1,51 @@
+package net.onrc.onos.core.matchaction.action;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import net.floodlightcontroller.util.MACAddress;
+
+import com.google.common.base.Objects;
+
+/**
+ * An action object to modify source MAC address.
+ * <p>
+ * This class does not have a switch ID. The switch ID is handled by
+ * MatchAction, Flow or Intent class.
+ */
+public class ModifySrcMacAction implements Action {
+    private final MACAddress srcMac;
+
+    /**
+     * Constructor.
+     *
+     * @param srcMac source MAC address after the modification
+     */
+    public ModifySrcMacAction(MACAddress srcMac) {
+        this.srcMac = checkNotNull(srcMac);
+    }
+
+    /**
+     * Gets the source MAC address.
+     *
+     * @return the source MAC address
+     */
+    public MACAddress getSrcMac() {
+        return srcMac;
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(srcMac);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null || getClass() != obj.getClass()) {
+            return false;
+        }
+        ModifySrcMacAction that = (ModifySrcMacAction) obj;
+        return Objects.equal(this.srcMac, that.srcMac);
+    }
+}
diff --git a/src/main/java/net/onrc/onos/core/matchaction/action/OutputAction.java b/src/main/java/net/onrc/onos/core/matchaction/action/OutputAction.java
index a86b4d0..792b76e 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/action/OutputAction.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/action/OutputAction.java
@@ -1,7 +1,10 @@
 package net.onrc.onos.core.matchaction.action;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import net.onrc.onos.core.util.PortNumber;
 
+import com.google.common.base.Objects;
+
 /**
  * An action object to output traffic to specified port.
  * <p>
@@ -9,7 +12,7 @@
  * MatchAction, Flow or Intent class.
  */
 public class OutputAction implements Action {
-    protected PortNumber portNumber;
+    private final PortNumber portNumber;
 
     /**
      * Constructor.
@@ -17,7 +20,7 @@
      * @param dstPort The port number of the target output port.
      */
     public OutputAction(PortNumber dstPort) {
-        this.portNumber = dstPort;
+        this.portNumber = checkNotNull(dstPort);
     }
 
     /**
@@ -28,4 +31,22 @@
     public PortNumber getPortNumber() {
         return portNumber;
     }
+
+    @Override
+    public int hashCode() {
+        return Objects.hashCode(portNumber);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj == null || getClass() != obj.getClass()) {
+            return false;
+        }
+        OutputAction that = (OutputAction) obj;
+        return Objects.equal(this.portNumber, that.portNumber);
+    }
+
 }