Implement serialization/deserialization for TOSCA concepts 88/83288/2
authorChenfei Gao <cgao@research.att.com>
Tue, 26 Mar 2019 02:42:39 +0000 (22:42 -0400)
committerChenfei Gao <cgao@research.att.com>
Tue, 26 Mar 2019 13:13:48 +0000 (09:13 -0400)
Includes:
a) Build serialization for tosca policy
b) Build serialization for tosca policy type
c) Build serialization for tosca data type
d) Build deserialization for tosca policy
e) Build deserialization for tosca policy type
f) Build deserialization for tosca data type
g) Build plain tosca pojos for API endpoints
h) Build plain tosca pojo mapper to map from/to internal tosca representation
i) Add relevant junit tests

Issue-ID: POLICY-1441
Change-Id: I30a4a1337c756f675fc7a5521e5f9e1a5e3eb97a
Signed-off-by: Chenfei Gao <cgao@research.att.com>
34 files changed:
models-examples/src/main/resources/policies/vDNS.policy.monitoring.input.tosca.json
models-examples/src/main/resources/policies/vFirewall.policy.monitoring.input.tosca.json
models-examples/src/main/resources/policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.yaml
models-examples/src/main/resources/policytypes/onap.policy.monitoring.cdap.tca.hi.lo.app.yaml
models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaConstraint.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaDataType.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaEntrySchema.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaPolicy.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaPolicyType.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaProperty.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaServiceTemplate.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaTopologyTemplate.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/package-info.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/mapping/PlainToscaServiceTemplateMapper.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/mapping/package-info.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaConstraintValidValues.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaProperty.java
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaTopologyTemplate.java
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaDataTypeJsonAdapter.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaDataTypesJsonAdapter.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaPoliciesJsonAdapter.java
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaPolicyJsonAdapter.java
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaPolicyTypeJsonAdapter.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaPolicyTypesJsonAdapter.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaPropertiesJsonAdapter.java [new file with mode: 0644]
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaServiceTemplateJsonAdapter.java
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaServiceTemplateMessageBodyHandler.java
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaTopologyTemplateJsonAdapter.java
models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/concepts/TestPojos.java [new file with mode: 0644]
models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/mapping/PlainToscaServiceTemplateMapperTest.java [new file with mode: 0644]
models-tosca/src/test/java/org/onap/policy/models/tosca/simple/concepts/ToscaPolicyTest.java
models-tosca/src/test/java/org/onap/policy/models/tosca/simple/concepts/ToscaPropertyTest.java
models-tosca/src/test/java/org/onap/policy/models/tosca/simple/serialization/MonitoringPolicySerializationTest.java
models-tosca/src/test/java/org/onap/policy/models/tosca/simple/serialization/MonitoringPolicyTypeSerializationTest.java [new file with mode: 0644]

index 2188cb2..bd4bdc4 100644 (file)
@@ -1,48 +1,50 @@
 {
-    "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
+  "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
+  "topology_template": {
     "policies": [
-        {
-            "onap.scaleout.tca": {
-                "type": "onap.policies.monitoring.cdap.tca.hi.lo.app",
-                "version": "1.0.0",
-                "metadata": {
-                    "policy-id": "onap.scaleout.tca"
-                },
-                "properties": {
-                    "tca_policy": {
-                        "domain": "measurementsForVfScaling",
-                        "metricsPerEventName": [
-                            {
-                                "eventName": "vLoadBalancer",
-                                "controlLoopSchemaType": "VNF",
-                                "policyScope": "type=configuration",
-                                "policyName": "onap.scaleout.tca",
-                                "policyVersion": "v0.0.1",
-                                "thresholds": [
-                                    {
-                                        "closedLoopControlName": "ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3",
-                                        "closedLoopEventStatus": "ONSET",
-                                        "version": "1.0.2",
-                                        "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
-                                        "thresholdValue": 500,
-                                        "direction": "LESS_OR_EQUAL",
-                                        "severity": "MAJOR"
-                                    },
-                                    {
-                                        "closedLoopControlName": "ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3",
-                                        "closedLoopEventStatus": "ONSET",
-                                        "version": "1.0.2",
-                                        "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
-                                        "thresholdValue": 5000,
-                                        "direction": "GREATER_OR_EQUAL",
-                                        "severity": "CRITICAL"
-                                    }
-                                ]
-                            }
-                        ]
+      {
+        "onap.scaleout.tca": {
+          "type": "onap.policies.monitoring.cdap.tca.hi.lo.app",
+          "version": "1.0.0",
+          "metadata": {
+            "policy-id": "onap.scaleout.tca"
+          },
+          "properties": {
+            "tca_policy": {
+              "domain": "measurementsForVfScaling",
+              "metricsPerEventName": [
+                {
+                  "eventName": "vLoadBalancer",
+                  "controlLoopSchemaType": "VNF",
+                  "policyScope": "type=configuration",
+                  "policyName": "onap.scaleout.tca",
+                  "policyVersion": "v0.0.1",
+                  "thresholds": [
+                    {
+                      "closedLoopControlName": "ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3",
+                      "closedLoopEventStatus": "ONSET",
+                      "version": "1.0.2",
+                      "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
+                      "thresholdValue": 500,
+                      "direction": "LESS_OR_EQUAL",
+                      "severity": "MAJOR"
+                    },
+                    {
+                      "closedLoopControlName": "ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3",
+                      "closedLoopEventStatus": "ONSET",
+                      "version": "1.0.2",
+                      "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
+                      "thresholdValue": 5000,
+                      "direction": "GREATER_OR_EQUAL",
+                      "severity": "CRITICAL"
                     }
+                  ]
                 }
+              ]
             }
+          }
         }
+      }
     ]
+  }
 }
\ No newline at end of file
index 93545a0..dc3131d 100644 (file)
@@ -1,45 +1,50 @@
 {
-    "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
+  "tosca_definitions_version": "tosca_simple_yaml_1_0_0",
+  "topology_template": {
     "policies": [
-        {
-            "onap.vfirewall.tca": {
-                "type": "onap.policy.monitoring.cdap.tca.hi.lo.app",
-                "version": "1.0.0",
-                "properties": {
-                    "tca_policy": {
-                        "domain": "measurementsForVfScaling",
-                        "metricsPerEventName": [
-                            {
-                                "eventName": "vLoadBalancer",
-                                "controlLoopSchemaType": "VNF",
-                                "policyScope": "resource=vLoadBalancer;type=configuration",
-                                "policyName": "onap.vfirewall.tca",
-                                "policyVersion": "v0.0.1",
-                                "thresholds": [
-                                    {
-                                        "closedLoopControlName": "ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a",
-                                        "closedLoopEventStatus": "ONSET",
-                                        "version": "1.0.2",
-                                        "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
-                                        "thresholdValue": 500,
-                                        "direction": "LESS_OR_EQUAL",
-                                        "severity": "MAJOR"
-                                    },
-                                    {
-                                        "closedLoopControlName": "ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a",
-                                        "closedLoopEventStatus": "ONSET",
-                                        "version": "1.0.2",
-                                        "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
-                                        "thresholdValue": 5000,
-                                        "direction": "GREATER_OR_EQUAL",
-                                        "severity": "CRITICAL"
-                                    }
-                                ]
-                            }
-                        ]
+      {
+        "onap.vfirewall.tca": {
+          "type": "onap.policy.monitoring.cdap.tca.hi.lo.app",
+          "version": "1.0.0",
+          "metadata": {
+            "policy-id": "onap.vfirewall.tca"
+          },
+          "properties": {
+            "tca_policy": {
+              "domain": "measurementsForVfScaling",
+              "metricsPerEventName": [
+                {
+                  "eventName": "vLoadBalancer",
+                  "controlLoopSchemaType": "VNF",
+                  "policyScope": "resource=vLoadBalancer;type=configuration",
+                  "policyName": "onap.vfirewall.tca",
+                  "policyVersion": "v0.0.1",
+                  "thresholds": [
+                    {
+                      "closedLoopControlName": "ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a",
+                      "closedLoopEventStatus": "ONSET",
+                      "version": "1.0.2",
+                      "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
+                      "thresholdValue": 500,
+                      "direction": "LESS_OR_EQUAL",
+                      "severity": "MAJOR"
+                    },
+                    {
+                      "closedLoopControlName": "ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a",
+                      "closedLoopEventStatus": "ONSET",
+                      "version": "1.0.2",
+                      "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedBroadcastPacketsAccumulated",
+                      "thresholdValue": 5000,
+                      "direction": "GREATER_OR_EQUAL",
+                      "severity": "CRITICAL"
                     }
+                  ]
                 }
+              ]
             }
+          }
         }
+      }
     ]
+  }
 }
\ No newline at end of file
index 5a093dd..63796fa 100644 (file)
@@ -1,17 +1,18 @@
 tosca_definitions_version: tosca_simple_yaml_1_0_0
 policy_types:
-  version: 1.0.0
-  onap.policies.Monitoring:
-    derived_from: tosca.policies.Root
-    description: a base policy type for all policies that govern monitoring provision
-    version: 1.0.0
-  onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:
-    derived_from: policy.nodes.Root
-    version: 1.0.0
-    properties:
-      buscontroller_feed_publishing_endpoint:
-        type: string
-        description: DMAAP Bus Controller feed endpoint
-      datafile.policy:
-        type: string
-        description: datafile Policy JSON as string
+  -
+    onap.policies.Monitoring:
+        derived_from: tosca.policies.Root
+        description: a base policy type for all policies that govern monitoring provision
+        version: 1.0.0
+  -
+    onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server:
+        derived_from: policy.nodes.Root
+        version: 1.0.0
+        properties:
+            buscontroller_feed_publishing_endpoint:
+                type: string
+                description: DMAAP Bus Controller feed endpoint
+            datafile.policy:
+                type: string
+                description: datafile Policy JSON as string
\ No newline at end of file
index 699cffd..f8e9b75 100644 (file)
@@ -1,8 +1,10 @@
 tosca_definitions_version: tosca_simple_yaml_1_0_0
 policy_types:
+  -
     onap.policies.Monitoring:
         derived_from: tosca.policies.Root
         description: a base policy type for all policies that governs monitoring provisioning
+  -
     onap.policy.monitoring.cdap.tca.hi.lo.app:
         derived_from: onap.policies.Monitoring
         version: 1.0.0
@@ -13,6 +15,7 @@ policy_types:
                 entry_schema:
                     type: onap.datatypes.monitoring.tca_policy
 data_types:
+  -
     onap.datatypes.monitoring.metricsPerEventName:
         derived_from: tosca.datatypes.Root
         properties:
@@ -46,6 +49,7 @@ data_types:
                 description: Thresholds associated with eventName
                 entry_schema:
                     type: onap.datatypes.monitoring.thresholds
+  -
     onap.datatypes.monitoring.tca_policy:
         derived_from: tosca.datatypes.Root
         properties:
@@ -62,6 +66,7 @@ data_types:
                 description: Contains eventName and threshold details that need to be applied to given eventName
                 entry_schema:
                     type: onap.datatypes.monitoring.metricsPerEventName
+  -
     onap.datatypes.monitoring.thresholds:
         derived_from: tosca.datatypes.Root
         properties:
@@ -155,4 +160,4 @@ data_types:
             version:
                 type: string
                 required: true
-                description: Version number associated with the threshold
+                description: Version number associated with the threshold
\ No newline at end of file
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaConstraint.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaConstraint.java
new file mode 100644 (file)
index 0000000..85d0b50
--- /dev/null
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.authorative.concepts;
+
+import com.google.gson.annotations.SerializedName;
+import java.util.List;
+import lombok.Data;
+
+/**
+ * Class to represent TOSCA constraint matching input/output from/to client.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+@Data
+public class PlainToscaConstraint {
+
+    @SerializedName("valid_values")
+    private List<String> validValues;
+
+    private String equal;
+}
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaDataType.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaDataType.java
new file mode 100644 (file)
index 0000000..0581a7d
--- /dev/null
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.authorative.concepts;
+
+import com.google.gson.annotations.SerializedName;
+import java.util.Map;
+import lombok.Data;
+
+/**
+ * Class to represent TOSCA data type matching input/output from/to client.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+@Data
+public class PlainToscaDataType {
+
+    @SerializedName("derived_from")
+    private String derivedFrom;
+
+    private String version;
+
+    private Map<String, String> metadata;
+
+    private String description;
+
+    private Map<String, PlainToscaProperty> properties;
+}
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaEntrySchema.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaEntrySchema.java
new file mode 100644 (file)
index 0000000..ab9051a
--- /dev/null
@@ -0,0 +1,41 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.authorative.concepts;
+
+import java.util.List;
+import lombok.Data;
+
+/**
+ * Class to represent TOSCA entry schema matching input/output from/to client.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+@Data
+public class PlainToscaEntrySchema {
+
+    private String type;
+
+    private String description;
+
+    private List<PlainToscaConstraint> constraints;
+}
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaPolicy.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaPolicy.java
new file mode 100644 (file)
index 0000000..02ebe65
--- /dev/null
@@ -0,0 +1,45 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.authorative.concepts;
+
+import java.util.Map;
+import lombok.Data;
+
+/**
+ * Class to represent TOSCA policy matching input/output from/to client.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+@Data
+public class PlainToscaPolicy {
+
+    private String type;
+
+    private String version;
+
+    private String description;
+
+    private Map<String, String> metadata;
+
+    private Map<String, Object> properties;
+}
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaPolicyType.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaPolicyType.java
new file mode 100644 (file)
index 0000000..499e2dd
--- /dev/null
@@ -0,0 +1,47 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.authorative.concepts;
+
+import com.google.gson.annotations.SerializedName;
+import java.util.Map;
+import lombok.Data;
+
+/**
+ * Class to represent TOSCA policy type matching input/output from/to client.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+@Data
+public class PlainToscaPolicyType {
+
+    @SerializedName("derived_from")
+    private String derivedFrom;
+
+    private String version;
+
+    private Map<String, String> metadata;
+
+    private String description;
+
+    private Map<String, PlainToscaProperty> properties;
+}
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaProperty.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaProperty.java
new file mode 100644 (file)
index 0000000..e5e282a
--- /dev/null
@@ -0,0 +1,50 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.authorative.concepts;
+
+import com.google.gson.annotations.SerializedName;
+import java.util.List;
+import lombok.Data;
+
+/**
+ * Class to represent TOSCA property matching input/output from/to client.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+@Data
+public class PlainToscaProperty {
+
+    private String type;
+
+    private String description;
+
+    private boolean required = false;
+
+    @SerializedName("default")
+    private String defaultValue;
+
+    @SerializedName("entry_schema")
+    private PlainToscaEntrySchema entrySchema;
+
+    private List<PlainToscaConstraint> constraints;
+}
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaServiceTemplate.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaServiceTemplate.java
new file mode 100644 (file)
index 0000000..cf5e2d9
--- /dev/null
@@ -0,0 +1,49 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.authorative.concepts;
+
+import com.google.gson.annotations.SerializedName;
+import java.util.List;
+import java.util.Map;
+import lombok.Data;
+
+/**
+ * Class to represent TOSCA service template matching input/output from/to client.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+@Data
+public class PlainToscaServiceTemplate {
+
+    @SerializedName("tosca_definitions_version")
+    private String toscaDefinitionsVersion;
+
+    @SerializedName("topology_template")
+    private PlainToscaTopologyTemplate toscaTopologyTemplate;
+
+    @SerializedName("policy_types")
+    private List<Map<String, PlainToscaPolicyType>> policyTypes;
+
+    @SerializedName("data_types")
+    private List<Map<String, PlainToscaDataType>> dataTypes;
+}
\ No newline at end of file
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaTopologyTemplate.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/PlainToscaTopologyTemplate.java
new file mode 100644 (file)
index 0000000..16c1da0
--- /dev/null
@@ -0,0 +1,40 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.authorative.concepts;
+
+import java.util.List;
+import java.util.Map;
+import lombok.Data;
+
+/**
+ * Class to represent TOSCA topology template matching input/output from/to client.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+@Data
+public class PlainToscaTopologyTemplate {
+
+    private String description;
+
+    private List<Map<String, PlainToscaPolicy>> policies;
+}
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/package-info.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/package-info.java
new file mode 100644 (file)
index 0000000..2b98f9b
--- /dev/null
@@ -0,0 +1,31 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+/**
+ * This package includes all TOSCA concept POJOs that can be parsed correctly by swagger-core and rendered
+ * as expected in swagger-ui.
+ */
+/**
+ * @author Chenfei Gao (cgao@research.att.com)
+ *
+ */
+package org.onap.policy.models.tosca.authorative.concepts;
\ No newline at end of file
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/mapping/PlainToscaServiceTemplateMapper.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/mapping/PlainToscaServiceTemplateMapper.java
new file mode 100644 (file)
index 0000000..aa7ca23
--- /dev/null
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.authorative.mapping;
+
+import com.google.gson.Gson;
+import org.onap.policy.models.tosca.authorative.concepts.PlainToscaServiceTemplate;
+import org.onap.policy.models.tosca.simple.concepts.ToscaServiceTemplate;
+import org.onap.policy.models.tosca.simple.mapping.ToscaServiceTemplateMapper;
+import org.onap.policy.models.tosca.simple.serialization.ToscaServiceTemplateMessageBodyHandler;
+
+/**
+ * This class maps a TOSCA service template from client input form to internal representation and vice verse.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+public class PlainToscaServiceTemplateMapper
+        implements ToscaServiceTemplateMapper<PlainToscaServiceTemplate, PlainToscaServiceTemplate> {
+
+    private Gson defaultGson = new Gson();
+    private Gson customGson = new ToscaServiceTemplateMessageBodyHandler().getGson();
+
+    @Override
+    public ToscaServiceTemplate toToscaServiceTemplate(PlainToscaServiceTemplate otherPolicy) {
+
+        String serializedServiceTemplate = defaultGson.toJson(otherPolicy);
+        return customGson.fromJson(serializedServiceTemplate, ToscaServiceTemplate.class);
+
+    }
+
+    @Override
+    public PlainToscaServiceTemplate fromToscaServiceTemplate(ToscaServiceTemplate serviceTemplate) {
+
+        String serializedServiceTemplate = customGson.toJson(serviceTemplate);
+        return defaultGson.fromJson(serializedServiceTemplate, PlainToscaServiceTemplate.class);
+    }
+}
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/mapping/package-info.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/mapping/package-info.java
new file mode 100644 (file)
index 0000000..e9b87c6
--- /dev/null
@@ -0,0 +1,31 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+/**
+ * This package includes all the mappers used to transform plain TOSCA POJOs into internal representation
+ * of TOSCA concepts with JPA annotations added.
+ */
+/**
+ * @author Chenfei Gao (cgao@research.att.com)
+ *
+ */
+package org.onap.policy.models.tosca.authorative.mapping;
\ No newline at end of file
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaConstraintValidValues.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/ToscaConstraintValidValues.java
new file mode 100644 (file)
index 0000000..98629a6
--- /dev/null
@@ -0,0 +1,121 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.simple.concepts;
+
+import com.google.gson.annotations.SerializedName;
+
+import java.util.LinkedList;
+import java.util.List;
+import javax.persistence.ElementCollection;
+import javax.ws.rs.core.Response;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+
+import org.onap.policy.models.base.PfConcept;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.base.PfReferenceKey;
+
+/**
+ * This class represents valid_values TOSCA constraint.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+@EqualsAndHashCode(callSuper = false)
+@Data
+public class ToscaConstraintValidValues extends ToscaConstraint {
+    private static final long serialVersionUID = 3152323457560746844L;
+
+    @SerializedName("valid_values")
+    @NonNull
+    @ElementCollection
+    private final List<String> validValues;
+
+    /**
+     * The Default Constructor creates a {@link ToscaConstraintValidValues} object with a null key.
+     */
+    public ToscaConstraintValidValues() {
+        this(new PfReferenceKey());
+    }
+
+    /**
+     * The Key Constructor creates a {@link ToscaConstraintValidValues} object with the given concept key.
+     *
+     * @param key the key of the constraint
+     */
+    public ToscaConstraintValidValues(final PfReferenceKey key) {
+        super(key);
+        validValues = new LinkedList<>();
+    }
+
+    /**
+     * The Key Constructor creates a {@link ToscaConstraintLogical} object with the given concept key
+     * and valid values list.
+     *
+     * @param key the key of the constraint
+     * @param validValues the valid values list of the constraint
+     *
+     */
+    public ToscaConstraintValidValues(final PfReferenceKey key, @NonNull final List<String> validValues) {
+        super(key);
+        this.validValues = validValues;
+    }
+
+    /**
+     * Copy constructor.
+     *
+     * @param copyConcept the concept to copy from
+     */
+    public ToscaConstraintValidValues(@NonNull final ToscaConstraintValidValues copyConcept) {
+        throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, "cannot copy an immutable constraint");
+    }
+
+    @Override
+    public int compareTo(final PfConcept otherConcept) {
+        if (otherConcept == null) {
+            return -1;
+        }
+        if (this == otherConcept) {
+            return 0;
+        }
+        if (getClass() != otherConcept.getClass()) {
+            return this.hashCode() - otherConcept.hashCode();
+        }
+
+        final ToscaConstraintValidValues other = (ToscaConstraintValidValues) otherConcept;
+
+        int result = super.compareTo(other);
+        if (result != 0) {
+            return result;
+        }
+
+        if (validValues.equals(other.validValues)) {
+            return 0;
+        }
+        return -1;
+    }
+
+    @Override
+    public PfConcept copyTo(@NonNull final PfConcept target) {
+        throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, "cannot copy an immutable constraint");
+    }
+}
index da13877..bc454c9 100644 (file)
@@ -23,6 +23,7 @@
 
 package org.onap.policy.models.tosca.simple.concepts;
 
+import com.google.gson.JsonElement;
 import com.google.gson.annotations.SerializedName;
 
 import java.util.List;
@@ -82,7 +83,7 @@ public class ToscaProperty extends PfConcept {
 
     @Column(name = "default")
     @SerializedName("default")
-    private PfKey defaultValue;
+    private String defaultValue;
 
     @Column
     @NonNull
@@ -137,10 +138,6 @@ public class ToscaProperty extends PfConcept {
 
         keyList.addAll(type.getKeys());
 
-        if (defaultValue != null) {
-            keyList.addAll(defaultValue.getKeys());
-        }
-
         if (constraints != null) {
             for (ToscaConstraint constraint : constraints) {
                 keyList.addAll(constraint.getKeys());
@@ -165,7 +162,7 @@ public class ToscaProperty extends PfConcept {
         }
 
         if (defaultValue != null) {
-            defaultValue.clean();
+            defaultValue = defaultValue.trim();
         }
 
         if (constraints != null) {
@@ -212,7 +209,7 @@ public class ToscaProperty extends PfConcept {
                     "property description may not be blank"));
         }
 
-        if (defaultValue != null && defaultValue.isNullKey()) {
+        if (defaultValue != null && defaultValue.trim().length() == 0) {
             result.addValidationMessage(new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID,
                     "property default value may not be null"));
         }
index 35381ec..5b21ca0 100644 (file)
@@ -78,7 +78,8 @@ public class ToscaTopologyTemplate extends PfConcept {
     }
 
     /**
-     * The Key Constructor creates a {@link ToscaTopologyTemplate} object with the given concept key.
+     * The Key Constructor creates a {@link ToscaTopologyTemplate} object with the given concept
+     * key.
      *
      * @param key the key
      */
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaDataTypeJsonAdapter.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaDataTypeJsonAdapter.java
new file mode 100644 (file)
index 0000000..65e3d4e
--- /dev/null
@@ -0,0 +1,139 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.simple.serialization;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+
+import java.lang.reflect.Type;
+import javax.ws.rs.core.Response;
+
+import lombok.NonNull;
+
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.tosca.simple.concepts.ToscaDataType;
+import org.onap.policy.models.tosca.simple.concepts.ToscaProperty;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * GSON type adapter for TOSCA data types.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+public class ToscaDataTypeJsonAdapter implements JsonSerializer<ToscaDataType>, JsonDeserializer<ToscaDataType> {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ToscaDataTypeJsonAdapter.class);
+
+    private static final String DERIVED_FROM = "derived_from";
+    private static final String DESCRIPTION = "description";
+    private static final String VERSION = "version";
+    private static final String PROPERTIES = "properties";
+    private static final String DEFAULT_VERSION = "1.0.0";
+
+    @Override
+    public ToscaDataType deserialize(@NonNull final JsonElement dataTypeElement, @NonNull final Type type,
+            @NonNull final JsonDeserializationContext context) {
+
+        // The incoming JSON
+        final JsonObject dataTypeJsonMapObject = dataTypeElement.getAsJsonObject();
+
+        // We should only have a single entry for the policy type
+        if (dataTypeJsonMapObject.entrySet().size() != 1) {
+            String errorMessage = "a policy type list entry may only contain one and only one policy type";
+            LOGGER.debug(errorMessage);
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+        }
+
+        final String dataTypeName = dataTypeJsonMapObject.entrySet().iterator().next().getKey();
+        final JsonObject dataTypeJsonObject = dataTypeJsonMapObject.entrySet().iterator().next()
+                                            .getValue().getAsJsonObject();
+
+        // Set keys
+        PfConceptKey dataTypeKey;
+        if (dataTypeJsonObject.get(VERSION) == null) {
+            dataTypeKey = new PfConceptKey(dataTypeName, DEFAULT_VERSION);
+        } else {
+            dataTypeKey = new PfConceptKey(dataTypeName, dataTypeJsonObject.get(VERSION).getAsString());
+        }
+        ToscaDataType dataType = new ToscaDataType(dataTypeKey);
+
+        // Set derived_from
+        dataType.setDerivedFrom(new PfConceptKey(dataTypeJsonObject.get(DERIVED_FROM).getAsString(),
+                DEFAULT_VERSION));
+
+        // Set description
+        if (dataTypeJsonObject.has(DESCRIPTION)) {
+            final String dataTypeDescription = dataTypeJsonObject.get(DESCRIPTION).getAsString();
+            dataType.setDescription(dataTypeDescription);
+        }
+
+        // Set properties
+        if (dataTypeJsonObject.has(PROPERTIES)) {
+            dataType.setProperties(
+                    new ToscaPropertiesJsonAdapter().deserializeProperties(dataTypeJsonObject.get(PROPERTIES)));
+            for (ToscaProperty property : dataType.getProperties()) {
+                property.getKey().setParentConceptKey(dataTypeKey);
+                property.getType().setVersion(dataType.getKey().getVersion());
+            }
+        }
+
+        return dataType;
+    }
+
+    @Override
+    public JsonElement serialize(@NonNull final ToscaDataType dataType, @NonNull final Type type,
+            @NonNull final JsonSerializationContext context) {
+
+        JsonObject dataTypeValJsonObject = new JsonObject();
+
+        // Add derived_from
+        if (dataType.getDerivedFrom() != null) {
+            dataTypeValJsonObject.addProperty(DERIVED_FROM, dataType.getDerivedFrom().getName());
+        }
+
+        // Add description
+        if (dataType.getDescription() != null) {
+            dataTypeValJsonObject.addProperty(DESCRIPTION, dataType.getDescription());
+        }
+
+        // Add version
+        if (dataType.getKey().getVersion() != null) {
+            dataTypeValJsonObject.addProperty(VERSION, dataType.getKey().getVersion());
+        }
+
+        // Add properties
+        if (dataType.getProperties() != null) {
+            JsonElement propertiesJsonElement = new ToscaPropertiesJsonAdapter()
+                    .serializeProperties(dataType.getProperties());
+            dataTypeValJsonObject.add(PROPERTIES, propertiesJsonElement);
+        }
+
+        JsonObject dataTypeJsonObject = new JsonObject();
+        dataTypeJsonObject.add(dataType.getKey().getName(), dataTypeValJsonObject);
+        return dataTypeJsonObject;
+    }
+}
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaDataTypesJsonAdapter.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaDataTypesJsonAdapter.java
new file mode 100644 (file)
index 0000000..387b499
--- /dev/null
@@ -0,0 +1,93 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.simple.serialization;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+
+import java.lang.reflect.Type;
+import java.util.Iterator;
+import javax.ws.rs.core.Response;
+import lombok.NonNull;
+
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.tosca.simple.concepts.ToscaDataType;
+import org.onap.policy.models.tosca.simple.concepts.ToscaDataTypes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * GSON type adapter for TOSCA data types.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+public class ToscaDataTypesJsonAdapter implements JsonSerializer<ToscaDataTypes>, JsonDeserializer<ToscaDataTypes> {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ToscaDataTypesJsonAdapter.class);
+
+    @Override
+    public ToscaDataTypes deserialize(@NonNull final JsonElement dataTypesElement, @NonNull final Type type,
+            @NonNull final JsonDeserializationContext context) {
+
+        // The incoming JSON
+        final JsonArray dataTypesJsonArray = dataTypesElement.getAsJsonArray();
+
+        // The outgoing object
+        final PfConceptKey dataTypesKey = new PfConceptKey("IncomingDataTypes", "0.0.1");
+        final ToscaDataTypes dataTypes = new ToscaDataTypes(dataTypesKey);
+
+        // Get the dataTypes
+        Iterator<JsonElement> dataTypesIterator = dataTypesJsonArray.iterator();
+        while (dataTypesIterator.hasNext()) {
+            ToscaDataType dataType = new ToscaDataTypeJsonAdapter()
+                    .deserialize(dataTypesIterator.next(), ToscaDataType.class, context);
+
+            dataTypes.getConceptMap().put(dataType.getKey(), dataType);
+        }
+
+        return dataTypes;
+    }
+
+    @Override
+    public JsonElement serialize(@NonNull final ToscaDataTypes dataTypes, @NonNull final Type type,
+            @NonNull final JsonSerializationContext context) {
+
+        JsonArray dataTypesJsonArray = new JsonArray();
+
+        if (dataTypes.getConceptMap().isEmpty()) {
+            String errorMessage = "data type list is empty";
+            LOGGER.debug(errorMessage);
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, errorMessage);
+        }
+
+        for (ToscaDataType dataType: dataTypes.getConceptMap().values()) {
+            JsonElement dataTypeEntry = new  ToscaDataTypeJsonAdapter().serialize(dataType, type, context);
+            dataTypesJsonArray.add(dataTypeEntry);
+        }
+
+        return dataTypesJsonArray;
+    }
+}
index 53088d6..4b1b53c 100644 (file)
@@ -43,6 +43,7 @@ import org.onap.policy.models.tosca.simple.concepts.ToscaPolicy;
  * @author Chenfei Gao (cgao@research.att.com)
  */
 public class ToscaPoliciesJsonAdapter implements JsonSerializer<ToscaPolicies>, JsonDeserializer<ToscaPolicies> {
+
     @Override
     public ToscaPolicies deserialize(@NonNull final JsonElement policiesElement, @NonNull final Type type,
             @NonNull final JsonDeserializationContext context) {
@@ -73,7 +74,6 @@ public class ToscaPoliciesJsonAdapter implements JsonSerializer<ToscaPolicies>,
         for (ToscaPolicy policy: policies.getConceptMap().values()) {
             policiesJsonArray.add(new ToscaPolicyJsonAdapter().serialize(policy, type, context));
         }
-
         return policiesJsonArray;
     }
 }
index 95b4b3b..b52634b 100644 (file)
@@ -151,7 +151,7 @@ public class ToscaPolicyJsonAdapter implements JsonSerializer<ToscaPolicy>, Json
             JsonObject propertiesMapObject = new JsonObject();
             for (Entry<String, String> entry : policy.getProperties().entrySet()) {
                 // TODO: This is the other direction of the HACK
-                JsonObject valueObject = gson.fromJson(entry.getValue(), JsonObject.class);
+                JsonElement valueObject = gson.fromJson(entry.getValue(), JsonElement.class);
                 propertiesMapObject.add(entry.getKey(), valueObject);
             }
             policyValJsonObject.add(PROPERTIES, propertiesMapObject);
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaPolicyTypeJsonAdapter.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaPolicyTypeJsonAdapter.java
new file mode 100644 (file)
index 0000000..3bf9857
--- /dev/null
@@ -0,0 +1,138 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.simple.serialization;
+
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+import java.lang.reflect.Type;
+import javax.ws.rs.core.Response;
+
+import lombok.NonNull;
+
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.tosca.simple.concepts.ToscaPolicyType;
+import org.onap.policy.models.tosca.simple.concepts.ToscaProperty;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * GSON type adapter for TOSCA policy types.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+public class ToscaPolicyTypeJsonAdapter implements JsonSerializer<ToscaPolicyType>, JsonDeserializer<ToscaPolicyType> {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ToscaPolicyTypeJsonAdapter.class);
+
+    private static final String DERIVED_FROM = "derived_from";
+    private static final String DESCRIPTION = "description";
+    private static final String VERSION = "version";
+    private static final String PROPERTIES = "properties";
+    private static final String DEFAULT_VERSION = "1.0.0";
+
+    @Override
+    public ToscaPolicyType deserialize(@NonNull final JsonElement policyTypeElement, @NonNull final Type type,
+            @NonNull final JsonDeserializationContext context) {
+
+        // The incoming JSON
+        final JsonObject policyTypeJsonMapObject = policyTypeElement.getAsJsonObject();
+
+        // We should only have a single entry for the policy type
+        if (policyTypeJsonMapObject.entrySet().size() != 1) {
+            String errorMessage = "a policy type list entry may only contain one and only one policy type";
+            LOGGER.debug(errorMessage);
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+        }
+
+        final String policyTypeName = policyTypeJsonMapObject.entrySet().iterator().next().getKey();
+        final JsonObject policyTypeJsonObject = policyTypeJsonMapObject.entrySet().iterator().next()
+                                            .getValue().getAsJsonObject();
+
+        // Set keys
+        PfConceptKey policyTypeKey;
+        if (policyTypeJsonObject.get(VERSION) == null) {
+            policyTypeKey = new PfConceptKey(policyTypeName, DEFAULT_VERSION);
+        } else {
+            policyTypeKey = new PfConceptKey(policyTypeName, policyTypeJsonObject.get(VERSION).getAsString());
+        }
+        ToscaPolicyType policyType = new ToscaPolicyType(policyTypeKey);
+
+        // Set derived_from
+        policyType.setDerivedFrom(new PfConceptKey(policyTypeJsonObject.get(DERIVED_FROM).getAsString(),
+                DEFAULT_VERSION));
+
+        // Set description
+        if (policyTypeJsonObject.has(DESCRIPTION)) {
+            final String policyTypeDescription = policyTypeJsonObject.get(DESCRIPTION).getAsString();
+            policyType.setDescription(policyTypeDescription);
+        }
+
+        // Set properties
+        if (policyTypeJsonObject.has(PROPERTIES)) {
+            policyType.setProperties(
+                    new ToscaPropertiesJsonAdapter().deserializeProperties(policyTypeJsonObject.get(PROPERTIES)));
+            for (ToscaProperty property : policyType.getProperties()) {
+                property.getKey().setParentConceptKey(policyTypeKey);
+                property.getType().setVersion(policyType.getKey().getVersion());
+            }
+        }
+
+        return policyType;
+    }
+
+    @Override
+    public JsonElement serialize(@NonNull final ToscaPolicyType policyType, @NonNull final Type type,
+            @NonNull final JsonSerializationContext context) {
+
+        JsonObject policyTypeValJsonObject = new JsonObject();
+
+        // Add derived_from
+        if (policyType.getDerivedFrom() != null) {
+            policyTypeValJsonObject.addProperty(DERIVED_FROM, policyType.getDerivedFrom().getName());
+        }
+
+        // Add description
+        if (policyType.getDescription() != null) {
+            policyTypeValJsonObject.addProperty(DESCRIPTION, policyType.getDescription());
+        }
+
+        // Add version
+        if (policyType.getKey().getVersion() != null) {
+            policyTypeValJsonObject.addProperty(VERSION, policyType.getKey().getVersion());
+        }
+
+        // Add properties
+        if (policyType.getProperties() != null) {
+            JsonElement propertiesJsonElement = new ToscaPropertiesJsonAdapter()
+                    .serializeProperties(policyType.getProperties());
+            policyTypeValJsonObject.add(PROPERTIES, propertiesJsonElement);
+        }
+
+        JsonObject policyTypeJsonObject = new JsonObject();
+        policyTypeJsonObject.add(policyType.getKey().getName(), policyTypeValJsonObject);
+        return policyTypeJsonObject;
+    }
+}
\ No newline at end of file
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaPolicyTypesJsonAdapter.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaPolicyTypesJsonAdapter.java
new file mode 100644 (file)
index 0000000..c9e6511
--- /dev/null
@@ -0,0 +1,94 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.simple.serialization;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonDeserializationContext;
+import com.google.gson.JsonDeserializer;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonSerializationContext;
+import com.google.gson.JsonSerializer;
+
+import java.lang.reflect.Type;
+import java.util.Iterator;
+import javax.ws.rs.core.Response;
+import lombok.NonNull;
+
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.tosca.simple.concepts.ToscaPolicyType;
+import org.onap.policy.models.tosca.simple.concepts.ToscaPolicyTypes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * GSON type adapter for TOSCA policy types.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+public class ToscaPolicyTypesJsonAdapter implements JsonSerializer<ToscaPolicyTypes>,
+                                                    JsonDeserializer<ToscaPolicyTypes> {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ToscaPolicyTypesJsonAdapter.class);
+
+    @Override
+    public ToscaPolicyTypes deserialize(@NonNull final JsonElement policyTypesElement, @NonNull final Type type,
+            @NonNull final JsonDeserializationContext context) {
+
+        // The incoming JSON
+        final JsonArray policyTypesJsonArray = policyTypesElement.getAsJsonArray();
+
+        // The outgoing object
+        final PfConceptKey policyTypesKey = new PfConceptKey("IncomingPolicyTypes", "0.0.1");
+        final ToscaPolicyTypes policyTypes = new ToscaPolicyTypes(policyTypesKey);
+
+        // Get the policyTypes
+        Iterator<JsonElement> policyTypesIterator = policyTypesJsonArray.iterator();
+        while (policyTypesIterator.hasNext()) {
+            ToscaPolicyType policyType = new ToscaPolicyTypeJsonAdapter()
+                    .deserialize(policyTypesIterator.next(), ToscaPolicyType.class, context);
+
+            policyTypes.getConceptMap().put(policyType.getKey(), policyType);
+        }
+
+        return policyTypes;
+    }
+
+    @Override
+    public JsonElement serialize(@NonNull final ToscaPolicyTypes policyTypes, @NonNull final Type type,
+            @NonNull final JsonSerializationContext context) {
+
+        JsonArray policyTypesJsonArray = new JsonArray();
+
+        if (policyTypes.getConceptMap().isEmpty()) {
+            String errorMessage = "policy type list is empty";
+            LOGGER.debug(errorMessage);
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, errorMessage);
+        }
+
+        for (ToscaPolicyType policyType: policyTypes.getConceptMap().values()) {
+            JsonElement policyTypeEntry = new  ToscaPolicyTypeJsonAdapter().serialize(policyType, type, context);
+            policyTypesJsonArray.add(policyTypeEntry);
+        }
+
+        return policyTypesJsonArray;
+    }
+}
\ No newline at end of file
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaPropertiesJsonAdapter.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/serialization/ToscaPropertiesJsonAdapter.java
new file mode 100644 (file)
index 0000000..da15a80
--- /dev/null
@@ -0,0 +1,284 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.simple.serialization;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map.Entry;
+import javax.ws.rs.core.Response;
+
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.base.PfReferenceKey;
+import org.onap.policy.models.tosca.simple.concepts.ToscaConstraint;
+import org.onap.policy.models.tosca.simple.concepts.ToscaConstraintLogical.Operation;
+import org.onap.policy.models.tosca.simple.concepts.ToscaConstraintLogicalString;
+import org.onap.policy.models.tosca.simple.concepts.ToscaConstraintValidValues;
+import org.onap.policy.models.tosca.simple.concepts.ToscaEntrySchema;
+import org.onap.policy.models.tosca.simple.concepts.ToscaProperty;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * GSON type adapter for TOSCA properties.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+public class ToscaPropertiesJsonAdapter {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ToscaPropertiesJsonAdapter.class);
+
+    private static final String DESCRIPTION = "description";
+    private static final String REQUIRED = "required";
+    private static final String DEFAULT = "default";
+    private static final String TYPE = "type";
+    private static final String ENTRY_SCHEMA = "entry_schema";
+    private static final String CONSTRAINTS = "constraints";
+    private static final String EQUAL = "equal";
+    private static final String VALID_VALUES = "valid_values";
+    private static final String DEFAULT_VERSION = "1.0.0";
+
+    /**
+     * Deserializes the properties.
+     *
+     * @param propertiesElement the properties in JsonElement
+     *
+     * @return deserialized ToscaProperty list
+     */
+    public List<ToscaProperty> deserializeProperties(JsonElement propertiesElement) {
+
+        final JsonObject propertiesMapObject = propertiesElement.getAsJsonObject();
+        List<ToscaProperty> properties = new LinkedList<>();
+
+        for (Entry<String, JsonElement> entry : propertiesMapObject.entrySet()) {
+            final String propertyEntryKey = entry.getKey();
+            final JsonElement propertyEntryVal = entry.getValue();
+
+            // Set property: key and type
+            ToscaProperty property = new ToscaProperty(
+                    new PfReferenceKey(new PfConceptKey(), propertyEntryKey),
+                    new PfConceptKey(propertyEntryVal.getAsJsonObject().get(TYPE).getAsString(), DEFAULT_VERSION));
+
+            // Set property: description
+            JsonObject propertyJsonObject = propertyEntryVal.getAsJsonObject();
+            if (propertyJsonObject.has(DESCRIPTION)) {
+                property.setDescription(propertyJsonObject.get(DESCRIPTION).getAsString());
+            }
+
+            // Set property: required
+            if (propertyJsonObject.has(REQUIRED)) {
+                property.setRequired(propertyJsonObject.get(REQUIRED).getAsBoolean());
+            }
+
+            // Set property: default
+            if (propertyJsonObject.has(DEFAULT)) {
+                property.setDefaultValue(propertyJsonObject.get(DEFAULT).getAsString());
+            }
+
+            // Set property: entry_schema
+            if (propertyJsonObject.has(ENTRY_SCHEMA)) {
+                checkEntrySchemaCompatibility(property.getType().getName());
+                property.setEntrySchema(deserializeEntrySchema(propertyJsonObject.get(ENTRY_SCHEMA)));
+                property.getEntrySchema().getKey().setParentConceptKey(property.getType());
+                property.getEntrySchema().getType().setVersion(property.getType().getVersion());
+            }
+
+            // Set property: constraints
+            if (propertyJsonObject.has(CONSTRAINTS)) {
+                property.setConstraints(deserializeConstraints(propertyJsonObject.get(CONSTRAINTS)));
+                for (ToscaConstraint c : property.getConstraints()) {
+                    c.getKey().setParentConceptKey(property.getType());
+                }
+            }
+
+            // Add property to properties list
+            properties.add(property);
+        }
+
+        return properties;
+    }
+
+    /**
+     * Serializes the properties.
+     *
+     * @param properties the list of ToscaProperty
+     *
+     * @return serialized JsonElement
+     */
+    public JsonElement serializeProperties(List<ToscaProperty> properties) {
+
+        JsonObject propertiesJsonObject = new JsonObject();
+
+        for (ToscaProperty property : properties) {
+            JsonObject propertyValJsonObject = new JsonObject();
+
+            // Add type
+            propertyValJsonObject.addProperty(TYPE, property.getType().getName());
+
+            // Add description
+            if (property.getDescription() != null) {
+                propertyValJsonObject.addProperty(DESCRIPTION, property.getDescription());
+            }
+
+            // Add required
+            propertyValJsonObject.addProperty(REQUIRED, property.isRequired());
+
+            // Add defaultValue
+            if (property.getDefaultValue() != null) {
+                propertyValJsonObject.addProperty(DEFAULT, property.getDefaultValue());
+            }
+
+            // Add constraints
+            if (property.getConstraints() != null) {
+                propertyValJsonObject.add(CONSTRAINTS, serializeConstraints(property.getConstraints()));
+            }
+
+            // Add entry_schema
+            if (property.getEntrySchema() != null) {
+                propertyValJsonObject.add(ENTRY_SCHEMA, serializeEntrySchema(property.getEntrySchema()));
+            }
+
+            propertiesJsonObject.add(property.getKey().getLocalName(), propertyValJsonObject);
+        }
+
+        return propertiesJsonObject;
+    }
+
+    private JsonElement serializeConstraints(List<ToscaConstraint> constraints) {
+
+        JsonArray constraintsValJsonArray = new JsonArray();
+
+        for (ToscaConstraint c : constraints) {
+            JsonObject constraintJsonObject = new JsonObject();
+
+            // Check which type of constraint it is
+            // TODO: here we only support valid_values and equal
+            if (c instanceof ToscaConstraintValidValues) {
+                JsonArray validValuesJsonArray = new JsonArray();
+                for (String validValue : ((ToscaConstraintValidValues)c).getValidValues()) {
+                    validValuesJsonArray.add(validValue);
+                }
+                constraintJsonObject.add(VALID_VALUES, validValuesJsonArray);
+            } else if (c instanceof ToscaConstraintLogicalString) {
+                constraintJsonObject.addProperty(EQUAL, ((ToscaConstraintLogicalString)c).getCompareToString());
+            } else {
+                String errorMessage = "constraint is neither valid_values nor equal";
+                LOGGER.debug(errorMessage);
+                throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, errorMessage);
+            }
+
+            constraintsValJsonArray.add(constraintJsonObject);
+        }
+
+        return constraintsValJsonArray;
+    }
+
+    private JsonElement serializeEntrySchema(ToscaEntrySchema entrySchema) {
+
+        JsonObject entrySchemaValJsonObject = new JsonObject();
+
+        // Add type
+        entrySchemaValJsonObject.addProperty(TYPE, entrySchema.getType().getName());
+
+        // Add description
+        if (entrySchema.getDescription() != null) {
+            entrySchemaValJsonObject.addProperty(DESCRIPTION, entrySchema.getDescription());
+        }
+
+        // Add constraints
+        if (entrySchema.getConstraints() != null) {
+            entrySchemaValJsonObject.add(CONSTRAINTS, serializeConstraints(entrySchema.getConstraints()));
+        }
+
+        return entrySchemaValJsonObject;
+    }
+
+    private ToscaEntrySchema deserializeEntrySchema(JsonElement entrySchemaElement) {
+
+        JsonObject entrySchemaJsonObject = entrySchemaElement.getAsJsonObject();
+
+        // Set entry_schema: key and type
+        ToscaEntrySchema entrySchema = new ToscaEntrySchema(
+                new PfReferenceKey(new PfConceptKey(), ENTRY_SCHEMA),
+                new PfConceptKey(entrySchemaJsonObject.get(TYPE).getAsString(), DEFAULT_VERSION));
+
+        // Set entry_schema: description
+        if (entrySchemaJsonObject.has(DESCRIPTION)) {
+            entrySchema.setDescription(entrySchemaJsonObject.get(DESCRIPTION).getAsString());
+        }
+
+        // Set entry_schema: constraints
+        if (entrySchemaJsonObject.has(CONSTRAINTS)) {
+            entrySchema.setConstraints(deserializeConstraints(entrySchemaJsonObject.get(CONSTRAINTS)));
+            for (ToscaConstraint c : entrySchema.getConstraints()) {
+                c.getKey().setParentConceptKey(entrySchema.getType());
+            }
+        }
+
+        return entrySchema;
+    }
+
+    private List<ToscaConstraint> deserializeConstraints(JsonElement constraintsElement) {
+
+        JsonArray constraintsJsonArray = constraintsElement.getAsJsonArray();
+        List<ToscaConstraint> constraints = new LinkedList<>();
+
+        for (Iterator<JsonElement> constraintsIter = constraintsJsonArray.iterator(); constraintsIter.hasNext(); ) {
+            JsonObject constraintJsonObject = constraintsIter.next().getAsJsonObject();
+            // Check which type of constraint it is
+            // TODO: here we only check 'valid_values' and 'equal'
+            if (constraintJsonObject.get(VALID_VALUES) != null) {
+                List<String> validValues = new LinkedList<>();
+                for (Iterator<JsonElement> validValuesIter = constraintJsonObject.get(VALID_VALUES).getAsJsonArray()
+                        .iterator(); validValuesIter.hasNext(); ) {
+                    validValues.add(validValuesIter.next().getAsString());
+                }
+                ToscaConstraint constraint = new ToscaConstraintValidValues(
+                        new PfReferenceKey(new PfConceptKey(), VALID_VALUES), validValues);
+                constraints.add(constraint);
+            } else if (constraintJsonObject.get(EQUAL) != null) {
+                ToscaConstraint constraint = new ToscaConstraintLogicalString(new PfReferenceKey(
+                        new PfConceptKey(), EQUAL), Operation.EQ, constraintJsonObject.get(EQUAL).getAsString());
+                constraints.add(constraint);
+            } else {
+                String errorMessage = "specified constraint is neither valid_values nor equal";
+                LOGGER.debug(errorMessage);
+                throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+            }
+        }
+
+        return constraints;
+    }
+
+    private void checkEntrySchemaCompatibility(String type) {
+        if (!("list".equalsIgnoreCase(type)) && !("map".equalsIgnoreCase(type))) {
+            String errorMessage = "entry schema can only be specified for list or map property";
+            LOGGER.debug(errorMessage);
+            throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, errorMessage);
+        }
+    }
+}
index 40fe63c..e25adfd 100644 (file)
@@ -32,8 +32,13 @@ import java.lang.reflect.Type;
 
 import lombok.NonNull;
 
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.tosca.simple.concepts.ToscaDataTypes;
+import org.onap.policy.models.tosca.simple.concepts.ToscaPolicyTypes;
 import org.onap.policy.models.tosca.simple.concepts.ToscaServiceTemplate;
 import org.onap.policy.models.tosca.simple.concepts.ToscaTopologyTemplate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * GSON type adapter for TOSCA policies.
@@ -44,8 +49,12 @@ import org.onap.policy.models.tosca.simple.concepts.ToscaTopologyTemplate;
 public class ToscaServiceTemplateJsonAdapter
         implements JsonSerializer<ToscaServiceTemplate>, JsonDeserializer<ToscaServiceTemplate> {
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(ToscaServiceTemplateJsonAdapter.class);
+
     private static final String TOPOLOGY_TEMPLATE = "topology_template";
     private static final String TOSCA_DEFINITIONS_VERSION = "tosca_definitions_version";
+    private static final String POLICY_TYPES = "policy_types";
+    private static final String DATA_TYPES = "data_types";
 
     @Override
     public ToscaServiceTemplate deserialize(@NonNull final JsonElement serviceTemplateElement, @NonNull final Type type,
@@ -55,17 +64,31 @@ public class ToscaServiceTemplateJsonAdapter
         final JsonObject serviceTemplateJsonObject = serviceTemplateElement.getAsJsonObject();
 
         // The outgoing object
-        final ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate();
+        final PfConceptKey serviceTemplateKey = new PfConceptKey("IncomingServiceTemplate", "0.0.1");
+        final ToscaServiceTemplate serviceTemplate = new ToscaServiceTemplate(serviceTemplateKey);
+
+        // Set tosca_definitions_version
         serviceTemplate
                 .setToscaDefinitionsVersion(serviceTemplateJsonObject.get(TOSCA_DEFINITIONS_VERSION).getAsString());
 
+        // Set topology_template
         if (serviceTemplateJsonObject.has(TOPOLOGY_TEMPLATE)) {
             serviceTemplate.setTopologyTemplate(new ToscaTopologyTemplateJsonAdapter().deserialize(
                     serviceTemplateJsonObject.get(TOPOLOGY_TEMPLATE), ToscaTopologyTemplate.class, context));
+            serviceTemplate.getTopologyTemplate().getKey().setParentConceptKey(serviceTemplateKey);
+        }
+
+        // Set policy_types
+        if (serviceTemplateJsonObject.has(POLICY_TYPES)) {
+            serviceTemplate.setPolicyTypes(new ToscaPolicyTypesJsonAdapter().deserialize(
+                    serviceTemplateJsonObject.get(POLICY_TYPES), ToscaPolicyTypes.class, context));
         }
 
-        // Set the parent key of the topology template to be this service template
-        serviceTemplate.getTopologyTemplate().getKey().setParentConceptKey(serviceTemplate.getKey());
+        // Set data_types
+        if (serviceTemplateJsonObject.has(DATA_TYPES)) {
+            serviceTemplate.setDataTypes(new ToscaDataTypesJsonAdapter().deserialize(
+                    serviceTemplateJsonObject.get(DATA_TYPES), ToscaDataTypes.class, context));
+        }
 
         return serviceTemplate;
     }
@@ -75,11 +98,33 @@ public class ToscaServiceTemplateJsonAdapter
             @NonNull final JsonSerializationContext context) {
 
         JsonObject serviceTemplateJsonObject = new JsonObject();
-        JsonElement topologyTemplateJsonElement = new ToscaTopologyTemplateJsonAdapter()
-                .serialize(serviceTemplate.getTopologyTemplate(), type, context);
 
-        serviceTemplateJsonObject.addProperty(TOSCA_DEFINITIONS_VERSION, serviceTemplate.getToscaDefinitionsVersion());
-        serviceTemplateJsonObject.add(TOPOLOGY_TEMPLATE, topologyTemplateJsonElement);
+        // Serialize tosca_definitions_version
+        if (serviceTemplate.getToscaDefinitionsVersion() != null) {
+            serviceTemplateJsonObject.addProperty(
+                    TOSCA_DEFINITIONS_VERSION, serviceTemplate.getToscaDefinitionsVersion());
+        }
+
+        // Serialize topoligy_template
+        if (serviceTemplate.getTopologyTemplate() != null) {
+            JsonElement topologyTemplateJsonElement = new ToscaTopologyTemplateJsonAdapter()
+                    .serialize(serviceTemplate.getTopologyTemplate(), type, context);
+            serviceTemplateJsonObject.add(TOPOLOGY_TEMPLATE, topologyTemplateJsonElement);
+        }
+
+        // Serialize policy_types
+        if (serviceTemplate.getPolicyTypes() != null) {
+            JsonElement policyTypesJsonElement = new ToscaPolicyTypesJsonAdapter()
+                    .serialize(serviceTemplate.getPolicyTypes(), type, context);
+            serviceTemplateJsonObject.add(POLICY_TYPES, policyTypesJsonElement);
+        }
+
+        // Serialize data_types
+        if (serviceTemplate.getDataTypes() != null) {
+            JsonElement dataTypesJsonElement = new ToscaDataTypesJsonAdapter()
+                    .serialize(serviceTemplate.getDataTypes(), type, context);
+            serviceTemplateJsonObject.add(DATA_TYPES, dataTypesJsonElement);
+        }
 
         return serviceTemplateJsonObject;
     }
index cf3e668..c7e78a5 100644 (file)
@@ -21,8 +21,12 @@ package org.onap.policy.models.tosca.simple.serialization;
 import com.google.gson.GsonBuilder;
 
 import org.onap.policy.common.gson.GsonMessageBodyHandler;
+import org.onap.policy.models.tosca.simple.concepts.ToscaDataType;
+import org.onap.policy.models.tosca.simple.concepts.ToscaDataTypes;
 import org.onap.policy.models.tosca.simple.concepts.ToscaPolicies;
 import org.onap.policy.models.tosca.simple.concepts.ToscaPolicy;
+import org.onap.policy.models.tosca.simple.concepts.ToscaPolicyType;
+import org.onap.policy.models.tosca.simple.concepts.ToscaPolicyTypes;
 import org.onap.policy.models.tosca.simple.concepts.ToscaServiceTemplate;
 import org.onap.policy.models.tosca.simple.concepts.ToscaTopologyTemplate;
 import org.slf4j.Logger;
@@ -56,6 +60,10 @@ public class ToscaServiceTemplateMessageBodyHandler extends GsonMessageBodyHandl
                 .registerTypeAdapter(ToscaTopologyTemplate.class, new ToscaTopologyTemplateJsonAdapter())
                 .registerTypeAdapter(ToscaPolicies.class, new ToscaPoliciesJsonAdapter())
                 .registerTypeAdapter(ToscaPolicy.class, new ToscaPolicyJsonAdapter())
+                .registerTypeAdapter(ToscaPolicyTypes.class, new ToscaPolicyTypesJsonAdapter())
+                .registerTypeAdapter(ToscaPolicyType.class, new ToscaPolicyTypeJsonAdapter())
+                .registerTypeAdapter(ToscaDataTypes.class, new ToscaDataTypesJsonAdapter())
+                .registerTypeAdapter(ToscaDataType.class, new ToscaDataTypeJsonAdapter())
                 .setPrettyPrinting()
                 .create()
         );
index a2974fd..d302b7e 100644 (file)
@@ -47,6 +47,7 @@ public class ToscaTopologyTemplateJsonAdapter
         implements JsonSerializer<ToscaTopologyTemplate>, JsonDeserializer<ToscaTopologyTemplate> {
 
     private static final String POLICIES = "policies";
+    private static final String DESCRIPTION = "description";
 
     @Override
     public ToscaTopologyTemplate deserialize(@NonNull final JsonElement toplogyTemplateElement,
@@ -59,6 +60,10 @@ public class ToscaTopologyTemplateJsonAdapter
         final PfReferenceKey topologyTemplateKey = new PfReferenceKey(new PfConceptKey(), "IncomingTopologyTemplate");
         final ToscaTopologyTemplate topologyTemplate = new ToscaTopologyTemplate(topologyTemplateKey);
 
+        if (topologyTemplateJsonObject.has(DESCRIPTION)) {
+            topologyTemplate.setDescription(topologyTemplateJsonObject.get(DESCRIPTION).getAsString());
+        }
+
         if (topologyTemplateJsonObject.has(POLICIES)) {
             topologyTemplate.setPolicies(new ToscaPoliciesJsonAdapter()
                     .deserialize(topologyTemplateJsonObject.get(POLICIES), ToscaPolicies.class, context));
@@ -76,6 +81,11 @@ public class ToscaTopologyTemplateJsonAdapter
                 .serialize(topologyTemplate.getPolicies(), type, context);
 
         topologyTemplateJsonObject.add(POLICIES, policiesJsonElement);
+
+        if (topologyTemplate.getDescription() != null) {
+            topologyTemplateJsonObject.addProperty(DESCRIPTION, topologyTemplate.getDescription());
+        }
+
         return topologyTemplateJsonObject;
     }
 }
diff --git a/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/concepts/TestPojos.java b/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/concepts/TestPojos.java
new file mode 100644 (file)
index 0000000..4dd55d5
--- /dev/null
@@ -0,0 +1,52 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.authorative.concepts;
+
+import com.openpojo.reflection.filters.FilterPackageInfo;
+import com.openpojo.validation.Validator;
+import com.openpojo.validation.ValidatorBuilder;
+import com.openpojo.validation.rule.impl.GetterMustExistRule;
+import com.openpojo.validation.rule.impl.SetterMustExistRule;
+import com.openpojo.validation.test.impl.GetterTester;
+import com.openpojo.validation.test.impl.SetterTester;
+import org.junit.Test;
+import org.onap.policy.common.utils.validation.ToStringTester;
+
+/**
+ * Class to perform unit tests of all pojos
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ *
+ */
+public class TestPojos {
+
+    private static final String POJO_PACKAGE = "org.onap.policy.models.tosca.authorative.concepts";
+
+    @Test
+    public void testPojos() {
+        final Validator validator = ValidatorBuilder.create().with(new ToStringTester())
+                .with(new SetterMustExistRule()).with(new GetterMustExistRule()).with(new SetterTester())
+                .with(new GetterTester()).build();
+        validator.validate(POJO_PACKAGE, new FilterPackageInfo());
+    }
+}
diff --git a/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/mapping/PlainToscaServiceTemplateMapperTest.java b/models-tosca/src/test/java/org/onap/policy/models/tosca/authorative/mapping/PlainToscaServiceTemplateMapperTest.java
new file mode 100644 (file)
index 0000000..bd6b26b
--- /dev/null
@@ -0,0 +1,94 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP Policy Model
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.authorative.mapping;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonSyntaxException;
+import java.io.IOException;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.base.PfValidationResult;
+import org.onap.policy.models.tosca.authorative.concepts.PlainToscaServiceTemplate;
+import org.onap.policy.models.tosca.simple.concepts.ToscaServiceTemplate;
+import org.yaml.snakeyaml.Yaml;
+
+/**
+ * This class performs unit test of {@link PlainToscaServiceTemplateMapper}}
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+public class PlainToscaServiceTemplateMapperTest {
+
+    private Gson defaultGson;
+    private PlainToscaServiceTemplateMapper mapper;
+
+    @Before
+    public void setUp() {
+        defaultGson = new Gson();
+        mapper = new PlainToscaServiceTemplateMapper();
+    }
+
+    @Test
+    public void testPlainToscaPolicies() throws JsonSyntaxException, IOException {
+        try {
+            String inputJson = ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.json");
+
+            PlainToscaServiceTemplate plainPolicies = defaultGson.fromJson(inputJson, PlainToscaServiceTemplate.class);
+            ToscaServiceTemplate internalPolicies = mapper.toToscaServiceTemplate(plainPolicies);
+            assertTrue(internalPolicies.validate(new PfValidationResult()).isValid());
+            PlainToscaServiceTemplate plainPolicies2 = mapper.fromToscaServiceTemplate(internalPolicies);
+            assertTrue(plainPolicies.equals(plainPolicies2));
+
+        } catch (Exception e) {
+            fail("no exception should be thrown");
+        }
+    }
+
+    @Test
+    public void testPlainToscaPolicyTypes() throws JsonSyntaxException, IOException {
+        try {
+            Yaml yaml = new Yaml();
+            String inputYaml = ResourceUtils.getResourceAsString(
+                    "policytypes/onap.policy.monitoring.cdap.tca.hi.lo.app.yaml");
+            Object yamlObject = yaml.load(inputYaml);
+            String yamlAsJsonString = defaultGson.toJson(yamlObject);
+
+            PlainToscaServiceTemplate plainPolicyTypes = defaultGson.fromJson(yamlAsJsonString,
+                    PlainToscaServiceTemplate.class);
+            ToscaServiceTemplate internalPolicyTypes = mapper.toToscaServiceTemplate(plainPolicyTypes);
+            assertTrue(internalPolicyTypes.validate(new PfValidationResult()).isValid());
+            PlainToscaServiceTemplate plainPolicyTypes2 = mapper.fromToscaServiceTemplate(internalPolicyTypes);
+            ToscaServiceTemplate internalPolicyTypes2 = mapper.toToscaServiceTemplate(plainPolicyTypes2);
+            assertTrue(internalPolicyTypes2.validate(new PfValidationResult()).isValid());
+            assertTrue(internalPolicyTypes.compareTo(internalPolicyTypes2) == 0);
+
+        } catch (Exception e) {
+            fail("no exception should be thrown");
+        }
+
+    }
+}
index 807f33e..01c1377 100644 (file)
@@ -37,7 +37,7 @@ import org.onap.policy.models.base.PfValidationResult;
 import org.onap.policy.models.tosca.simple.concepts.ToscaPolicy;
 
 /**
- * DAO test for ToscaDatatype.
+ * DAO test for ToscaPolicy.
  *
  * @author Liam Fallon (liam.fallon@est.tech)
  */
@@ -171,4 +171,4 @@ public class ToscaPolicyTest {
             assertEquals("resultIn is marked @NonNull but is null", exc.getMessage());
         }
     }
-}
+}
\ No newline at end of file
index a33da60..0fcf96a 100644 (file)
@@ -99,8 +99,7 @@ public class ToscaPropertyTest {
         tp.setRequired(false);
         assertFalse(tp.isRequired());
 
-        PfConceptKey tdefaultKey = new PfConceptKey("defaultKey", "0.0.1");
-        tp.setDefaultValue(tdefaultKey);
+        tp.setDefaultValue("defaultKey");
 
         tp.setStatus(ToscaProperty.Status.SUPPORTED);
 
@@ -141,7 +140,7 @@ public class ToscaPropertyTest {
         assertFalse(tp.compareTo(otherDt) == 0);
         otherDt.setRequired(false);
         assertFalse(tp.compareTo(otherDt) == 0);
-        otherDt.setDefaultValue(tdefaultKey);
+        otherDt.setDefaultValue("defaultKey");
         assertFalse(tp.compareTo(otherDt) == 0);
         otherDt.setStatus(ToscaProperty.Status.SUPPORTED);
         assertFalse(tp.compareTo(otherDt) == 0);
@@ -168,7 +167,7 @@ public class ToscaPropertyTest {
             assertEquals("target is marked @NonNull but is null", exc.getMessage());
         }
 
-        assertEquals(6, tp.getKeys().size());
+        assertEquals(5, tp.getKeys().size());
         assertEquals(2, new ToscaProperty().getKeys().size());
 
         new ToscaProperty().clean();
@@ -197,12 +196,7 @@ public class ToscaPropertyTest {
 
         tp.setDefaultValue(null);
         assertTrue(tp.validate(new PfValidationResult()).isValid());
-        tp.setDefaultValue(tdefaultKey);
-        assertTrue(tp.validate(new PfValidationResult()).isValid());
-
-        tp.setDefaultValue(PfConceptKey.getNullKey());
-        assertFalse(tp.validate(new PfValidationResult()).isValid());
-        tp.setDefaultValue(tdefaultKey);
+        tp.setDefaultValue("defaultKey");
         assertTrue(tp.validate(new PfValidationResult()).isValid());
 
         tp.getConstraints().add(null);
index 95f0ac9..e491563 100644 (file)
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019 Nordix Foundation.
+ *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -23,17 +24,22 @@ package org.onap.policy.models.tosca.simple.serialization;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
 import com.google.gson.JsonSyntaxException;
 
 import java.io.IOException;
-
+import java.util.Map;
 import org.junit.Before;
 import org.junit.Test;
 import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.base.PfConceptKey;
 import org.onap.policy.models.base.PfValidationResult;
+import org.onap.policy.models.tosca.simple.concepts.ToscaPolicy;
 import org.onap.policy.models.tosca.simple.concepts.ToscaServiceTemplate;
 import org.onap.policy.models.tosca.simple.serialization.ToscaServiceTemplateMessageBodyHandler;
 import org.slf4j.Logger;
@@ -44,11 +50,19 @@ import org.yaml.snakeyaml.Yaml;
  * Test serialization of monitoring policies.
  *
  * @author Liam Fallon (liam.fallon@est.tech)
+ * @author Chenfei Gao (cgao@research.att.com)
  */
 public class MonitoringPolicySerializationTest {
-    // Logger for this class
+
     private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringPolicySerializationTest.class);
 
+    private static final String VCPE_MONITORING_INPUT_JSON = "policies/vCPE.policy.monitoring.input.tosca.json";
+    private static final String VCPE_MONITORING_INPUT_YAML = "policies/vCPE.policy.monitoring.input.tosca.yaml";
+    private static final String VDNS_MONITORING_INPUT_JSON = "policies/vDNS.policy.monitoring.input.tosca.json";
+    private static final String VDNS_MONITORING_INPUT_YAML = "policies/vDNS.policy.monitoring.input.tosca.yaml";
+    private static final String VFW_MONITORING_INPUT_JSON = "policies/vFirewall.policy.monitoring.input.tosca.json";
+    private static final String VFW_MONITORING_INPUT_YAML = "policies/vFirewall.policy.monitoring.input.tosca.yaml";
+
     private Gson gson;
 
     @Before
@@ -57,48 +71,231 @@ public class MonitoringPolicySerializationTest {
     }
 
     @Test
-    public void testJsonDeserialization() throws JsonSyntaxException, IOException {
-        String vcpePolicyJson = ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.json");
+    public void testDeserialization() {
+        try {
+            // vCPE
+            ToscaServiceTemplate serviceTemplateFromJson = deserializeMonitoringInputJson(VCPE_MONITORING_INPUT_JSON);
+            verifyVcpeMonitoringInputDeserialization(serviceTemplateFromJson);
+            ToscaServiceTemplate serviceTemplateFromYaml = deserializeMonitoringInputYaml(VCPE_MONITORING_INPUT_YAML);
+            assertTrue(serviceTemplateFromJson.compareTo(serviceTemplateFromYaml) == 0);
+
+            // vDNS
+            serviceTemplateFromJson = deserializeMonitoringInputJson(VDNS_MONITORING_INPUT_JSON);
+            verifyVdnsMonitoringInputDeserialization(serviceTemplateFromJson);
+            serviceTemplateFromYaml = deserializeMonitoringInputYaml(VDNS_MONITORING_INPUT_YAML);
+            assertTrue(serviceTemplateFromJson.compareTo(serviceTemplateFromYaml) == 0);
+
+            // vFirewall
+            serviceTemplateFromJson = deserializeMonitoringInputJson(VFW_MONITORING_INPUT_JSON);
+            verifyVfwMonitoringInputDeserialization(serviceTemplateFromJson);
+            serviceTemplateFromYaml = deserializeMonitoringInputYaml(VFW_MONITORING_INPUT_YAML);
+            assertTrue(serviceTemplateFromJson.compareTo(serviceTemplateFromYaml) == 0);
+
+        } catch (Exception e) {
+            fail("No exception should be thrown");
+        }
+    }
+
+    @Test
+    public void testSerialization() {
+        try {
+            // vCPE
+            ToscaServiceTemplate serviceTemplate = deserializeMonitoringInputJson(VCPE_MONITORING_INPUT_JSON);
+            String serializedServiceTemplate = serializeMonitoringServiceTemplate(serviceTemplate);
+            verifyVcpeMonitoringOutputserialization(serializedServiceTemplate);
+
+            // vDNS
+            serviceTemplate = deserializeMonitoringInputJson(VDNS_MONITORING_INPUT_JSON);
+            serializedServiceTemplate = serializeMonitoringServiceTemplate(serviceTemplate);
+            verifyVdnsMonitoringOutputserialization(serializedServiceTemplate);
+
+            // vFirewall
+            serviceTemplate = deserializeMonitoringInputJson(VFW_MONITORING_INPUT_JSON);
+            serializedServiceTemplate = serializeMonitoringServiceTemplate(serviceTemplate);
+            verifyVfwMonitoringOutputserialization(serializedServiceTemplate);
+
+        } catch (Exception e) {
+            fail("No exception should be thrown");
+        }
+    }
+
+    private ToscaServiceTemplate deserializeMonitoringInputJson(String resourcePath)
+            throws JsonSyntaxException, IOException {
 
-        ToscaServiceTemplate serviceTemplate = gson.fromJson(vcpePolicyJson, ToscaServiceTemplate.class);
+        String policyJson = ResourceUtils.getResourceAsString(resourcePath);
+        ToscaServiceTemplate serviceTemplate = gson.fromJson(policyJson, ToscaServiceTemplate.class);
+        return serviceTemplate;
+    }
+
+    private ToscaServiceTemplate deserializeMonitoringInputYaml(String resourcePath)
+            throws JsonSyntaxException, IOException {
+
+        Yaml yaml = new Yaml();
+        String policyYaml = ResourceUtils.getResourceAsString(resourcePath);
+        Object yamlObject = yaml.load(policyYaml);
+        String yamlAsJsonString = new Gson().toJson(yamlObject);
+        ToscaServiceTemplate serviceTemplate = gson.fromJson(yamlAsJsonString, ToscaServiceTemplate.class);
+        return serviceTemplate;
+    }
+
+    private String serializeMonitoringServiceTemplate(ToscaServiceTemplate serviceTemplate) {
+        return gson.toJson(serviceTemplate);
+    }
+
+    private void verifyVcpeMonitoringInputDeserialization(ToscaServiceTemplate serviceTemplate) {
+
+        // Sanity check the entire structure
         assertNotNull(serviceTemplate);
         LOGGER.info(serviceTemplate.validate(new PfValidationResult()).toString());
         assertTrue(serviceTemplate.validate(new PfValidationResult()).isValid());
 
+        // Check tosca_definitions_version
+        assertEquals("tosca_simple_yaml_1_0_0",
+                serviceTemplate.getToscaDefinitionsVersion());
+
+        Map<PfConceptKey, ToscaPolicy> policiesConceptMap = serviceTemplate.getTopologyTemplate()
+                .getPolicies().getConceptMap();
+
+        // Check policies
+        assertTrue(policiesConceptMap.size() == 1);
+        assertEquals("onap.restart.tca", policiesConceptMap.keySet().iterator().next().getName());
         assertEquals("onap.restart.tca:1.0.0",
                 serviceTemplate.getTopologyTemplate().getPolicies().get("onap.restart.tca").getId());
 
-        String reserializedString = gson.toJson(serviceTemplate, ToscaServiceTemplate.class);
-        assertEquals(vcpePolicyJson.replaceAll("\\s+", ""), reserializedString.replaceAll("\\s+", ""));
+        ToscaPolicy policyVal = policiesConceptMap.values().iterator().next();
+
+        // Check metadata
+        assertTrue(policyVal.getMetadata().size() == 1);
+        assertEquals("policy-id", policyVal.getMetadata().entrySet().iterator().next().getKey());
+        assertEquals("onap.restart.tca", policyVal.getMetadata().entrySet().iterator().next().getValue());
 
-        ToscaServiceTemplate serviceTemplate2 = gson.fromJson(reserializedString, ToscaServiceTemplate.class);
-        assertNotNull(serviceTemplate2);
-        assertEquals(serviceTemplate, serviceTemplate2);
+        // Check properties
+        assertTrue(policiesConceptMap.values().iterator().next().getProperties().size() == 1);
+        assertEquals("tca_policy", policyVal.getProperties().keySet().iterator().next());
+        assertNotNull(policyVal.getProperties().values().iterator().next());
     }
 
-    @Test
-    public void testYamlDeserialization() throws JsonSyntaxException, IOException {
-        Yaml yaml = new Yaml();
+    private void verifyVdnsMonitoringInputDeserialization(ToscaServiceTemplate serviceTemplate) {
 
-        String vcpePolicyYaml = ResourceUtils.getResourceAsString("policies/vCPE.policy.monitoring.input.tosca.yaml");
-        Object yamlObject = yaml.load(vcpePolicyYaml);
+        // Sanity check the entire structure
+        assertNotNull(serviceTemplate);
+        LOGGER.info(serviceTemplate.validate(new PfValidationResult()).toString());
+        assertTrue(serviceTemplate.validate(new PfValidationResult()).isValid());
 
-        String yamlAsJsonString = new GsonBuilder().setPrettyPrinting().create().toJson(yamlObject);
+        // Check tosca_definitions_version
+        assertEquals("tosca_simple_yaml_1_0_0",
+                serviceTemplate.getToscaDefinitionsVersion());
 
-        ToscaServiceTemplate serviceTemplate = gson.fromJson(yamlAsJsonString, ToscaServiceTemplate.class);
+        Map<PfConceptKey, ToscaPolicy> policiesConceptMap = serviceTemplate.getTopologyTemplate()
+                .getPolicies().getConceptMap();
+
+        // Check policies
+        assertTrue(policiesConceptMap.size() == 1);
+        assertEquals("onap.scaleout.tca", policiesConceptMap.keySet().iterator().next().getName());
+        assertEquals("onap.scaleout.tca:1.0.0",
+                serviceTemplate.getTopologyTemplate().getPolicies().get("onap.scaleout.tca").getId());
 
+        ToscaPolicy policyVal = policiesConceptMap.values().iterator().next();
+
+        // Check metadata
+        assertTrue(policyVal.getMetadata().size() == 1);
+        assertEquals("policy-id", policyVal.getMetadata().entrySet().iterator().next().getKey());
+        assertEquals("onap.scaleout.tca", policyVal.getMetadata().entrySet().iterator().next().getValue());
+
+        // Check properties
+        assertTrue(policiesConceptMap.values().iterator().next().getProperties().size() == 1);
+        assertEquals("tca_policy", policyVal.getProperties().keySet().iterator().next());
+        assertNotNull(policyVal.getProperties().values().iterator().next());
+    }
+
+    private void verifyVfwMonitoringInputDeserialization(ToscaServiceTemplate serviceTemplate) {
+
+        // Sanity check the entire structure
         assertNotNull(serviceTemplate);
         LOGGER.info(serviceTemplate.validate(new PfValidationResult()).toString());
         assertTrue(serviceTemplate.validate(new PfValidationResult()).isValid());
 
-        assertEquals("onap.restart.tca:1.0.0",
-                serviceTemplate.getTopologyTemplate().getPolicies().get("onap.restart.tca").getId());
+        // Check tosca_definitions_version
+        assertEquals("tosca_simple_yaml_1_0_0",
+                serviceTemplate.getToscaDefinitionsVersion());
+
+        Map<PfConceptKey, ToscaPolicy> policiesConceptMap = serviceTemplate.getTopologyTemplate()
+                .getPolicies().getConceptMap();
+
+        // Check policies
+        assertTrue(policiesConceptMap.size() == 1);
+        assertEquals("onap.vfirewall.tca", policiesConceptMap.keySet().iterator().next().getName());
+        assertEquals("onap.vfirewall.tca:1.0.0",
+                serviceTemplate.getTopologyTemplate().getPolicies().get("onap.vfirewall.tca").getId());
+
+        ToscaPolicy policyVal = policiesConceptMap.values().iterator().next();
+
+        // Check metadata
+        assertTrue(policyVal.getMetadata().size() == 1);
+        assertEquals("policy-id", policyVal.getMetadata().entrySet().iterator().next().getKey());
+        assertEquals("onap.vfirewall.tca", policyVal.getMetadata().entrySet().iterator().next().getValue());
+
+        // Check properties
+        assertTrue(policiesConceptMap.values().iterator().next().getProperties().size() == 1);
+        assertEquals("tca_policy", policyVal.getProperties().keySet().iterator().next());
+        assertNotNull(policyVal.getProperties().values().iterator().next());
+    }
+
+    private void verifyVcpeMonitoringOutputserialization(String serializedServiceTemplate) {
+
+        JsonObject serviceTemplateJsonObject = new JsonParser().parse(serializedServiceTemplate).getAsJsonObject();
+        assertEquals("tosca_simple_yaml_1_0_0", serviceTemplateJsonObject.get("tosca_definitions_version")
+                .getAsString());
+        JsonObject topologyTemplateJsonObject = serviceTemplateJsonObject.get("topology_template")
+                .getAsJsonObject();
+        JsonArray policiesJsonArray = topologyTemplateJsonObject.get("policies").getAsJsonArray();
+        assertTrue(policiesJsonArray.size() == 1);
+        JsonObject policy = policiesJsonArray.iterator().next().getAsJsonObject();
+        assertNotNull(policy.get("onap.restart.tca"));
+        JsonObject policyVal = policy.get("onap.restart.tca").getAsJsonObject();
+        assertEquals("onap.policies.monitoring.cdap.tca.hi.lo.app", policyVal.get("type").getAsString());
+        assertEquals("1.0.0", policyVal.get("version").getAsString());
+        assertEquals("onap.restart.tca", policyVal.get("metadata").getAsJsonObject().get("policy-id")
+                .getAsString());
+        JsonObject properties = policyVal.get("properties").getAsJsonObject();
+        assertNotNull(properties.get("tca_policy"));
+    }
+
+    private void verifyVdnsMonitoringOutputserialization(String serializedServiceTemplate) {
+
+        JsonObject serviceTemplateJsonObject = new JsonParser().parse(serializedServiceTemplate).getAsJsonObject();
+        assertEquals("tosca_simple_yaml_1_0_0", serviceTemplateJsonObject.get("tosca_definitions_version")
+                .getAsString());
+        JsonObject topologyTemplateJsonObject = serviceTemplateJsonObject.get("topology_template").getAsJsonObject();
+        JsonArray policiesJsonArray = topologyTemplateJsonObject.get("policies").getAsJsonArray();
+        assertTrue(policiesJsonArray.size() == 1);
+        JsonObject policy = policiesJsonArray.iterator().next().getAsJsonObject();
+        assertNotNull(policy.get("onap.scaleout.tca"));
+        JsonObject policyVal = policy.get("onap.scaleout.tca").getAsJsonObject();
+        assertEquals("onap.policies.monitoring.cdap.tca.hi.lo.app", policyVal.get("type").getAsString());
+        assertEquals("1.0.0", policyVal.get("version").getAsString());
+        assertEquals("onap.scaleout.tca", policyVal.get("metadata").getAsJsonObject().get("policy-id")
+                .getAsString());
+        JsonObject properties = policyVal.get("properties").getAsJsonObject();
+        assertNotNull(properties.get("tca_policy"));
+    }
 
-        String reserializedString = gson.toJson(serviceTemplate, ToscaServiceTemplate.class);
-        assertEquals(yamlAsJsonString.replaceAll("\\s+", ""), reserializedString.replaceAll("\\s+", ""));
+    private void verifyVfwMonitoringOutputserialization(String serializedServiceTemplate) {
 
-        ToscaServiceTemplate serviceTemplate2 = gson.fromJson(reserializedString, ToscaServiceTemplate.class);
-        assertNotNull(serviceTemplate2);
-        assertEquals(serviceTemplate, serviceTemplate2);
+        JsonObject serviceTemplateJsonObject = new JsonParser().parse(serializedServiceTemplate).getAsJsonObject();
+        assertEquals("tosca_simple_yaml_1_0_0", serviceTemplateJsonObject.get("tosca_definitions_version")
+                .getAsString());
+        JsonObject topologyTemplateJsonObject = serviceTemplateJsonObject.get("topology_template").getAsJsonObject();
+        JsonArray policiesJsonArray = topologyTemplateJsonObject.get("policies").getAsJsonArray();
+        assertTrue(policiesJsonArray.size() == 1);
+        JsonObject policy = policiesJsonArray.iterator().next().getAsJsonObject();
+        assertNotNull(policy.get("onap.vfirewall.tca"));
+        JsonObject policyVal = policy.get("onap.vfirewall.tca").getAsJsonObject();
+        assertEquals("onap.policy.monitoring.cdap.tca.hi.lo.app", policyVal.get("type").getAsString());
+        assertEquals("1.0.0", policyVal.get("version").getAsString());
+        assertEquals("onap.vfirewall.tca", policyVal.get("metadata").getAsJsonObject().get("policy-id")
+                .getAsString());
+        JsonObject properties = policyVal.get("properties").getAsJsonObject();
+        assertNotNull(properties.get("tca_policy"));
     }
 }
diff --git a/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/serialization/MonitoringPolicyTypeSerializationTest.java b/models-tosca/src/test/java/org/onap/policy/models/tosca/simple/serialization/MonitoringPolicyTypeSerializationTest.java
new file mode 100644 (file)
index 0000000..c40b32e
--- /dev/null
@@ -0,0 +1,424 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Nordix Foundation.
+ *  Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.tosca.simple.serialization;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonSyntaxException;
+
+import java.io.IOException;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.common.utils.resources.ResourceUtils;
+import org.onap.policy.models.base.PfConceptKey;
+import org.onap.policy.models.base.PfValidationResult;
+import org.onap.policy.models.tosca.simple.concepts.ToscaConstraintLogicalString;
+import org.onap.policy.models.tosca.simple.concepts.ToscaConstraintValidValues;
+import org.onap.policy.models.tosca.simple.concepts.ToscaDataType;
+import org.onap.policy.models.tosca.simple.concepts.ToscaEntrySchema;
+import org.onap.policy.models.tosca.simple.concepts.ToscaPolicyType;
+import org.onap.policy.models.tosca.simple.concepts.ToscaProperty;
+import org.onap.policy.models.tosca.simple.concepts.ToscaServiceTemplate;
+import org.onap.policy.models.tosca.simple.serialization.ToscaServiceTemplateMessageBodyHandler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.yaml.snakeyaml.Yaml;
+
+/**
+ * Test serialization of monitoring policy types.
+ *
+ * @author Chenfei Gao (cgao@research.att.com)
+ */
+public class MonitoringPolicyTypeSerializationTest {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(MonitoringPolicyTypeSerializationTest.class);
+
+    private static final String MONITORING_TCA_YAML = "policytypes/onap.policy.monitoring.cdap.tca.hi.lo.app.yaml";
+    private static final String MONITORING_COLLECTORS_YAML =
+            "policytypes/onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server.yaml";
+
+    private Gson gson;
+
+    @Before
+    public void setUp() {
+        gson = new ToscaServiceTemplateMessageBodyHandler().getGson();
+    }
+
+    @Test
+    public void testDeserialization() {
+        try {
+            // TCA
+            ToscaServiceTemplate serviceTemplateFromYaml = deserializeMonitoringInputYaml(MONITORING_TCA_YAML);
+            verifyTcaInputDeserialization(serviceTemplateFromYaml);
+
+            // Collector
+            serviceTemplateFromYaml = deserializeMonitoringInputYaml(MONITORING_COLLECTORS_YAML);
+            verifyCollectorInputDeserialization(serviceTemplateFromYaml);
+
+        } catch (Exception e) {
+            fail("No exception should be thrown");
+        }
+    }
+
+    @Test
+    public void testSerialization() {
+        try {
+            // TCA
+            ToscaServiceTemplate serviceTemplateFromYaml = deserializeMonitoringInputYaml(MONITORING_TCA_YAML);
+            String serializedServiceTemplate1 = serializeMonitoringServiceTemplate(serviceTemplateFromYaml);
+            ToscaServiceTemplate serviceTemplateFromJson = gson.fromJson(serializedServiceTemplate1,
+                    ToscaServiceTemplate.class);
+            String serializedServiceTemplate2 = serializeMonitoringServiceTemplate(serviceTemplateFromJson);
+            assertEquals(serializedServiceTemplate1, serializedServiceTemplate2);
+
+            // Collector
+            serviceTemplateFromYaml = deserializeMonitoringInputYaml(MONITORING_COLLECTORS_YAML);
+            serializedServiceTemplate1 = serializeMonitoringServiceTemplate(serviceTemplateFromYaml);
+            serviceTemplateFromJson = gson.fromJson(serializedServiceTemplate1, ToscaServiceTemplate.class);
+            serializedServiceTemplate2 = serializeMonitoringServiceTemplate(serviceTemplateFromJson);
+            assertEquals(serializedServiceTemplate1, serializedServiceTemplate2);
+
+        } catch (Exception e) {
+            fail("No exception should be thrown");
+        }
+    }
+
+    private ToscaServiceTemplate deserializeMonitoringInputYaml(String resourcePath)
+            throws JsonSyntaxException, IOException {
+
+        Yaml yaml = new Yaml();
+        String policyTypeYaml = ResourceUtils.getResourceAsString(resourcePath);
+        Object yamlObject = yaml.load(policyTypeYaml);
+        String yamlAsJsonString = new Gson().toJson(yamlObject);
+        ToscaServiceTemplate serviceTemplate = gson.fromJson(yamlAsJsonString, ToscaServiceTemplate.class);
+        return serviceTemplate;
+    }
+
+    private void verifyTcaInputDeserialization(ToscaServiceTemplate serviceTemplate) {
+
+        // Sanity check the entire structure
+        assertNotNull(serviceTemplate);
+        LOGGER.info(serviceTemplate.validate(new PfValidationResult()).toString());
+        assertTrue(serviceTemplate.validate(new PfValidationResult()).isValid());
+
+        // Check tosca_definitions_version
+        assertEquals("tosca_simple_yaml_1_0_0", serviceTemplate.getToscaDefinitionsVersion());
+
+        // Check policy_types
+        Map<PfConceptKey, ToscaPolicyType> policyTypesConceptMap = serviceTemplate.getPolicyTypes().getConceptMap();
+        assertTrue(policyTypesConceptMap.size() == 2);
+        Iterator<Entry<PfConceptKey, ToscaPolicyType>> policyTypesIter = policyTypesConceptMap.entrySet().iterator();
+
+        Entry<PfConceptKey, ToscaPolicyType> firstPolicyType = policyTypesIter.next();
+        assertEquals("onap.policies.Monitoring", firstPolicyType.getKey().getName());
+        assertEquals("1.0.0", firstPolicyType.getKey().getVersion());
+        assertEquals("tosca.policies.Root", firstPolicyType.getValue().getDerivedFrom().getName());
+        assertEquals("a base policy type for all policies that governs monitoring provisioning",
+                firstPolicyType.getValue().getDescription());
+
+        Entry<PfConceptKey, ToscaPolicyType> secondPolicyType = policyTypesIter.next();
+        assertEquals("onap.policy.monitoring.cdap.tca.hi.lo.app", secondPolicyType.getKey().getName());
+        assertEquals("1.0.0", secondPolicyType.getKey().getVersion());
+        assertEquals("onap.policies.Monitoring", secondPolicyType.getValue().getDerivedFrom().getName());
+        assertTrue(secondPolicyType.getValue().getProperties().size() == 1);
+
+        ToscaProperty property = secondPolicyType.getValue().getProperties().iterator().next();
+        assertEquals("onap.policy.monitoring.cdap.tca.hi.lo.app", property.getKey().getParentKeyName());
+        assertEquals("1.0.0", property.getKey().getParentKeyVersion());
+        assertEquals("tca_policy", property.getKey().getLocalName());
+        assertEquals("map", property.getType().getName());
+        assertEquals("TCA Policy JSON", property.getDescription());
+
+        ToscaEntrySchema entrySchema = property.getEntrySchema();
+        assertEquals("map", entrySchema.getKey().getParentKeyName());
+        assertEquals("1.0.0", entrySchema.getKey().getParentKeyVersion());
+        assertEquals("entry_schema", entrySchema.getKey().getLocalName());
+        assertEquals("onap.datatypes.monitoring.tca_policy", entrySchema.getType().getName());
+
+        // Check data_types
+        Map<PfConceptKey, ToscaDataType> dataTypesConceptMap = serviceTemplate.getDataTypes().getConceptMap();
+        assertTrue(dataTypesConceptMap.size() == 3);
+        Iterator<Entry<PfConceptKey, ToscaDataType>> dataTypesIter = dataTypesConceptMap.entrySet().iterator();
+
+        Entry<PfConceptKey, ToscaDataType> firstDataType = dataTypesIter.next();
+        assertEquals("onap.datatypes.monitoring.metricsPerEventName", firstDataType.getKey().getName());
+        ToscaDataType firstDataTypeVal = firstDataType.getValue();
+        assertEquals("tosca.datatypes.Root", firstDataTypeVal.getDerivedFrom().getName());
+        assertEquals("1.0.0", firstDataTypeVal.getDerivedFrom().getVersion());
+        assertTrue(firstDataTypeVal.getProperties().size() == 6);
+        Iterator<ToscaProperty> firstDataTypePropertiesIter = firstDataTypeVal.getProperties().iterator();
+
+        ToscaProperty firstDataTypeFirstProperty = firstDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.metricsPerEventName", firstDataTypeFirstProperty.getKey()
+                .getParentKeyName());
+        assertEquals("controlLoopSchemaType", firstDataTypeFirstProperty.getKey().getLocalName());
+        assertEquals("string", firstDataTypeFirstProperty.getType().getName());
+        assertTrue(firstDataTypeFirstProperty.isRequired());
+        assertEquals("Specifies Control Loop Schema Type for the event Name e.g. VNF, VM",
+                firstDataTypeFirstProperty.getDescription());
+        assertTrue(firstDataTypeFirstProperty.getConstraints().size() == 1);
+        assertEquals("valid_values", firstDataTypeFirstProperty.getConstraints().iterator().next().getKey()
+                .getLocalName());
+        assertEquals("string", firstDataTypeFirstProperty.getConstraints().iterator().next().getKey()
+                .getParentKeyName());
+        assertTrue(firstDataTypeFirstProperty.getConstraints().iterator().next()
+                instanceof ToscaConstraintValidValues);
+        assertTrue(((ToscaConstraintValidValues)(firstDataTypeFirstProperty.getConstraints().iterator().next()))
+                .getValidValues().size() == 2);
+
+        ToscaProperty firstDataTypeSecondProperty = firstDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.metricsPerEventName", firstDataTypeSecondProperty.getKey()
+                .getParentKeyName());
+        assertEquals("eventName", firstDataTypeSecondProperty.getKey().getLocalName());
+        assertEquals("string", firstDataTypeSecondProperty.getType().getName());
+        assertTrue(firstDataTypeSecondProperty.isRequired());
+        assertEquals("Event name to which thresholds need to be applied", firstDataTypeSecondProperty
+                .getDescription());
+
+        ToscaProperty firstDataTypeThirdProperty = firstDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.metricsPerEventName", firstDataTypeThirdProperty.getKey()
+                .getParentKeyName());
+        assertEquals("policyName", firstDataTypeThirdProperty.getKey().getLocalName());
+        assertEquals("string", firstDataTypeThirdProperty.getType().getName());
+        assertTrue(firstDataTypeThirdProperty.isRequired());
+        assertEquals("TCA Policy Scope Name", firstDataTypeThirdProperty.getDescription());
+
+        ToscaProperty firstDataTypeFourthProperty = firstDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.metricsPerEventName", firstDataTypeFourthProperty.getKey()
+                .getParentKeyName());
+        assertEquals("policyScope", firstDataTypeFourthProperty.getKey().getLocalName());
+        assertEquals("string", firstDataTypeFourthProperty.getType().getName());
+        assertTrue(firstDataTypeFourthProperty.isRequired());
+        assertEquals("TCA Policy Scope", firstDataTypeFourthProperty.getDescription());
+
+        ToscaProperty firstDataTypeFifthProperty = firstDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.metricsPerEventName", firstDataTypeFifthProperty.getKey()
+                .getParentKeyName());
+        assertEquals("policyVersion", firstDataTypeFifthProperty.getKey().getLocalName());
+        assertEquals("string", firstDataTypeFifthProperty.getType().getName());
+        assertTrue(firstDataTypeFifthProperty.isRequired());
+        assertEquals("TCA Policy Scope Version", firstDataTypeFifthProperty.getDescription());
+
+        ToscaProperty firstDataTypeSixthProperty = firstDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.metricsPerEventName", firstDataTypeSixthProperty.getKey()
+                .getParentKeyName());
+        assertEquals("thresholds", firstDataTypeSixthProperty.getKey().getLocalName());
+        assertEquals("list", firstDataTypeSixthProperty.getType().getName());
+        assertTrue(firstDataTypeSixthProperty.isRequired());
+        assertEquals("Thresholds associated with eventName", firstDataTypeSixthProperty.getDescription());
+        assertNotNull(firstDataTypeSixthProperty.getEntrySchema());
+        assertEquals("entry_schema", firstDataTypeSixthProperty.getEntrySchema().getKey().getLocalName());
+        assertEquals("list", firstDataTypeSixthProperty.getEntrySchema().getKey().getParentKeyName());
+        assertEquals("onap.datatypes.monitoring.thresholds", firstDataTypeSixthProperty.getEntrySchema().getType()
+                .getName());
+
+        Entry<PfConceptKey, ToscaDataType> secondDataType = dataTypesIter.next();
+        assertEquals("onap.datatypes.monitoring.tca_policy", secondDataType.getKey().getName());
+        ToscaDataType secondDataTypeVal = secondDataType.getValue();
+        assertEquals("tosca.datatypes.Root", secondDataTypeVal.getDerivedFrom().getName());
+        assertEquals("1.0.0", secondDataTypeVal.getDerivedFrom().getVersion());
+        assertTrue(secondDataTypeVal.getProperties().size() == 2);
+        Iterator<ToscaProperty> secondDataTypePropertiesIter = secondDataTypeVal.getProperties().iterator();
+
+        ToscaProperty secondDataTypeFirstProperty = secondDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.tca_policy", secondDataTypeFirstProperty.getKey().getParentKeyName());
+        assertEquals("domain", secondDataTypeFirstProperty.getKey().getLocalName());
+        assertEquals("string", secondDataTypeFirstProperty.getType().getName());
+        assertTrue(secondDataTypeFirstProperty.isRequired());
+        assertEquals("Domain name to which TCA needs to be applied", secondDataTypeFirstProperty.getDescription());
+        assertEquals("measurementsForVfScaling", secondDataTypeFirstProperty.getDefaultValue());
+        assertTrue(secondDataTypeFirstProperty.getConstraints().size() == 1);
+        assertEquals("string", secondDataTypeFirstProperty.getConstraints().iterator().next().getKey()
+                .getParentKeyName());
+        assertEquals("equal", secondDataTypeFirstProperty.getConstraints().iterator().next().getKey().getLocalName());
+        assertTrue(secondDataTypeFirstProperty.getConstraints().iterator().next()
+                instanceof ToscaConstraintLogicalString);
+        assertEquals("measurementsForVfScaling", ((ToscaConstraintLogicalString)(secondDataTypeFirstProperty
+                .getConstraints().iterator().next())).getCompareToString());
+
+        ToscaProperty secondDataTypeSecondProperty = secondDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.tca_policy", secondDataTypeSecondProperty.getKey().getParentKeyName());
+        assertEquals("metricsPerEventName", secondDataTypeSecondProperty.getKey().getLocalName());
+        assertEquals("list", secondDataTypeSecondProperty.getType().getName());
+        assertTrue(secondDataTypeSecondProperty.isRequired());
+        assertEquals("Contains eventName and threshold details that need to be applied to given eventName",
+                secondDataTypeSecondProperty.getDescription());
+        assertNotNull(secondDataTypeSecondProperty.getEntrySchema());
+        assertEquals("list", secondDataTypeSecondProperty.getEntrySchema().getKey().getParentKeyName());
+        assertEquals("onap.datatypes.monitoring.metricsPerEventName",
+                secondDataTypeSecondProperty.getEntrySchema().getType().getName());
+        assertEquals("entry_schema", secondDataTypeSecondProperty.getEntrySchema().getKey().getLocalName());
+
+        Entry<PfConceptKey, ToscaDataType> thirdDataType = dataTypesIter.next();
+        assertEquals("onap.datatypes.monitoring.thresholds", thirdDataType.getKey().getName());
+        ToscaDataType thirdDataTypeVal = thirdDataType.getValue();
+        assertEquals("tosca.datatypes.Root", thirdDataTypeVal.getDerivedFrom().getName());
+        assertEquals("1.0.0", thirdDataTypeVal.getDerivedFrom().getVersion());
+        assertTrue(thirdDataTypeVal.getProperties().size() == 7);
+        Iterator<ToscaProperty> thirdDataTypePropertiesIter = thirdDataTypeVal.getProperties().iterator();
+
+        ToscaProperty thirdDataTypeFirstProperty = thirdDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.thresholds", thirdDataTypeFirstProperty.getKey().getParentKeyName());
+        assertEquals("closedLoopControlName", thirdDataTypeFirstProperty.getKey().getLocalName());
+        assertEquals("string", thirdDataTypeFirstProperty.getType().getName());
+        assertTrue(thirdDataTypeFirstProperty.isRequired());
+        assertEquals("Closed Loop Control Name associated with the threshold", thirdDataTypeFirstProperty
+                .getDescription());
+
+        ToscaProperty thirdDataTypeSecondProperty = thirdDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.thresholds", thirdDataTypeSecondProperty.getKey().getParentKeyName());
+        assertEquals("closedLoopEventStatus", thirdDataTypeSecondProperty.getKey().getLocalName());
+        assertEquals("string", thirdDataTypeSecondProperty.getType().getName());
+        assertTrue(thirdDataTypeSecondProperty.isRequired());
+        assertEquals("Closed Loop Event Status of the threshold", thirdDataTypeSecondProperty.getDescription());
+        assertNotNull(thirdDataTypeSecondProperty.getConstraints());
+        assertTrue(thirdDataTypeSecondProperty.getConstraints().size() == 1);
+        assertEquals("string", thirdDataTypeSecondProperty.getConstraints().iterator().next().getKey()
+                .getParentKeyName());
+        assertEquals("valid_values", thirdDataTypeSecondProperty.getConstraints().iterator().next().getKey()
+                .getLocalName());
+        assertTrue(thirdDataTypeSecondProperty.getConstraints().iterator().next()
+                instanceof ToscaConstraintValidValues);
+        assertTrue(((ToscaConstraintValidValues)(thirdDataTypeSecondProperty.getConstraints().iterator().next()))
+                .getValidValues().size() == 2);
+
+        ToscaProperty thirdDataTypeThirdProperty = thirdDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.thresholds", thirdDataTypeThirdProperty.getKey().getParentKeyName());
+        assertEquals("direction", thirdDataTypeThirdProperty.getKey().getLocalName());
+        assertEquals("string", thirdDataTypeThirdProperty.getType().getName());
+        assertTrue(thirdDataTypeThirdProperty.isRequired());
+        assertEquals("Direction of the threshold", thirdDataTypeThirdProperty.getDescription());
+        assertNotNull(thirdDataTypeThirdProperty.getConstraints());
+        assertTrue(thirdDataTypeThirdProperty.getConstraints().size() == 1);
+        assertEquals("string", thirdDataTypeThirdProperty.getConstraints().iterator().next().getKey()
+                .getParentKeyName());
+        assertEquals("valid_values", thirdDataTypeThirdProperty.getConstraints().iterator().next().getKey()
+                .getLocalName());
+        assertTrue(((ToscaConstraintValidValues)(thirdDataTypeThirdProperty.getConstraints().iterator().next()))
+                .getValidValues().size() == 5);
+
+        ToscaProperty thirdDataTypeFourthProperty = thirdDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.thresholds", thirdDataTypeFourthProperty.getKey().getParentKeyName());
+        assertEquals("fieldPath", thirdDataTypeFourthProperty.getKey().getLocalName());
+        assertEquals("string", thirdDataTypeFourthProperty.getType().getName());
+        assertTrue(thirdDataTypeFourthProperty.isRequired());
+        assertEquals("Json field Path as per CEF message which needs to be analyzed for TCA",
+                thirdDataTypeFourthProperty.getDescription());
+        assertNotNull(thirdDataTypeFourthProperty.getConstraints());
+        assertTrue(thirdDataTypeFourthProperty.getConstraints().size() == 1);
+        assertEquals("string", thirdDataTypeFourthProperty.getConstraints().iterator().next().getKey()
+                .getParentKeyName());
+        assertEquals("valid_values", thirdDataTypeFourthProperty.getConstraints().iterator().next().getKey()
+                .getLocalName());
+        assertTrue(((ToscaConstraintValidValues)(thirdDataTypeFourthProperty.getConstraints().iterator().next()))
+                .getValidValues().size() == 43);
+
+        ToscaProperty thirdDataTypeFifthProperty = thirdDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.thresholds", thirdDataTypeFifthProperty.getKey().getParentKeyName());
+        assertEquals("severity", thirdDataTypeFifthProperty.getKey().getLocalName());
+        assertEquals("string", thirdDataTypeFifthProperty.getType().getName());
+        assertTrue(thirdDataTypeFifthProperty.isRequired());
+        assertEquals("Threshold Event Severity", thirdDataTypeFifthProperty.getDescription());
+        assertNotNull(thirdDataTypeFifthProperty.getConstraints());
+        assertTrue(thirdDataTypeFifthProperty.getConstraints().size() == 1);
+        assertEquals("string", thirdDataTypeFifthProperty.getConstraints().iterator().next().getKey()
+                .getParentKeyName());
+        assertEquals("valid_values", thirdDataTypeFifthProperty.getConstraints().iterator().next().getKey()
+                .getLocalName());
+        assertTrue(((ToscaConstraintValidValues)(thirdDataTypeFifthProperty.getConstraints().iterator().next()))
+                .getValidValues().size() == 5);;
+
+        ToscaProperty thirdDataTypeSixthProperty = thirdDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.thresholds", thirdDataTypeSixthProperty.getKey().getParentKeyName());
+        assertEquals("thresholdValue", thirdDataTypeSixthProperty.getKey().getLocalName());
+        assertEquals("integer", thirdDataTypeSixthProperty.getType().getName());
+        assertTrue(thirdDataTypeSixthProperty.isRequired());
+        assertEquals("Threshold value for the field Path inside CEF message", thirdDataTypeSixthProperty
+                .getDescription());
+
+        ToscaProperty thirdDataTypeSeventhProperty = thirdDataTypePropertiesIter.next();
+        assertEquals("onap.datatypes.monitoring.thresholds", thirdDataTypeSeventhProperty.getKey().getParentKeyName());
+        assertEquals("version", thirdDataTypeSeventhProperty.getKey().getLocalName());
+        assertEquals("string", thirdDataTypeSeventhProperty.getType().getName());
+        assertTrue(thirdDataTypeSeventhProperty.isRequired());
+        assertEquals("Version number associated with the threshold", thirdDataTypeSeventhProperty.getDescription());
+    }
+
+    private void verifyCollectorInputDeserialization(ToscaServiceTemplate serviceTemplate) {
+
+        // Sanity check the entire structure
+        assertNotNull(serviceTemplate);
+        LOGGER.info(serviceTemplate.validate(new PfValidationResult()).toString());
+        assertTrue(serviceTemplate.validate(new PfValidationResult()).isValid());
+
+        // Check tosca_definitions_version
+        assertEquals("tosca_simple_yaml_1_0_0", serviceTemplate.getToscaDefinitionsVersion());
+
+        // Check policy_types
+        Map<PfConceptKey, ToscaPolicyType> policyTypesConceptMap = serviceTemplate.getPolicyTypes().getConceptMap();
+        assertTrue(policyTypesConceptMap.size() == 2);
+        Iterator<Entry<PfConceptKey, ToscaPolicyType>> policyTypesIter = policyTypesConceptMap.entrySet().iterator();
+
+        Entry<PfConceptKey, ToscaPolicyType> firstPolicyType = policyTypesIter.next();
+        assertEquals("onap.policies.Monitoring", firstPolicyType.getKey().getName());
+        assertEquals("1.0.0", firstPolicyType.getKey().getVersion());
+        assertEquals("tosca.policies.Root", firstPolicyType.getValue().getDerivedFrom().getName());
+        assertEquals("a base policy type for all policies that govern monitoring provision",
+                firstPolicyType.getValue().getDescription());
+
+        Entry<PfConceptKey, ToscaPolicyType> secondPolicyType = policyTypesIter.next();
+        assertEquals("onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server",
+                secondPolicyType.getKey().getName());
+        assertEquals("1.0.0", secondPolicyType.getKey().getVersion());
+        assertEquals("policy.nodes.Root", secondPolicyType.getValue().getDerivedFrom().getName());
+        assertTrue(secondPolicyType.getValue().getProperties().size() == 2);
+
+        Iterator<ToscaProperty> propertiesIter = secondPolicyType.getValue().getProperties().iterator();
+
+        ToscaProperty firstProperty = propertiesIter.next();
+        assertEquals("onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server",
+                firstProperty.getKey().getParentKeyName());
+        assertEquals("1.0.0", firstProperty.getKey().getParentKeyVersion());
+        assertEquals("buscontroller_feed_publishing_endpoint", firstProperty.getKey().getLocalName());
+        assertEquals("string", firstProperty.getType().getName());
+        assertEquals("DMAAP Bus Controller feed endpoint", firstProperty.getDescription());
+
+        ToscaProperty secondProperty = propertiesIter.next();
+        assertEquals("onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server",
+                secondProperty.getKey().getParentKeyName());
+        assertEquals("1.0.0", secondProperty.getKey().getParentKeyVersion());
+        assertEquals("datafile.policy", secondProperty.getKey().getLocalName());
+        assertEquals("string", secondProperty.getType().getName());
+        assertEquals("datafile Policy JSON as string", secondProperty.getDescription());
+    }
+
+    private String serializeMonitoringServiceTemplate(ToscaServiceTemplate serviceTemplate) {
+        return gson.toJson(serviceTemplate);
+    }
+}
\ No newline at end of file