Merge "Add ErrorResponse to policy framework exceptions"
authorPamela Dragosh <pdragosh@research.att.com>
Tue, 26 Mar 2019 17:08:31 +0000 (17:08 +0000)
committerGerrit Code Review <gerrit@onap.org>
Tue, 26 Mar 2019 17:08:31 +0000 (17:08 +0000)
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