Add yaml support for policy & policy types

Adding support for yaml format of policy & policy types in distribution.
So that users can either define them in json or yaml format.
And then distribute to policy framework.

Issue-ID: POLICY-3509
Change-Id: Ifba7486bbc1e6876f0e3e39b0ae5ebe043567029
Signed-off-by: Ram Krishna Verma <ram_krishna.verma@bell.ca>
diff --git a/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicy.java b/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicy.java
index a552bbc..72316f2 100644
--- a/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicy.java
+++ b/plugins/reception-plugins/src/main/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicy.java
@@ -33,6 +33,7 @@
 import org.onap.policy.common.parameters.ParameterService;
 import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.coder.StandardCoder;
+import org.onap.policy.common.utils.coder.StandardYamlCoder;
 import org.onap.policy.distribution.model.Csar;
 import org.onap.policy.distribution.model.PolicyInput;
 import org.onap.policy.distribution.reception.decoding.PolicyDecoder;
@@ -49,6 +50,7 @@
 
     private PolicyDecoderFileInCsarToPolicyParameterGroup decoderParameters;
     private StandardCoder coder;
+    private StandardYamlCoder yamlCoder;
     private static final long MAX_FILE_SIZE = 512L * 1024;
 
     /**
@@ -58,6 +60,7 @@
     public void configure(final String parameterGroupName) {
         decoderParameters = ParameterService.get(parameterGroupName);
         coder = new StandardCoder();
+        yamlCoder = new StandardYamlCoder();
     }
 
     /**
@@ -86,7 +89,7 @@
                 final ZipEntry entry = entries.nextElement(); // NOSONAR
                 if (isZipEntryValid(entry.getName(), csar.getCsarFilePath(), entry.getSize())) {
                     final ToscaServiceTemplate policy =
-                            coder.decode(zipFile.getInputStream(entry), ToscaServiceTemplate.class);
+                            decodeFile(zipFile, entry);
                     policyList.add(policy);
                 }
             }
@@ -135,4 +138,22 @@
 
         return false;
     }
+
+    /**
+     * Method to decode either a json or yaml file into an object.
+     *
+     * @param zipFile the zip file
+     * @param entry the entry to read in the zip file.
+     * @return the decoded ToscaServiceTemplate object.
+     * @throws CoderException IOException if the file decoding fails.
+     */
+    private ToscaServiceTemplate decodeFile(ZipFile zipFile, final ZipEntry entry) throws IOException, CoderException {
+        ToscaServiceTemplate policy = null;
+        if (entry.getName().endsWith(".json")) {
+            policy = coder.decode(zipFile.getInputStream(entry), ToscaServiceTemplate.class);
+        } else if (entry.getName().endsWith(".yaml")) {
+            policy = yamlCoder.decode(zipFile.getInputStream(entry), ToscaServiceTemplate.class);
+        }
+        return policy;
+    }
 }
diff --git a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyTest.java b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyTest.java
index 812ef6d..e76e9f3 100644
--- a/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyTest.java
+++ b/plugins/reception-plugins/src/test/java/org/onap/policy/distribution/reception/decoding/policy/file/PolicyDecoderFileInCsarToPolicyTest.java
@@ -81,6 +81,20 @@
     }
 
     @Test
+    public void testDecodeYamlPolicy() throws PolicyDecodingException {
+
+        final PolicyDecoderFileInCsarToPolicy decoder = new PolicyDecoderFileInCsarToPolicy();
+        decoder.configure(PolicyDecoderFileInCsarToPolicyParameterGroup.class.getSimpleName());
+
+        final File file = new File("src/test/resources/service-Sampleservice-yaml.csar");
+        final Csar csar = new Csar(file.getAbsolutePath());
+
+        assertTrue(decoder.canHandle(csar));
+        final Collection<ToscaEntity> policyHolders = decoder.decode(csar);
+        assertEquals(2, policyHolders.size());
+    }
+
+    @Test
     public void testDecodePolicyZipError() {
 
         final PolicyDecoderFileInCsarToPolicy decoder = new PolicyDecoderFileInCsarToPolicy();
diff --git a/plugins/reception-plugins/src/test/resources/service-Sampleservice-yaml.csar b/plugins/reception-plugins/src/test/resources/service-Sampleservice-yaml.csar
new file mode 100644
index 0000000..386dbee
--- /dev/null
+++ b/plugins/reception-plugins/src/test/resources/service-Sampleservice-yaml.csar
Binary files differ