[AETHER-1295][AETHER-1294] First stab to the TOST APIs framework
and to the DROP policies.

Patch includes also some CLI commands. REST APIs will be implemented
in a separate review. Other review will follow to implement the logic
of the REDIRECT policies

Change-Id: I34aa3da700c5a16682196e4dd8db9c4757d609c4
diff --git a/impl/src/main/java/org/onosproject/segmentrouting/policy/impl/TrafficMatchKey.java b/impl/src/main/java/org/onosproject/segmentrouting/policy/impl/TrafficMatchKey.java
new file mode 100644
index 0000000..68181a6
--- /dev/null
+++ b/impl/src/main/java/org/onosproject/segmentrouting/policy/impl/TrafficMatchKey.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 2021-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.segmentrouting.policy.impl;
+
+import org.onosproject.net.DeviceId;
+import org.onosproject.segmentrouting.policy.api.TrafficMatchId;
+
+import java.util.Objects;
+import java.util.StringTokenizer;
+
+/**
+ * Traffic match key used by the store.
+ */
+public class TrafficMatchKey {
+    private DeviceId deviceId;
+    private TrafficMatchId trafficMatchId;
+
+    /**
+     * Constructs new traffic match key with given device id and traffic match id.
+     *
+     * @param deviceId device id
+     * @param trafficMatchId traffic match id
+     */
+    public TrafficMatchKey(DeviceId deviceId, TrafficMatchId trafficMatchId) {
+        this.deviceId = deviceId;
+        this.trafficMatchId = trafficMatchId;
+    }
+
+    /**
+     * Gets device id.
+     *
+     * @return device id of the policy key
+     */
+    public DeviceId deviceId() {
+        return deviceId;
+    }
+
+    /**
+     * Gets traffic match id.
+     *
+     * @return the id of the traffic match
+     */
+    public TrafficMatchId trafficMatchId() {
+        return trafficMatchId;
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (!(obj instanceof TrafficMatchKey)) {
+            return false;
+        }
+        final TrafficMatchKey other = (TrafficMatchKey) obj;
+        return Objects.equals(this.deviceId, other.deviceId) &&
+                Objects.equals(this.trafficMatchId, other.trafficMatchId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(deviceId, trafficMatchId);
+    }
+
+    /**
+     * Parses from a string the police key.
+     *
+     * @param str the string to parse
+     * @return the policy key if present in the str, null otherwise
+     */
+    public static TrafficMatchKey fromString(String str) {
+        TrafficMatchKey policyKey = null;
+        if (str != null && str.contains(PolicyManager.KEY_SEPARATOR)) {
+            StringTokenizer tokenizer = new StringTokenizer(str, PolicyManager.KEY_SEPARATOR);
+            if (tokenizer.countTokens() == 2) {
+                policyKey = new TrafficMatchKey(DeviceId.deviceId(tokenizer.nextToken()),
+                        TrafficMatchId.of(tokenizer.nextToken()));
+            }
+        }
+        return policyKey;
+    }
+
+    @Override
+    public String toString() {
+        return deviceId.toString() + PolicyManager.KEY_SEPARATOR + trafficMatchId.toString();
+    }
+}