From 8f66b5359db2c8d2e730e9ec38ac5c488ccf3aa9 Mon Sep 17 00:00:00 2001
From: Fotis Soldatos <fsoldatos@ubitech.eu>
Date: Tue, 31 May 2022 16:05:49 +0300
Subject: [PATCH] feat(policy): add policy related domain models

---
 .../policy/model/BooleanOperator.java         |  7 ++
 .../policy/model/NumericalOperator.java       | 11 +++
 .../eu/teraflow/policy/model/PolicyRule.java  | 86 ++++++++++++-------
 .../policy/model/PolicyRuleAction.java        | 32 +++++--
 .../policy/model/PolicyRuleActionEnum.java    |  8 ++
 .../policy/model/PolicyRuleCondition.java     | 33 ++++---
 .../policy/model/PolicyRuleEvent.java         |  5 ++
 .../teraflow/policy/model/PolicyRuleId.java   | 32 -------
 .../policy/model/PolicyRulePriority.java      | 30 -------
 .../policy/model/PolicyRuleState.java         | 15 ++--
 .../teraflow/policy/model/PolicyRuleType.java |  4 +-
 .../policy/model/PolicyRuleValue.java         | 30 -------
 .../policy/model/PolicyRuleVariable.java      | 30 -------
 13 files changed, 146 insertions(+), 177 deletions(-)
 create mode 100644 src/policy/src/main/java/eu/teraflow/policy/model/BooleanOperator.java
 create mode 100644 src/policy/src/main/java/eu/teraflow/policy/model/NumericalOperator.java
 create mode 100644 src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleActionEnum.java
 delete mode 100644 src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleId.java
 delete mode 100644 src/policy/src/main/java/eu/teraflow/policy/model/PolicyRulePriority.java
 delete mode 100644 src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleValue.java
 delete mode 100644 src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleVariable.java

diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/BooleanOperator.java b/src/policy/src/main/java/eu/teraflow/policy/model/BooleanOperator.java
new file mode 100644
index 000000000..4de1743d0
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/BooleanOperator.java
@@ -0,0 +1,7 @@
+package eu.teraflow.policy.model;
+
+public enum BooleanOperator {
+    POLICYRULE_CONDITION_BOOLEAN_UNDEFINED,
+    POLICYRULE_CONDITION_BOOLEAN_AND,
+    POLICYRULE_CONDITION_BOOLEAN_OR
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/NumericalOperator.java b/src/policy/src/main/java/eu/teraflow/policy/model/NumericalOperator.java
new file mode 100644
index 000000000..ccd424a02
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/NumericalOperator.java
@@ -0,0 +1,11 @@
+package eu.teraflow.policy.model;
+
+public enum NumericalOperator {
+    POLICY_RULE_CONDITION_NUMERICAL_UNDEFINED,
+    POLICY_RULE_CONDITION_NUMERICAL_EQUAL,
+    POLICY_RULE_CONDITION_NUMERICAL_NOT_EQUAL,
+    POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN,
+    POLICY_RULE_CONDITION_NUMERICAL_LESS_THAN_EQUAL,
+    POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN,
+    POLICY_RULE_CONDITION_NUMERICAL_GREATER_THAN_EQUAL
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRule.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRule.java
index 20f78eb81..18dbfa73d 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRule.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRule.java
@@ -16,40 +16,44 @@
 
 package eu.teraflow.policy.model;
 
-import eu.teraflow.policy.context.model.ContextId;
 import eu.teraflow.policy.context.model.ServiceId;
+import java.util.List;
+import java.util.stream.Collectors;
 
 public class PolicyRule {
 
-    private final PolicyRuleId policyRuleId;
+    private final String policyRuleId;
     private final PolicyRuleType policyRuleType;
-    private final PolicyRulePriority policyRulePriority;
-    private final PolicyRuleEvent policyRuleEvent;
-    private final PolicyRuleCondition policyRuleCondition;
-    private final PolicyRuleAction policyRuleAction;
+    private final int priority;
+    private final PolicyRuleEvent event;
+    private final List<PolicyRuleCondition> policyRuleConditions;
+    private final BooleanOperator booleanOperator;
+    private final List<PolicyRuleAction> policyRuleActions;
     private final ServiceId serviceId;
-    private final ContextId contextId;
+    private final List<String> deviceIds;
 
     public PolicyRule(
-            PolicyRuleId policyRuleId,
+            String policyRuleId,
             PolicyRuleType policyRuleType,
-            PolicyRulePriority policyRulePriority,
-            PolicyRuleEvent policyRuleEvent,
-            PolicyRuleCondition policyRuleCondition,
-            PolicyRuleAction policyRuleAction,
+            int priority,
+            PolicyRuleEvent event,
+            List<PolicyRuleCondition> policyRuleConditions,
+            BooleanOperator booleanOperator,
+            List<PolicyRuleAction> policyRuleActions,
             ServiceId serviceId,
-            ContextId contextId) {
+            List<String> deviceIds) {
         this.policyRuleId = policyRuleId;
         this.policyRuleType = policyRuleType;
-        this.policyRulePriority = policyRulePriority;
-        this.policyRuleEvent = policyRuleEvent;
-        this.policyRuleCondition = policyRuleCondition;
-        this.policyRuleAction = policyRuleAction;
+        this.priority = priority;
+        this.event = event;
+        this.policyRuleConditions = policyRuleConditions;
+        this.booleanOperator = booleanOperator;
+        this.policyRuleActions = policyRuleActions;
         this.serviceId = serviceId;
-        this.contextId = contextId;
+        this.deviceIds = deviceIds;
     }
 
-    public PolicyRuleId getPolicyRuleId() {
+    public String getPolicyRuleId() {
         return policyRuleId;
     }
 
@@ -57,27 +61,51 @@ public class PolicyRule {
         return policyRuleType;
     }
 
-    public PolicyRulePriority getPolicyRulePriority() {
-        return policyRulePriority;
+    public int getPriority() {
+        return priority;
     }
 
-    public PolicyRuleEvent getPolicyRuleEvent() {
-        return policyRuleEvent;
+    public PolicyRuleEvent getEvent() {
+        return event;
     }
 
-    public PolicyRuleCondition getPolicyRuleCondition() {
-        return policyRuleCondition;
+    public List<PolicyRuleCondition> getPolicyRuleConditions() {
+        return policyRuleConditions;
     }
 
-    public PolicyRuleAction getPolicyRuleAction() {
-        return policyRuleAction;
+    public BooleanOperator getBooleanOperator() {
+        return booleanOperator;
+    }
+
+    public List<PolicyRuleAction> getPolicyRuleActions() {
+        return policyRuleActions;
     }
 
     public ServiceId getServiceId() {
         return serviceId;
     }
 
-    public ContextId getContextId() {
-        return contextId;
+    public List<String> getDeviceIds() {
+        return deviceIds;
+    }
+
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{policyRuleId:\"%s\", policyRuleType:\"%s\", priority:%d, %s, [%s], booleanOperator:\"%s\", [%s], %s, [%s]}",
+                getClass().getSimpleName(),
+                policyRuleId,
+                policyRuleType.toString(),
+                priority,
+                event,
+                toString(policyRuleConditions),
+                booleanOperator.toString(),
+                toString(policyRuleActions),
+                serviceId,
+                toString(deviceIds));
+    }
+
+    private <T> String toString(List<T> list) {
+        return list.stream().map(T::toString).collect(Collectors.joining(", "));
     }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleAction.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleAction.java
index 8592262ae..baa19cb8d 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleAction.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleAction.java
@@ -16,22 +16,36 @@
 
 package eu.teraflow.policy.model;
 
+import java.util.List;
+import java.util.stream.Collectors;
+
 public class PolicyRuleAction {
 
-    private final PolicyRuleVariable policyRuleVariable;
-    private final PolicyRuleValue policyRuleValue;
+    private final PolicyRuleActionEnum policyRuleActionEnum;
+    private final List<String> parameters;
+
+    public PolicyRuleAction(PolicyRuleActionEnum policyRuleActionEnum, List<String> parameters) {
 
-    public PolicyRuleAction(PolicyRuleVariable policyRuleVariable, PolicyRuleValue policyRuleValue) {
+        this.policyRuleActionEnum = policyRuleActionEnum;
+        this.parameters = parameters;
+    }
+
+    public PolicyRuleActionEnum getPolicyRuleActionEnum() {
+        return policyRuleActionEnum;
+    }
 
-        this.policyRuleVariable = policyRuleVariable;
-        this.policyRuleValue = policyRuleValue;
+    public List<String> getPolicyRuleActionParameters() {
+        return parameters;
     }
 
-    public PolicyRuleVariable getPolicyRuleVariable() {
-        return policyRuleVariable;
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{policyRuleActionEnum:\"%s\", [%s]}",
+                getClass().getSimpleName(), policyRuleActionEnum.toString(), toString(parameters));
     }
 
-    public PolicyRuleValue getPolicyRuleValue() {
-        return policyRuleValue;
+    private <T> String toString(List<T> list) {
+        return list.stream().map(T::toString).collect(Collectors.joining(", "));
     }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleActionEnum.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleActionEnum.java
new file mode 100644
index 000000000..317daa029
--- /dev/null
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleActionEnum.java
@@ -0,0 +1,8 @@
+package eu.teraflow.policy.model;
+
+public enum PolicyRuleActionEnum {
+    POLICY_RULE_ACTION_NO_ACTION,
+    POLICY_RULE_ACTION_SET_DEVICE_STATUS,
+    POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE,
+    POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT
+}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleCondition.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleCondition.java
index 22d65124c..714cc5582 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleCondition.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleCondition.java
@@ -16,23 +16,36 @@
 
 package eu.teraflow.policy.model;
 
+import eu.teraflow.policy.monitoring.model.KpiValue;
+
 public class PolicyRuleCondition {
 
-    private final PolicyRuleVariable policyRuleVariable;
-    private final PolicyRuleValue policyRuleValue;
+    private final String kpiId;
+    private final NumericalOperator numericalOperator;
+    private final KpiValue<?> kpiValue;
+
+    public PolicyRuleCondition(String kpiId, NumericalOperator numericalOperator, KpiValue kpiValue) {
+        this.kpiId = kpiId;
+        this.numericalOperator = numericalOperator;
+        this.kpiValue = kpiValue;
+    }
 
-    public PolicyRuleCondition(
-            PolicyRuleVariable policyRuleVariable, PolicyRuleValue policyRuleValue) {
+    public String getKpiId() {
+        return kpiId;
+    }
 
-        this.policyRuleVariable = policyRuleVariable;
-        this.policyRuleValue = policyRuleValue;
+    public NumericalOperator getNumericalOperator() {
+        return numericalOperator;
     }
 
-    public PolicyRuleVariable getPolicyRuleVariable() {
-        return policyRuleVariable;
+    public KpiValue getKpiValue() {
+        return kpiValue;
     }
 
-    public PolicyRuleValue getPolicyRuleValue() {
-        return policyRuleValue;
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{kpiId:\"%s\", numericalOperator:\"%s\", %s}",
+                getClass().getSimpleName(), kpiId, numericalOperator.toString(), kpiValue);
     }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleEvent.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleEvent.java
index 476d19482..412c6c718 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleEvent.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleEvent.java
@@ -29,4 +29,9 @@ public class PolicyRuleEvent {
     public Event getEvent() {
         return event;
     }
+
+    @Override
+    public String toString() {
+        return String.format("%s:{%s}", getClass().getSimpleName(), event);
+    }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleId.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleId.java
deleted file mode 100644
index cc95d9e5d..000000000
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleId.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
-* Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
-*
-* 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 eu.teraflow.policy.model;
-
-import eu.teraflow.policy.context.model.Uuid;
-
-public class PolicyRuleId {
-
-    private final Uuid policyRuleId;
-
-    public PolicyRuleId(Uuid policyRuleId) {
-        this.policyRuleId = policyRuleId;
-    }
-
-    public Uuid getPolicyRuleId() {
-        return policyRuleId;
-    }
-}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRulePriority.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRulePriority.java
deleted file mode 100644
index c85bb9a36..000000000
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRulePriority.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
-* Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
-*
-* 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 eu.teraflow.policy.model;
-
-public class PolicyRulePriority {
-
-    private final int policyRulePriority;
-
-    public PolicyRulePriority(int policyRulePriority) {
-        this.policyRulePriority = policyRulePriority;
-    }
-
-    public int getPolicyRulePriority() {
-        return policyRulePriority;
-    }
-}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleState.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleState.java
index 43b934030..38ee0a73b 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleState.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleState.java
@@ -16,23 +16,28 @@
 
 package eu.teraflow.policy.model;
 
-import eu.teraflow.policy.context.model.Uuid;
-
 public class PolicyRuleState {
 
-    private final Uuid policeRuleId;
+    private final String policeRuleId;
     private final RuleState ruleState;
 
-    public PolicyRuleState(Uuid policeRuleId, RuleState ruleState) {
+    public PolicyRuleState(String policeRuleId, RuleState ruleState) {
         this.policeRuleId = policeRuleId;
         this.ruleState = ruleState;
     }
 
-    public Uuid getPolicyRuleId() {
+    public String getPolicyRuleId() {
         return policeRuleId;
     }
 
     public RuleState getRuleState() {
         return ruleState;
     }
+
+    @Override
+    public String toString() {
+        return String.format(
+                "%s:{policeRuleId:\"%s\", ruleState:\"%s\"}",
+                getClass().getSimpleName(), policeRuleId, ruleState);
+    }
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleType.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleType.java
index 6becad243..321220176 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleType.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleType.java
@@ -17,6 +17,6 @@
 package eu.teraflow.policy.model;
 
 public enum PolicyRuleType {
-    DEVICE,
-    NETWORK
+    POLICYTYPE_DEVICE,
+    POLICYTYPE_NETWORK
 }
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleValue.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleValue.java
deleted file mode 100644
index 9a928c4a2..000000000
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleValue.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
-* Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
-*
-* 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 eu.teraflow.policy.model;
-
-public class PolicyRuleValue {
-
-    private final String policyRuleValue;
-
-    public PolicyRuleValue(String policyRuleValue) {
-        this.policyRuleValue = policyRuleValue;
-    }
-
-    public String getPolicyRuleValue() {
-        return policyRuleValue;
-    }
-}
diff --git a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleVariable.java b/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleVariable.java
deleted file mode 100644
index fa35d270a..000000000
--- a/src/policy/src/main/java/eu/teraflow/policy/model/PolicyRuleVariable.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
-* Copyright 2021-2023 H2020 TeraFlow (https://www.teraflow-h2020.eu/)
-*
-* 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 eu.teraflow.policy.model;
-
-public class PolicyRuleVariable {
-
-    private final String policyRuleVariable;
-
-    public PolicyRuleVariable(String policyRuleVariable) {
-        this.policyRuleVariable = policyRuleVariable;
-    }
-
-    public String getPolicyRuleVariable() {
-        return policyRuleVariable;
-    }
-}
-- 
GitLab