Finalize Match/Action Objects - ONOS-1728
* Added equals() and hashCode() methods to objects with IDs
* Added/Updates Javadocs
* Implemented rudimentary execute and query methods for
Operations in the MatchActionModule. Operations are preserved
but not actually executed currently.
* Implemented factories for MatchActionOperationsId and
MatchActionOperations
* Added unit tests to check creation and execution of MatchAction
* Added unit tests for new Immutable classes
Change-Id: Id865d04fd1048d00e533736c95c3052148041d95
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchAction.java b/src/main/java/net/onrc/onos/core/matchaction/MatchAction.java
index 7c3a22d..24790b8 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchAction.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchAction.java
@@ -8,7 +8,7 @@
import net.onrc.onos.core.util.SwitchPort;
/**
- * A filter and actions for traffic.
+ * A filter and actions for traffic. Objects of this class are immutable.
*/
public final class MatchAction implements BatchOperationTarget {
private final MatchActionId id;
@@ -66,4 +66,18 @@
public List<Action> getActions() {
return actions;
}
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof MatchAction) {
+ MatchAction other = (MatchAction) obj;
+ return (id.equals(other.id));
+ }
+ return false;
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionId.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionId.java
index 3e485af..b520439 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionId.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionId.java
@@ -2,9 +2,17 @@
import net.onrc.onos.api.batchoperation.BatchOperationTarget;
+/**
+ * A unique identifier for a MatchAction. Objects of this class are immutable.
+ */
public final class MatchActionId implements BatchOperationTarget {
private final String value;
+ /**
+ * Creates a new Match Action Identifier based on the given id string.
+ *
+ * @param id unique id string
+ */
public MatchActionId(String id) {
value = id;
}
@@ -23,7 +31,7 @@
public boolean equals(Object obj) {
if (obj instanceof MatchActionId) {
MatchActionId other = (MatchActionId) obj;
- return (this.value.equals(other.value));
+ return (value.equals(other.value));
}
return false;
}
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionModule.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionModule.java
index 557932e..9ed031c 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionModule.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionModule.java
@@ -1,6 +1,9 @@
package net.onrc.onos.core.matchaction;
+import java.util.Collections;
import java.util.EventListener;
+import java.util.HashSet;
+import java.util.List;
import java.util.Set;
import net.onrc.onos.api.flowmanager.ConflictDetectionPolicy;
@@ -11,6 +14,19 @@
*/
public class MatchActionModule implements MatchActionService {
+ private final HashSet<MatchAction> currentOperations = new HashSet<>();
+
+ private boolean processMatchActionEntries(
+ final List<MatchActionOperationEntry> entries) {
+ int successfulOperations = 0;
+ for (final MatchActionOperationEntry entry : entries) {
+ if (currentOperations.add(entry.getTarget())) {
+ successfulOperations++;
+ }
+ }
+ return entries.size() == successfulOperations;
+ }
+
@Override
public boolean addMatchAction(MatchAction matchAction) {
return false;
@@ -18,14 +34,12 @@
@Override
public Set<MatchAction> getMatchActions() {
- // TODO Auto-generated method stub
- return null;
+ return Collections.unmodifiableSet(currentOperations);
}
@Override
public boolean executeOperations(final MatchActionOperations operations) {
- // TODO Auto-generated method stub
- return false;
+ return processMatchActionEntries(operations.getOperations());
}
@Override
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationEntry.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationEntry.java
index b8e150b..2513dd0 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationEntry.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationEntry.java
@@ -2,6 +2,10 @@
import net.onrc.onos.api.batchoperation.BatchOperationEntry;
+/**
+ * This class pairs an Operator and a Match Action to represent an executable
+ * Match Action operation.
+ */
public final class MatchActionOperationEntry
extends BatchOperationEntry<MatchActionOperations.Operator, MatchAction> {
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperations.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperations.java
index 3aaffad..a17d0f2 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperations.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperations.java
@@ -2,8 +2,18 @@
import net.onrc.onos.api.batchoperation.BatchOperation;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+/**
+ * The MatchActionOperations class holds a list of MatchActionOperationEntry
+ * objects to be executed together as one set.
+ * <p/>
+ * Objects of this class are immutable.
+ */
public final class MatchActionOperations
extends BatchOperation<MatchActionOperationEntry> {
+
+ private final MatchActionOperationsId id;
/**
* The MatchAction operators.
*/
@@ -12,5 +22,47 @@
REMOVE,
}
- // TODO waiting on updated BatchOperation as of 8/7
+ /**
+ * Constructs a MatchActionOperations object from an id. Internal
+ * constructor called by a public factory method.
+ *
+ * @param newId match action operations identifier for this instance
+ */
+ private MatchActionOperations(final MatchActionOperationsId newId) {
+ id = checkNotNull(newId);
+ }
+
+ /**
+ * Creates a MatchActionOperations object from an id.
+ *
+ * @param newId match action operations identifier to use for the new object
+ * @return Match Action Operations object
+ */
+ public static MatchActionOperations createMatchActionsOperations(
+ final MatchActionOperationsId newId) {
+ return new MatchActionOperations(newId);
+ }
+
+ /**
+ * Gets the identifier for the Match Action Operations object.
+ *
+ * @return identifier for the Opertions object
+ */
+ public MatchActionOperationsId getOperationsId() {
+ return id;
+ }
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj instanceof MatchActionOperations) {
+ final MatchActionOperations other = (MatchActionOperations) obj;
+ return (id.equals(other.id));
+ }
+ return false;
+ }
}
diff --git a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsId.java b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsId.java
index 8ea2168..7c9d1db 100644
--- a/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsId.java
+++ b/src/main/java/net/onrc/onos/core/matchaction/MatchActionOperationsId.java
@@ -1,5 +1,62 @@
package net.onrc.onos.core.matchaction;
-public interface MatchActionOperationsId {
- // TODO waiting on MatchActionOperations
+import java.util.UUID;
+
+/**
+ * Identifier for a MatchActionOperations object. This is an immutable class
+ * that encapsulates a globally unique identifier for the MatchActionOperations
+ * object.
+ */
+public final class MatchActionOperationsId {
+
+ private static final String OPERATIONS_ID_PREFIX = "MatchActionOperationsId-";
+ private final String id;
+
+ /**
+ * Constructs an Operations identifier and allocates a unique identifier
+ * for it.
+ */
+ private MatchActionOperationsId() {
+ id = OPERATIONS_ID_PREFIX + UUID.randomUUID();
+ }
+
+ /**
+ * Gets the identifier for the Operations object.
+ *
+ * @return Operations object identifier as a string
+ */
+ public String getId() {
+ return id;
+ }
+
+ @Override
+ public boolean equals(final Object other) {
+ if (other == this) {
+ return true;
+ }
+
+ if (!(other instanceof MatchActionOperationsId)) {
+ return false;
+ }
+
+ final MatchActionOperationsId otherMatchActionOperationsId =
+ (MatchActionOperationsId) other;
+
+ return otherMatchActionOperationsId.getId().equals(getId());
+ }
+
+ @Override
+ public int hashCode() {
+ return id.hashCode();
+ }
+
+ /**
+ * Creates a new Id for a MatchActionOperation.
+ *
+ * @return new Id for a MatchActionOperation
+ */
+ public static MatchActionOperationsId createNewOperationsId() {
+ return new MatchActionOperationsId();
+ }
+
}