Rework some sonar critical and major bugs

Class renamed to AbstractModelELement, exceptions reworked and IT tests
as well

Change-Id: Ief2b09b0e36776519338834e2af61aa6e638ee91
Issue-Id: CLAMP-43
Signed-off-by: Determe, Sebastien (sd378r) <sd378r@intl.att.com>
diff --git a/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDelegate.java b/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDelegate.java
index db7b524..c42a22c 100644
--- a/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDelegate.java
+++ b/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDelegate.java
@@ -61,7 +61,7 @@
         ModelProperties prop = ModelProperties.create(execution);
         Holmes holmes = prop.getType(Holmes.class);
         if (holmes.isFound()) {
-            String responseMessage = policyClient.sendMicroServiceInJson(holmes.getCorrelationLogic(), prop,
+            String responseMessage = policyClient.sendBasePolicyInOther(holmes.getCorrelationLogic(), prop,
                     holmesPolicyRequestUuid);
             if (responseMessage != null) {
                 execution.setVariable("holmesPolicyResponseMessage", responseMessage.getBytes());
diff --git a/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDeleteDelegate.java b/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDeleteDelegate.java
index 46b33ff..c3c91fa 100644
--- a/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDeleteDelegate.java
+++ b/src/main/java/org/onap/clamp/clds/client/HolmesPolicyDeleteDelegate.java
@@ -55,7 +55,7 @@
         if (holmes.isFound()) {
             prop.setCurrentModelElementId(holmes.getId());
 
-            policyClient.deleteMicrosService(prop);
+            policyClient.deleteBasePolicy(prop);
         }
     }
 
diff --git a/src/main/java/org/onap/clamp/clds/client/PolicyClient.java b/src/main/java/org/onap/clamp/clds/client/PolicyClient.java
index 2b49a8f..2bd680a 100644
--- a/src/main/java/org/onap/clamp/clds/client/PolicyClient.java
+++ b/src/main/java/org/onap/clamp/clds/client/PolicyClient.java
@@ -31,13 +31,13 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
 import javax.ws.rs.BadRequestException;
 
+import org.onap.clamp.clds.exception.policy.PolicyClientException;
 import org.onap.clamp.clds.model.prop.ModelProperties;
 import org.onap.clamp.clds.model.refprop.RefProp;
 import org.onap.clamp.clds.util.LoggingUtils;
@@ -47,6 +47,7 @@
 import org.onap.policy.api.DeletePolicyParameters;
 import org.onap.policy.api.PolicyChangeResponse;
 import org.onap.policy.api.PolicyConfig;
+import org.onap.policy.api.PolicyConfigException;
 import org.onap.policy.api.PolicyConfigType;
 import org.onap.policy.api.PolicyEngine;
 import org.onap.policy.api.PolicyEngineException;
@@ -66,11 +67,11 @@
     protected static final String     POLICY_PREFIX_BRMS_PARAM   = "Config_BRMS_Param_";
     protected static final String     POLICY_PREFIX_MICROSERVICE = "Config_MS_";
 
-    protected static final String     LOG_POLICY_PREFIX = "Response is ";
+    protected static final String     LOG_POLICY_PREFIX          = "Response is ";
 
     protected static final EELFLogger logger                     = EELFManager.getInstance()
             .getLogger(PolicyClient.class);
-    protected static final EELFLogger metricsLogger = EELFManager.getInstance().getMetricsLogger();
+    protected static final EELFLogger metricsLogger              = EELFManager.getInstance().getMetricsLogger();
 
     @Value("${org.onap.clamp.config.files.cldsPolicyConfig:'classpath:/clds/clds-policy-config.properties'}")
     protected String                  cldsPolicyConfigFile;
@@ -91,14 +92,10 @@
      * @param policyRequestUuid
      *            PolicyRequest UUID
      * @return The response message of policy
-     * @throws IOException
-     *             In case of issues with the Stream
-     * @throws PolicyEngineException
-     *             In case of issues with the PolicyEngine class
      * 
      */
     public String sendBrmsPolicy(Map<AttributeType, Map<String, String>> attributes, ModelProperties prop,
-            String policyRequestUuid) throws PolicyEngineException, IOException {
+            String policyRequestUuid) {
 
         PolicyParameters policyParameters = new PolicyParameters();
 
@@ -136,13 +133,8 @@
      * @param policyRequestUuid
      *            The policy Request UUID
      * @return The response message of policy
-     * @throws PolicyEngineException
-     *             In case of issues with the policy engine class creation
-     * @throws IOException
-     *             In case of issue with the Stream
      */
-    public String sendMicroServiceInJson(String policyJson, ModelProperties prop, String policyRequestUuid)
-            throws IOException, PolicyEngineException {
+    public String sendMicroServiceInJson(String policyJson, ModelProperties prop, String policyRequestUuid) {
 
         PolicyParameters policyParameters = new PolicyParameters();
 
@@ -177,14 +169,9 @@
      *            The ModelProperties
      * @param policyRequestUuid
      *            The policy request UUID
-     * @return
-     * @throws IOException
-     *             In case of issues with the policy engine class creation
-     * @throws PolicyEngineException
-     *             In case of issue with the Stream
+     * @return The answer from policy call
      */
-    public String sendBasePolicyInOther(String configBody, ModelProperties prop, String policyRequestUuid)
-            throws IOException, PolicyEngineException {
+    public String sendBasePolicyInOther(String configBody, ModelProperties prop, String policyRequestUuid) {
 
         PolicyParameters policyParameters = new PolicyParameters();
 
@@ -216,22 +203,15 @@
      *            The PolicyParameters
      * @param prop
      *            The ModelProperties
-     * @return THe response message of Policy
-     * @throws IOException
-     *             In case of issues with the Stream
-     * @throws PolicyEngineException
-     *             In case of issue when creating PolicyEngine class
+     * @return The response message of Policy
+     * @throws Exception
      */
-    protected String send(PolicyParameters policyParameters, ModelProperties prop, String policyNamePrefix)
-            throws IOException, PolicyEngineException {
+    protected String send(PolicyParameters policyParameters, ModelProperties prop, String policyNamePrefix) {
         // Verify whether it is triggered by Validation Test button from UI
         if (prop.isTest()) {
             return "send not executed for test action";
         }
 
-        PolicyEngine policyEngine = new PolicyEngine(
-                appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath());
-
         // API method to create or update Policy.
         PolicyChangeResponse response = null;
         String responseMessage = "";
@@ -241,22 +221,23 @@
             if (versions.isEmpty()) {
                 LoggingUtils.setTargetContext("Policy", "createPolicy");
                 logger.info("Attempting to create policy for action=" + prop.getActionCd());
-                response = policyEngine.createPolicy(policyParameters);
+                response = getPolicyEngine().createPolicy(policyParameters);
                 responseMessage = response.getResponseMessage();
             } else {
                 LoggingUtils.setTargetContext("Policy", "updatePolicy");
                 logger.info("Attempting to update policy for action=" + prop.getActionCd());
-                response = policyEngine.updatePolicy(policyParameters);
+                response = getPolicyEngine().updatePolicy(policyParameters);
                 responseMessage = response.getResponseMessage();
             }
         } catch (Exception e) {
             logger.error("Exception occurred during policy communication", e);
+            throw new PolicyClientException("Exception while communicating with Policy", e);
         }
         logger.info(LOG_POLICY_PREFIX + responseMessage);
 
         LoggingUtils.setTimeContext(startTime, new Date());
 
-        if (response != null && response.getResponseCode() == 200) {
+        if (response.getResponseCode() == 200) {
             logger.info("Policy send successful");
             metricsLogger.info("Policy send success");
         } else {
@@ -276,12 +257,8 @@
      * @param prop
      *            The ModelProperties
      * @return The response message of policy
-     * @throws IOException
-     *             In case of issues with the stream
-     * @throws PolicyEngineException
-     *             In case of issues with the PolicyEngine creation
      */
-    protected String push(String policyType, ModelProperties prop) throws PolicyEngineException, IOException {
+    protected String push(String policyType, ModelProperties prop) {
         // Verify whether it is triggered by Validation Test button from UI
         if (prop.isTest()) {
             return "push not executed for test action";
@@ -301,15 +278,12 @@
         pushPolicyParameters.setPdpGroup(refProp.getStringValue("policy.pdp.group"));
         pushPolicyParameters.setRequestID(null);
 
-        PolicyEngine policyEngine = new PolicyEngine(
-                appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath());
-
         // API method to create or update Policy.
         PolicyChangeResponse response = null;
         String responseMessage = "";
         try {
             logger.info("Attempting to push policy...");
-            response = policyEngine.pushPolicy(pushPolicyParameters);
+            response = getPolicyEngine().pushPolicy(pushPolicyParameters);
             responseMessage = response.getResponseMessage();
         } catch (Exception e) {
             logger.error("Exception occurred during policy communication", e);
@@ -335,13 +309,10 @@
      * @param prop
      *            The ModelProperties
      * @return The response message from policy
-     * @throws IOException
-     *             In case of issues with the stream
-     * @throws PolicyEngineException
-     *             In case of issues with the PolicyEngine creation
+     * @throws PolicyConfigException
+     *             In case of issues with policy engine
      */
-    protected List<Integer> getVersions(String policyNamePrefix, ModelProperties prop)
-            throws PolicyEngineException, IOException {
+    protected List<Integer> getVersions(String policyNamePrefix, ModelProperties prop) throws PolicyConfigException {
 
         ArrayList<Integer> versions = new ArrayList<>();
         ConfigRequestParameters configRequestParameters = new ConfigRequestParameters();
@@ -356,46 +327,42 @@
         logger.info("policyName=" + policyName);
         configRequestParameters.setPolicyName(policyName);
 
-        PolicyEngine policyEngine = new PolicyEngine(
-                appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath());
-
-        try {
-            Collection<PolicyConfig> response = policyEngine.getConfig(configRequestParameters);
-            Iterator<PolicyConfig> itrResp = response.iterator();
-
-            while (itrResp.hasNext()) {
-                PolicyConfig policyConfig = itrResp.next();
-                try {
-                    Integer version = new Integer(policyConfig.getPolicyVersion());
-                    versions.add(version);
-                } catch (Exception e) {
-                    // just print warning - if n;o policies, version may be null
-                    logger.warn("Failed to parse due to an exception policyConfig.getPolicyVersion()="
-                            + policyConfig.getPolicyVersion(), e);
-                }
-            }
-            Collections.sort(versions);
-            logger.info("Policy versions.size()=" + versions.size());
-        } catch (Exception e) {
-            // just print warning - if no policy version found
-            logger.warn("warning: policy not found...policy name - " + policyName, e);
+        Collection<PolicyConfig> response = getPolicyEngine().getConfig(configRequestParameters);
+        for (PolicyConfig policyConfig : response) {
+            Integer version = Integer.valueOf(policyConfig.getPolicyVersion());
+            versions.add(version);
         }
+        Collections.sort(versions);
+        logger.info("Policy versions.size()=" + versions.size());
 
         return versions;
     }
 
     /**
+     * This method create a new policy engine.
+     * 
+     * @return A new policy engine
+     */
+    private PolicyEngine getPolicyEngine() {
+        PolicyEngine policyEngine;
+        try {
+            policyEngine = new PolicyEngine(appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath());
+        } catch (IOException e1) {
+            throw new PolicyClientException("Exception when opening policy config file", e1);
+        } catch (PolicyEngineException e) {
+            throw new PolicyClientException("Exception when creating a new policy engine", e);
+        }
+        return policyEngine;
+    }
+
+    /**
      * Format and send delete Micro Service requests to Policy.
      *
      * @param prop
      *            The ModelProperties
      * @return The response message from Policy
-     * @throws IOException
-     *             In case of issues with the stream
-     * @throws PolicyEngineException
-     *             In case of issues with the PolicyEngine creation
      */
-    public String deleteMicrosService(ModelProperties prop) throws PolicyEngineException, IOException {
+    public String deleteMicrosService(ModelProperties prop) {
         String policyType = refProp.getStringValue("policy.ms.type");
         return deletePolicy(prop, policyType);
     }
@@ -403,12 +370,11 @@
     /**
      * This method delete the Base policy.
      *
-     * @param prop The model Properties
+     * @param prop
+     *            The model Properties
      * @return A string with the answer from policy
-     * @throws PolicyEngineException In case of issues with the policy engine
-     * @throws IOException In case of issues with the stream
      */
-    public String deleteBasePolicy(ModelProperties prop) throws PolicyEngineException, IOException {
+    public String deleteBasePolicy(ModelProperties prop) {
         return deletePolicy(prop, PolicyConfigType.Base.toString());
     }
 
@@ -418,12 +384,8 @@
      * @param prop
      *            The ModelProperties
      * @return The response message from policy
-     * @throws IOException
-     *             In case of issues with the stream
-     * @throws PolicyEngineException
-     *             In case of issues with the PolicyEngine creation
      */
-    public String deleteBrms(ModelProperties prop) throws PolicyEngineException, IOException {
+    public String deleteBrms(ModelProperties prop) {
         String policyType = refProp.getStringValue("policy.op.type");
         return deletePolicy(prop, policyType);
     }
@@ -435,12 +397,8 @@
      *            The ModelProperties
      *
      * @return The response message from policy
-     * @throws IOException
-     *             in case of issues with the Stream
-     * @throws PolicyEngineException
-     *             In case of issues with the PolicyEngine class creation
      */
-    protected String deletePolicy(ModelProperties prop, String policyType) throws PolicyEngineException, IOException {
+    protected String deletePolicy(ModelProperties prop, String policyType) {
         DeletePolicyParameters deletePolicyParameters = new DeletePolicyParameters();
 
         if (prop.getPolicyUniqueId() != null && !prop.getPolicyUniqueId().isEmpty()) {
@@ -454,16 +412,16 @@
         deletePolicyParameters.setPdpGroup(refProp.getStringValue("policy.pdp.group"));
         deletePolicyParameters.setPolicyType(policyType);
         // send delete request
-        String responseMessage = sendDeletePolicy(deletePolicyParameters, prop);
+        StringBuilder responseMessage = new StringBuilder(sendDeletePolicy(deletePolicyParameters, prop));
 
         logger.info("Deleting policy from PAP...");
         deletePolicyParameters.setPolicyComponent("PAP");
         deletePolicyParameters.setDeleteCondition(DeletePolicyCondition.ALL);
 
         // send delete request
-        responseMessage = sendDeletePolicy(deletePolicyParameters, prop);
+        responseMessage.append(sendDeletePolicy(deletePolicyParameters, prop));
 
-        return responseMessage;
+        return responseMessage.toString();
     }
 
     /**
@@ -474,26 +432,19 @@
      * @param prop
      *            The ModelProperties
      * @return The response message from policy
-     * @throws IOException
-     *             In case of issues with the stream
-     * @throws PolicyEngineException
-     *             In case of issues with PolicyEngine class creation
      */
-    protected String sendDeletePolicy(DeletePolicyParameters deletePolicyParameters, ModelProperties prop)
-            throws PolicyEngineException, IOException {
+    protected String sendDeletePolicy(DeletePolicyParameters deletePolicyParameters, ModelProperties prop) {
         // Verify whether it is triggered by Validation Test button from UI
         if (prop.isTest()) {
             return "delete not executed for test action";
         }
-        PolicyEngine policyEngine = new PolicyEngine(
-                appContext.getResource(cldsPolicyConfigFile).getFile().getAbsolutePath());
 
         // API method to create or update Policy.
         PolicyChangeResponse response = null;
         String responseMessage = "";
         try {
             logger.info("Attempting to delete policy...");
-            response = policyEngine.deletePolicy(deletePolicyParameters);
+            response = getPolicyEngine().deletePolicy(deletePolicyParameters);
             responseMessage = response.getResponseMessage();
         } catch (Exception e) {
             logger.error("Exception occurred during policy communnication", e);
diff --git a/src/main/java/org/onap/clamp/clds/client/SdcCatalogServices.java b/src/main/java/org/onap/clamp/clds/client/SdcCatalogServices.java
index d418ea5..d317671 100644
--- a/src/main/java/org/onap/clamp/clds/client/SdcCatalogServices.java
+++ b/src/main/java/org/onap/clamp/clds/client/SdcCatalogServices.java
@@ -25,7 +25,6 @@
 

 import com.att.eelf.configuration.EELFLogger;

 import com.att.eelf.configuration.EELFManager;

-import com.fasterxml.jackson.core.JsonProcessingException;

 import com.fasterxml.jackson.databind.JsonNode;

 import com.fasterxml.jackson.databind.ObjectMapper;

 import com.fasterxml.jackson.databind.node.ArrayNode;

@@ -53,6 +52,7 @@
 import org.apache.commons.csv.CSVRecord;

 import org.apache.commons.lang3.StringUtils;

 import org.onap.clamp.clds.client.req.SdcReq;

+import org.onap.clamp.clds.exception.SdcCommunicationException;

 import org.onap.clamp.clds.model.CldsAlarmCondition;

 import org.onap.clamp.clds.model.CldsDBServiceCache;

 import org.onap.clamp.clds.model.CldsSdcArtifact;

@@ -137,7 +137,7 @@
      */

     public List<CldsSdcServiceInfo> removeDuplicateServices(List<CldsSdcServiceInfo> rawCldsSdcServiceList) {

         List<CldsSdcServiceInfo> cldsSdcServiceInfoList = null;

-        if (rawCldsSdcServiceList != null && rawCldsSdcServiceList.size() > 0) {

+        if (rawCldsSdcServiceList != null && !rawCldsSdcServiceList.isEmpty()) {

             // sort list

             Collections.sort(rawCldsSdcServiceList);

             // and then take only the services with the max version (last in the

@@ -165,7 +165,7 @@
      */

     public List<CldsSdcResource> removeDuplicateSdcResourceInstances(List<CldsSdcResource> rawCldsSdcResourceList) {

         List<CldsSdcResource> cldsSdcResourceList = null;

-        if (rawCldsSdcResourceList != null && rawCldsSdcResourceList.size() > 0) {

+        if (rawCldsSdcResourceList != null && !rawCldsSdcResourceList.isEmpty()) {

             // sort list

             Collections.sort(rawCldsSdcResourceList);

             // and then take only the resources with the max version (last in

@@ -194,7 +194,7 @@
     public List<CldsSdcResourceBasicInfo> removeDuplicateSdcResourceBasicInfo(

             List<CldsSdcResourceBasicInfo> rawCldsSdcResourceListBasicList) {

         List<CldsSdcResourceBasicInfo> cldsSdcResourceBasicInfoList = null;

-        if (rawCldsSdcResourceListBasicList != null && rawCldsSdcResourceListBasicList.size() > 0) {

+        if (rawCldsSdcResourceListBasicList != null && !rawCldsSdcResourceListBasicList.isEmpty()) {

             // sort list

             Collections.sort(rawCldsSdcResourceListBasicList);

             // and then take only the resources with the max version (last in

@@ -221,15 +221,13 @@
      * @param invariantId

      *            The invariant ID

      * @return The service UUID

-     * @throws IOException

-     *             In case of issues with the JSON decoder

      */

-    public String getServiceUuidFromServiceInvariantId(String invariantId) throws IOException {

+    public String getServiceUuidFromServiceInvariantId(String invariantId) {

         String serviceUuid = "";

         String responseStr = getSdcServicesInformation(null);

         List<CldsSdcServiceInfo> rawCldsSdcServicesList = getCldsSdcServicesListFromJson(responseStr);

         List<CldsSdcServiceInfo> cldsSdcServicesList = removeDuplicateServices(rawCldsSdcServicesList);

-        if (cldsSdcServicesList != null && cldsSdcServicesList.size() > 0) {

+        if (cldsSdcServicesList != null && !cldsSdcServicesList.isEmpty()) {

             for (CldsSdcServiceInfo currCldsSdcServiceInfo : cldsSdcServicesList) {

                 if (currCldsSdcServiceInfo != null && currCldsSdcServiceInfo.getInvariantUUID() != null

                         && currCldsSdcServiceInfo.getInvariantUUID().equalsIgnoreCase(invariantId)) {

@@ -245,32 +243,45 @@
      * To get CldsAsdsServiceInfo class by parsing json string.

      *

      * @param jsonStr

-     * @return

-     * @throws IOException

+     *            The Json string that must be decoded

+     * @return The list of CldsSdcServiceInfo, if there is a failure it return

+     *         an empty list

      */

-    public List<CldsSdcServiceInfo> getCldsSdcServicesListFromJson(String jsonStr) throws IOException {

+    public List<CldsSdcServiceInfo> getCldsSdcServicesListFromJson(String jsonStr) {

         ObjectMapper objectMapper = new ObjectMapper();

         if (StringUtils.isBlank(jsonStr)) {

-            return null;

+            return new ArrayList<>();

         }

-        return objectMapper.readValue(jsonStr,

-                objectMapper.getTypeFactory().constructCollectionType(List.class, CldsSdcServiceInfo.class));

+        try {

+            return objectMapper.readValue(jsonStr,

+                    objectMapper.getTypeFactory().constructCollectionType(List.class, CldsSdcServiceInfo.class));

+        } catch (IOException e) {

+            logger.error("Error when attempting to decode the JSON containing CldsSdcServiceInfo", e);

+            return new ArrayList<>();

+        }

     }

 

     /**

      * To get List of CldsSdcResourceBasicInfo class by parsing json string.

      *

      * @param jsonStr

-     * @return

-     * @throws IOException

+     *            The JSOn string that must be decoded

+     * @return The list of CldsSdcResourceBasicInfo, an empty list in case of

+     *         issues

      */

-    public List<CldsSdcResourceBasicInfo> getAllSdcResourcesListFromJson(String jsonStr) throws IOException {

+    public List<CldsSdcResourceBasicInfo> getAllSdcResourcesListFromJson(String jsonStr) {

         ObjectMapper objectMapper = new ObjectMapper();

         if (StringUtils.isBlank(jsonStr)) {

-            return null;

+            return new ArrayList<>();

         }

-        return objectMapper.readValue(jsonStr,

-                objectMapper.getTypeFactory().constructCollectionType(List.class, CldsSdcResourceBasicInfo.class));

+

+        try {

+            return objectMapper.readValue(jsonStr,

+                    objectMapper.getTypeFactory().constructCollectionType(List.class, CldsSdcResourceBasicInfo.class));

+        } catch (IOException e) {

+            logger.error("Exception occurred when attempting to decode the list of CldsSdcResourceBasicInfo JSON", e);

+            return new ArrayList<>();

+        }

     }

 

     /**

@@ -290,76 +301,86 @@
      *

      * @param jsonStr

      * @return

-     * @throws IOException

      */

-    public CldsSdcServiceDetail getCldsSdcServiceDetailFromJson(String jsonStr) throws IOException {

+    public CldsSdcServiceDetail getCldsSdcServiceDetailFromJson(String jsonStr) {

         ObjectMapper objectMapper = new ObjectMapper();

-        return objectMapper.readValue(jsonStr, CldsSdcServiceDetail.class);

+        try {

+            return objectMapper.readValue(jsonStr, CldsSdcServiceDetail.class);

+        } catch (IOException e) {

+            logger.error("Exception when attempting to decode the CldsSdcServiceDetail JSON", e);

+            return null;

+        }

     }

 

     /**

-     * To upload artifact to sdc based on serviceUUID and resourcename on url.

+     * To upload artifact to sdc based on serviceUUID and resource name on url.

      *

      * @param prop

      * @param userid

      * @param url

-     * @param formatttedSdcReq

+     * @param formattedSdcReq

      * @return

-     * @throws IOException

      */

-    public String uploadArtifactToSdc(ModelProperties prop, String userid, String url, String formatttedSdcReq)

-            throws IOException {

+    public String uploadArtifactToSdc(ModelProperties prop, String userid, String url, String formatttedSdcReq) {

         // Verify whether it is triggered by Validation Test button from UI

         if (prop.isTest()) {

             return "sdc artifact upload not executed for test action";

         }

-        logger.info("userid=" + userid);

-        String md5Text = SdcReq.calculateMD5ByString(formatttedSdcReq);

-        byte[] postData = SdcReq.stringToByteArray(formatttedSdcReq);

-        int postDataLength = postData.length;

-        HttpURLConnection conn = getSdcHttpUrlConnection(userid, postDataLength, url, md5Text);

-        try (DataOutputStream wr = new DataOutputStream(conn.getOutputStream())) {

-            wr.write(postData);

-        }

-        boolean requestFailed = true;

-        int responseCode = conn.getResponseCode();

-        logger.info("responseCode=" + responseCode);

-        if (responseCode == 200) {

-            requestFailed = false;

-        }

+        try {

+            logger.info("userid=" + userid);

+            String md5Text = SdcReq.calculateMD5ByString(formatttedSdcReq);

+            byte[] postData = SdcReq.stringToByteArray(formatttedSdcReq);

+            int postDataLength = postData.length;

+            HttpURLConnection conn = getSdcHttpUrlConnection(userid, postDataLength, url, md5Text);

+            try (DataOutputStream wr = new DataOutputStream(conn.getOutputStream())) {

+                wr.write(postData);

+            }

+            boolean requestFailed = true;

+            int responseCode = conn.getResponseCode();

+            logger.info("responseCode=" + responseCode);

+            if (responseCode == 200) {

+                requestFailed = false;

+            }

 

-        String responseStr = getResponse(conn);

-        if (responseStr != null) {

-            if (requestFailed) {

+            String responseStr = getResponse(conn);

+            if (responseStr != null && requestFailed) {

                 logger.error("requestFailed - responseStr=" + responseStr);

                 throw new BadRequestException(responseStr);

             }

+            return responseStr;

+        } catch (IOException e) {

+            logger.error("Exception when attempting to communicate with SDC", e);

+            throw new SdcCommunicationException("Exception when attempting to communicate with SDC", e);

         }

-        return responseStr;

+

     }

 

-    private HttpURLConnection getSdcHttpUrlConnection(String userid, int postDataLength, String url, String md5Text)

-            throws IOException {

-        logger.info("userid=" + userid);

-        String basicAuth = SdcReq.getSdcBasicAuth(refProp);

-        String sdcXonapInstanceId = refProp.getStringValue("sdc.sdcX-InstanceID");

-        URL urlObj = new URL(url);

-        HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();

-        conn.setDoOutput(true);

-        conn.setRequestProperty(refProp.getStringValue("sdc.InstanceID"), sdcXonapInstanceId);

-        conn.setRequestProperty("Authorization", basicAuth);

-        conn.setRequestProperty("Content-Type", "application/json");

-        conn.setRequestProperty("Content-MD5", md5Text);

-        conn.setRequestProperty("USER_ID", userid);

-        conn.setRequestMethod("POST");

-        conn.setRequestProperty("charset", "utf-8");

-        conn.setRequestProperty("Content-Length", Integer.toString(postDataLength));

-        conn.setUseCaches(false);

-        conn.setRequestProperty("X-ECOMP-RequestID", LoggingUtils.getRequestId());

-        return conn;

+    private HttpURLConnection getSdcHttpUrlConnection(String userid, int postDataLength, String url, String md5Text) {

+        try {

+            logger.info("userid=" + userid);

+            String basicAuth = SdcReq.getSdcBasicAuth(refProp);

+            String sdcXonapInstanceId = refProp.getStringValue("sdc.sdcX-InstanceID");

+            URL urlObj = new URL(url);

+            HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();

+            conn.setDoOutput(true);

+            conn.setRequestProperty(refProp.getStringValue("sdc.InstanceID"), sdcXonapInstanceId);

+            conn.setRequestProperty("Authorization", basicAuth);

+            conn.setRequestProperty("Content-Type", "application/json");

+            conn.setRequestProperty("Content-MD5", md5Text);

+            conn.setRequestProperty("USER_ID", userid);

+            conn.setRequestMethod("POST");

+            conn.setRequestProperty("charset", "utf-8");

+            conn.setRequestProperty("Content-Length", Integer.toString(postDataLength));

+            conn.setUseCaches(false);

+            conn.setRequestProperty("X-ECOMP-RequestID", LoggingUtils.getRequestId());

+            return conn;

+        } catch (IOException e) {

+            logger.error("Exception when attempting to open connection with SDC", e);

+            throw new SdcCommunicationException("Exception when attempting to open connection with SDC", e);

+        }

     }

 

-    private String getResponse(HttpURLConnection conn) throws IOException {

+    private String getResponse(HttpURLConnection conn) {

         try (InputStream is = getInputStream(conn)) {

             if (is != null) {

                 try (BufferedReader in = new BufferedReader(new InputStreamReader(is))) {

@@ -370,29 +391,42 @@
                     }

                     return response.toString();

                 }

+            } else {

+                return null;

             }

+        } catch (IOException e) {

+            logger.error("Exception when attempting to open SDC response", e);

+            throw new SdcCommunicationException("Exception when attempting to open SDC response", e);

         }

-        return null;

     }

 

-    private InputStream getInputStream(HttpURLConnection conn) throws IOException {

-        InputStream inStream = conn.getErrorStream();

-        if (inStream == null) {

-            inStream = conn.getInputStream();

+    private InputStream getInputStream(HttpURLConnection conn) {

+        try {

+            InputStream inStream = conn.getErrorStream();

+            if (inStream == null) {

+                inStream = conn.getInputStream();

+            }

+            return inStream;

+        } catch (IOException e) {

+            logger.error("Exception when attempting to open SDC error stream", e);

+            throw new SdcCommunicationException("Exception when attempting to open SDC error stream", e);

         }

-        return inStream;

     }

 

-    public CldsDBServiceCache getCldsDbServiceCacheUsingCldsServiceData(CldsServiceData cldsServiceData)

-            throws IOException {

-        CldsDBServiceCache cldsDbServiceCache = new CldsDBServiceCache();

-        cldsDbServiceCache.setCldsDataInstream(cldsServiceData);

-        cldsDbServiceCache.setInvariantId(cldsServiceData.getServiceInvariantUUID());

-        cldsDbServiceCache.setServiceId(cldsServiceData.getServiceUUID());

-        return cldsDbServiceCache;

+    public CldsDBServiceCache getCldsDbServiceCacheUsingCldsServiceData(CldsServiceData cldsServiceData) {

+        try {

+            CldsDBServiceCache cldsDbServiceCache = new CldsDBServiceCache();

+            cldsDbServiceCache.setCldsDataInstream(cldsServiceData);

+            cldsDbServiceCache.setInvariantId(cldsServiceData.getServiceInvariantUUID());

+            cldsDbServiceCache.setServiceId(cldsServiceData.getServiceUUID());

+            return cldsDbServiceCache;

+        } catch (IOException e) {

+            logger.error("Exception when getting service in cache", e);

+            throw new SdcCommunicationException("Exception when getting service in cache", e);

+        }

     }

 

-    public boolean isCldsSdcCacheDataExpired(CldsServiceData cldsServiceData) throws IOException {

+    public boolean isCldsSdcCacheDataExpired(CldsServiceData cldsServiceData) {

         boolean expired = false;

         if (cldsServiceData != null && cldsServiceData.getServiceUUID() != null) {

             String cachedServiceUuid = cldsServiceData.getServiceUUID();

@@ -408,7 +442,7 @@
         return expired;

     }

 

-    public CldsServiceData getCldsServiceDataWithAlarmConditions(String invariantServiceUuid) throws IOException {

+    public CldsServiceData getCldsServiceDataWithAlarmConditions(String invariantServiceUuid) {

         String url = refProp.getStringValue("sdc.serviceUrl");

         String catalogUrl = refProp.getStringValue("sdc.catalog.url");

         String serviceUuid = getServiceUuidFromServiceInvariantId(invariantServiceUuid);

@@ -417,7 +451,13 @@
         ObjectMapper objectMapper = new ObjectMapper();

         CldsServiceData cldsServiceData = new CldsServiceData();

         if (responseStr != null) {

-            CldsSdcServiceDetail cldsSdcServiceDetail = objectMapper.readValue(responseStr, CldsSdcServiceDetail.class);

+            CldsSdcServiceDetail cldsSdcServiceDetail;

+            try {

+                cldsSdcServiceDetail = objectMapper.readValue(responseStr, CldsSdcServiceDetail.class);

+            } catch (IOException e) {

+                logger.error("Exception when decoding the CldsServiceData JSON from SDC", e);

+                throw new SdcCommunicationException("Exception when decoding the CldsServiceData JSON from SDC", e);

+            }

             cldsServiceData.setServiceUUID(cldsSdcServiceDetail.getUuid());

             cldsServiceData.setServiceInvariantUUID(cldsSdcServiceDetail.getInvariantUUID());

 

@@ -448,11 +488,7 @@
         return cldsServiceData;

     }

 

-    /**

-     * @param cldsVfDataList

-     * @throws IOException

-     */

-    private void getAllVfcForVfList(List<CldsVfData> cldsVfDataList, String catalogUrl) throws IOException {

+    private void getAllVfcForVfList(List<CldsVfData> cldsVfDataList, String catalogUrl) {

         // todo : refact this..

         if (cldsVfDataList != null && !cldsVfDataList.isEmpty()) {

             List<CldsSdcResourceBasicInfo> allVfResources = getAllSdcVForVfcResourcesBasedOnResourceType(

@@ -511,9 +547,15 @@
         }

     }

 

-    private List<CldsVfcData> getVfcDataListFromVfResponse(String vfResponse) throws IOException {

+    private List<CldsVfcData> getVfcDataListFromVfResponse(String vfResponse) {

         ObjectMapper mapper = new ObjectMapper();

-        ObjectNode vfResponseNode = (ObjectNode) mapper.readTree(vfResponse);

+        ObjectNode vfResponseNode;

+        try {

+            vfResponseNode = (ObjectNode) mapper.readTree(vfResponse);

+        } catch (IOException e) {

+            logger.error("Exception when decoding the JSON list of CldsVfcData", e);

+            return new ArrayList<>();

+        }

         ArrayNode vfcArrayNode = (ArrayNode) vfResponseNode.get("resources");

         List<CldsVfcData> cldsVfcDataList = new ArrayList<>();

         if (vfcArrayNode != null) {

@@ -572,10 +614,16 @@
         return (id != null) ? id.replaceAll("\"", "") : "";

     }

 

-    private List<CldsAlarmCondition> getAlarmCondtionsFromVfc(String vfcResponse) throws IOException {

+    private List<CldsAlarmCondition> getAlarmCondtionsFromVfc(String vfcResponse) {

         List<CldsAlarmCondition> cldsAlarmConditionList = new ArrayList<>();

         ObjectMapper mapper = new ObjectMapper();

-        ObjectNode vfcResponseNode = (ObjectNode) mapper.readTree(vfcResponse);

+        ObjectNode vfcResponseNode;

+        try {

+            vfcResponseNode = (ObjectNode) mapper.readTree(vfcResponse);

+        } catch (IOException e) {

+            logger.error("Exception when decoding the JSON list of CldsAlarmCondition", e);

+            return cldsAlarmConditionList;

+        }

         ArrayNode artifactsArrayNode = (ArrayNode) vfcResponseNode.get("artifacts");

 

         if (artifactsArrayNode != null && artifactsArrayNode.size() > 0) {

@@ -592,25 +640,36 @@
         return cldsAlarmConditionList;

     }

 

-    private List<CldsAlarmCondition> parseCsvToGetAlarmConditions(String allAlarmCondsValues) throws IOException {

-        List<CldsAlarmCondition> cldsAlarmConditionList = new ArrayList<>();

-        Reader alarmReader = new StringReader(allAlarmCondsValues);

-        Iterable<CSVRecord> records = CSVFormat.RFC4180.parse(alarmReader);

-        if (records != null) {

-            Iterator<CSVRecord> it = records.iterator();

-            if (it.hasNext()) {

-                it.next();

+    private List<CldsAlarmCondition> parseCsvToGetAlarmConditions(String allAlarmCondsValues) {

+        try {

+            List<CldsAlarmCondition> cldsAlarmConditionList = new ArrayList<>();

+            Reader alarmReader = new StringReader(allAlarmCondsValues);

+            Iterable<CSVRecord> records = CSVFormat.RFC4180.parse(alarmReader);

+            if (records != null) {

+                Iterator<CSVRecord> it = records.iterator();

+                if (it.hasNext()) {

+                    it.next();

+                }

+                it.forEachRemaining(record -> processRecord(cldsAlarmConditionList, record));

             }

-            it.forEachRemaining(record -> processRecord(cldsAlarmConditionList, record));

+            return cldsAlarmConditionList;

+        } catch (IOException e) {

+            logger.error("Exception when attempting to parse the CSV containing the alarm", e);

+            return new ArrayList<>();

         }

-        return cldsAlarmConditionList;

     }

 

     // Method to get the artifact for any particular VF

-    private List<CldsVfKPIData> getFieldPathFromVF(String vfResponse) throws JsonProcessingException, IOException {

+    private List<CldsVfKPIData> getFieldPathFromVF(String vfResponse) {

         List<CldsVfKPIData> cldsVfKPIDataList = new ArrayList<>();

         ObjectMapper mapper = new ObjectMapper();

-        ObjectNode vfResponseNode = (ObjectNode) mapper.readTree(vfResponse);

+        ObjectNode vfResponseNode;

+        try {

+            vfResponseNode = (ObjectNode) mapper.readTree(vfResponse);

+        } catch (IOException e) {

+            logger.error("Exception when decoding the JSON list of CldsVfKPIData", e);

+            return cldsVfKPIDataList;

+        }

         ArrayNode artifactsArrayNode = (ArrayNode) vfResponseNode.get("artifacts");

 

         if (artifactsArrayNode != null && artifactsArrayNode.size() > 0) {

@@ -621,7 +680,7 @@
                 String artifactName = "";

                 if (artifactNameNode != null) {

                     artifactName = artifactNameNode.textValue();

-                    artifactName = artifactName.substring(artifactName.lastIndexOf(".") + 1);

+                    artifactName = artifactName.substring(artifactName.lastIndexOf('.') + 1);

                 }

                 if (artifactUrlNode != null && artifactName != null && !artifactName.isEmpty()

                         && artifactName.equalsIgnoreCase("csv")) {

@@ -660,19 +719,24 @@
     }

 

     // Method to get the artifactURL Data and set the CldsVfKPIData node

-    private List<CldsVfKPIData> parseCsvToGetFieldPath(String allFieldPathValues) throws IOException {

-        List<CldsVfKPIData> cldsVfKPIDataList = new ArrayList<>();

-        Reader alarmReader = new StringReader(allFieldPathValues);

-        Iterable<CSVRecord> records = CSVFormat.RFC4180.parse(alarmReader);

-        if (records != null) {

-            for (CSVRecord record : records) {

-                CldsVfKPIData kpiData = this.convertCsvRecordToKpiData(record);

-                if (kpiData != null) {

-                    cldsVfKPIDataList.add(kpiData);

+    private List<CldsVfKPIData> parseCsvToGetFieldPath(String allFieldPathValues) {

+        try {

+            List<CldsVfKPIData> cldsVfKPIDataList = new ArrayList<>();

+            Reader alarmReader = new StringReader(allFieldPathValues);

+            Iterable<CSVRecord> records = CSVFormat.RFC4180.parse(alarmReader);

+            if (records != null) {

+                for (CSVRecord record : records) {

+                    CldsVfKPIData kpiData = this.convertCsvRecordToKpiData(record);

+                    if (kpiData != null) {

+                        cldsVfKPIDataList.add(kpiData);

+                    }

                 }

             }

+            return cldsVfKPIDataList;

+        } catch (IOException e) {

+            logger.error("Exception when attempting to parse the CSV containing the alarm kpi data", e);

+            return new ArrayList<>();

         }

-        return cldsVfKPIDataList;

     }

 

     private void processRecord(List<CldsAlarmCondition> cldsAlarmConditionList, CSVRecord record) {

@@ -713,7 +777,6 @@
      * @param url

      * @param alarmConditions

      * @return

-     * @throws IOException

      */

     public String getCldsServicesOrResourcesBasedOnURL(String url, boolean alarmConditions) {

         try {

@@ -736,7 +799,7 @@
                 String inputLine;

                 while ((inputLine = in.readLine()) != null) {

                     if (!inputLine.isEmpty()) {

-                    response.append(inputLine);

+                        response.append(inputLine);

                     }

                     if (alarmConditions) {

                         response.append("\n");

@@ -757,9 +820,8 @@
      * @param globalProps

      * @param cldsServiceData

      * @return

-     * @throws IOException

      */

-    public String createPropertiesObjectByUUID(String globalProps, CldsServiceData cldsServiceData) throws IOException {

+    public String createPropertiesObjectByUUID(String globalProps, CldsServiceData cldsServiceData) {

         String totalPropsStr;

         ObjectMapper mapper = new ObjectMapper();

         ObjectNode globalPropsJson;

@@ -814,20 +876,29 @@
 

             byIdObjectNode.putPOJO("byAlertDescription", alertDescObjectNodeByAlert);

 

-            globalPropsJson = (ObjectNode) mapper.readValue(globalProps, JsonNode.class);

+            globalPropsJson = decodeGlobalProp(globalProps, mapper);

 

             globalPropsJson.putPOJO("shared", byIdObjectNode);

-            logger.info("valuie of objNode:" + globalPropsJson);

+            logger.info("value of objNode:" + globalPropsJson);

         } else {

             /**

              * to create json with total properties when no serviceUUID passed

              */

-            globalPropsJson = (ObjectNode) mapper.readValue(globalProps, JsonNode.class);

+            globalPropsJson = decodeGlobalProp(globalProps, mapper);

         }

         totalPropsStr = globalPropsJson.toString();

         return totalPropsStr;

     }

 

+    private ObjectNode decodeGlobalProp(String globalProps, ObjectMapper mapper) {

+        try {

+            return (ObjectNode) mapper.readValue(globalProps, JsonNode.class);

+        } catch (IOException e) {

+            logger.error("Exception occurred during decoding of the global props, returning an empty objectNode", e);

+            return mapper.createObjectNode();

+        }

+    }

+

     /**

      * Method to get alarm conditions/alert description from Service Data.

      * 

@@ -981,13 +1052,13 @@
                                 alertDescNode.put(currCldsAlarmCondition.getAlarmConditionKey(),

                                         currCldsAlarmCondition.getAlarmConditionKey());

                             }

-                            }

                         }

+                    }

 

                     vfcObjectNode.putPOJO("alarmCondition", alarmCondNode);

                     vfcObjectNode.putPOJO("alertDescription", alertDescNode);

                     vfcResourceUuidObjectNode.putPOJO(currCldsVfcData.getVfcInvariantResourceUUID(), vfcObjectNode);

-                    }

+                }

             }

         } else {

             alarmCondNode.put("", "");

@@ -1050,12 +1121,11 @@
                 if (currCldsSdcResource != null && currCldsSdcResource.getArtifacts() != null

                         && !currCldsSdcResource.getArtifacts().isEmpty()) {

                     for (CldsSdcArtifact currCldsSdcArtifact : currCldsSdcResource.getArtifacts()) {

-                        if (currCldsSdcArtifact != null && currCldsSdcArtifact.getArtifactName() != null) {

-                            if (currCldsSdcArtifact.getArtifactName().equalsIgnoreCase(artifactName)) {

-                                artifactUuid = currCldsSdcArtifact.getArtifactUUID();

-                                artifactExists = true;

-                                break;

-                            }

+                        if (currCldsSdcArtifact != null && currCldsSdcArtifact.getArtifactName() != null

+                                && currCldsSdcArtifact.getArtifactName().equalsIgnoreCase(artifactName)) {

+                            artifactUuid = currCldsSdcArtifact.getArtifactUUID();

+                            artifactExists = true;

+                            break;

                         }

                     }

                 }

@@ -1109,22 +1179,16 @@
      * @param resourceType

      *            The resourceType

      * @return The list of CldsSdcResourceBasicInfo

-     * @throws IOException

-     *             In case of issues with the Streams

      */

-    private List<CldsSdcResourceBasicInfo> getAllSdcVForVfcResourcesBasedOnResourceType(String resourceType)

-            throws IOException {

-        List<CldsSdcResourceBasicInfo> allSdcResourceVfcBasicInfo = new ArrayList<CldsSdcResourceBasicInfo>();

+    private List<CldsSdcResourceBasicInfo> getAllSdcVForVfcResourcesBasedOnResourceType(String resourceType) {

         String catalogUrl = refProp.getStringValue("sdc.catalog.url");

         String resourceUrl = catalogUrl + "resources?resourceType=" + resourceType;

         String allSdcVfcResources = getCldsServicesOrResourcesBasedOnURL(resourceUrl, false);

-

-        allSdcResourceVfcBasicInfo = getAllSdcResourcesListFromJson(allSdcVfcResources);

-        return removeDuplicateSdcResourceBasicInfo(allSdcResourceVfcBasicInfo);

+        return removeDuplicateSdcResourceBasicInfo(getAllSdcResourcesListFromJson(allSdcVfcResources));

     }

 

     private String getResourceUuidFromResourceInvariantUuid(String resourceInvariantUuid,

-            List<CldsSdcResourceBasicInfo> resourceInfoList) throws IOException {

+            List<CldsSdcResourceBasicInfo> resourceInfoList) {

         String resourceUuid = null;

         if (resourceInfoList != null && !resourceInfoList.isEmpty()) {

             for (CldsSdcResourceBasicInfo currResource : resourceInfoList) {

@@ -1172,12 +1236,10 @@
      * @param locationArtifactName

      *            The location artifact name from where we can get the Artifact

      *            UUID

-     * @throws IOException

-     *             In case of issues with the streams

      * 

      */

     public void uploadToSdc(ModelProperties prop, String userid, List<String> sdcReqUrlsList, String formattedSdcReq,

-            String formattedSdcLocationReq, String artifactName, String locationArtifactName) throws IOException {

+            String formattedSdcLocationReq, String artifactName, String locationArtifactName) {

         logger.info("userid=" + userid);

         String serviceInvariantUuid = getServiceInvariantUuidFromProps(prop);

         if (sdcReqUrlsList != null && !sdcReqUrlsList.isEmpty()) {

diff --git a/src/main/java/org/onap/clamp/clds/client/req/OperationalPolicyReq.java b/src/main/java/org/onap/clamp/clds/client/req/OperationalPolicyReq.java
index 2b1762a..ad466ee 100644
--- a/src/main/java/org/onap/clamp/clds/client/req/OperationalPolicyReq.java
+++ b/src/main/java/org/onap/clamp/clds/client/req/OperationalPolicyReq.java
@@ -139,7 +139,7 @@
             logger.info("notificationTopic=" + notificationTopic);
 
             // format yaml
-            String yaml = tca.isFound() ? formateNodeBYaml(refProp, prop, modelElementId, policyChain)
+            String yaml = (tca != null && tca.isFound()) ? formateNodeBYaml(refProp, prop, modelElementId, policyChain)
                     : formatYaml(refProp, prop, modelElementId, policyChain);
 
             ruleAttributes.put("templateName", templateName);
@@ -425,7 +425,7 @@
             return new Resource[0];
         }
         return stringList.stream().map(stringElem -> new Resource(stringElem, resourceType)).toArray(Resource[]::new);
-        }
+    }
 
     /**
      * Convert a List of policy result strings to an array of PolicyResult
diff --git a/src/main/java/org/onap/clamp/clds/client/req/SdcReq.java b/src/main/java/org/onap/clamp/clds/client/req/SdcReq.java
index 93c5626..f8351ca 100644
--- a/src/main/java/org/onap/clamp/clds/client/req/SdcReq.java
+++ b/src/main/java/org/onap/clamp/clds/client/req/SdcReq.java
@@ -46,7 +46,6 @@
 import org.apache.commons.codec.digest.DigestUtils;
 import org.camunda.bpm.engine.delegate.DelegateExecution;
 import org.onap.clamp.clds.client.SdcCatalogServices;
-import org.onap.clamp.clds.exception.SdcCommunicationException;
 import org.onap.clamp.clds.model.CldsSdcResource;
 import org.onap.clamp.clds.model.CldsSdcServiceDetail;
 import org.onap.clamp.clds.model.prop.Global;
@@ -251,13 +250,12 @@
      * @param baseUrl
      * @param sdcCatalogServices
      * @return
-     * @throws Exception
      */
     public static List<String> getSdcReqUrlsList(ModelProperties prop, String baseUrl,
             SdcCatalogServices sdcCatalogServices, DelegateExecution execution) {
         // TODO : refact and regroup with very similar code
         List<String> urlList = new ArrayList<>();
-        try {
+
         Global globalProps = prop.getGlobal();
         if (globalProps != null) {
             if (globalProps.getService() != null) {
@@ -266,30 +264,28 @@
                 List<String> resourceVfList = globalProps.getResourceVf();
                 String serviceUUID = sdcCatalogServices.getServiceUuidFromServiceInvariantId(serviceInvariantUUID);
                 String sdcServicesInformation = sdcCatalogServices.getSdcServicesInformation(serviceUUID);
-                CldsSdcServiceDetail CldsSdcServiceDetail = sdcCatalogServices
+                CldsSdcServiceDetail cldsSdcServiceDetail = sdcCatalogServices
                         .getCldsSdcServiceDetailFromJson(sdcServicesInformation);
-                if (CldsSdcServiceDetail != null && resourceVfList != null) {
-                    List<CldsSdcResource> CldsSdcResourcesList = CldsSdcServiceDetail.getResources();
-                        if (CldsSdcResourcesList != null && !CldsSdcResourcesList.isEmpty()) {
-                        for (CldsSdcResource CldsSdcResource : CldsSdcResourcesList) {
+                if (cldsSdcServiceDetail != null && resourceVfList != null) {
+                    List<CldsSdcResource> cldsSdcResourcesList = cldsSdcServiceDetail.getResources();
+                    if (cldsSdcResourcesList != null && !cldsSdcResourcesList.isEmpty()) {
+                        for (CldsSdcResource CldsSdcResource : cldsSdcResourcesList) {
                             if (CldsSdcResource != null && CldsSdcResource.getResoucreType() != null
-                                    && CldsSdcResource.getResoucreType().equalsIgnoreCase("VF")) {
-                                if (resourceVfList.contains(CldsSdcResource.getResourceInvariantUUID())) {
-                                    String normalizedResourceInstanceName = normalizeResourceInstanceName(
-                                            CldsSdcResource.getResourceInstanceName());
-                                    String svcUrl = baseUrl + "/" + serviceUUID + "/resourceInstances/"
-                                            + normalizedResourceInstanceName + "/artifacts";
-                                    urlList.add(svcUrl);
-                                }
+                                    && CldsSdcResource.getResoucreType().equalsIgnoreCase("VF")
+                                    && resourceVfList.contains(CldsSdcResource.getResourceInvariantUUID())) {
+                                String normalizedResourceInstanceName = normalizeResourceInstanceName(
+                                        CldsSdcResource.getResourceInstanceName());
+                                String svcUrl = baseUrl + "/" + serviceUUID + "/resourceInstances/"
+                                        + normalizedResourceInstanceName + "/artifacts";
+                                urlList.add(svcUrl);
+
                             }
                         }
                     }
                 }
             }
         }
-        } catch (IOException e) {
-            throw new SdcCommunicationException("Exception occurred during the SDC communication",e);
-        }
+
         return urlList;
     }
 
diff --git a/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java b/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java
index 19c9164..eee1791 100644
--- a/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java
+++ b/src/main/java/org/onap/clamp/clds/config/CldsConfiguration.java
@@ -23,7 +23,9 @@
 
 package org.onap.clamp.clds.config;
 
-import java.io.IOException;
+import com.att.ajsc.common.AjscProvider;
+import com.att.ajsc.common.AjscService;
+
 import java.util.ArrayList;
 import java.util.List;
 
@@ -55,9 +57,6 @@
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Profile;
 
-import com.att.ajsc.common.AjscProvider;
-import com.att.ajsc.common.AjscService;
-
 @Configuration
 @Profile("clamp-default")
 public class CldsConfiguration {
@@ -99,7 +98,7 @@
     }
 
     @Bean
-    public RefProp getRefProp() throws IOException {
+    public RefProp getRefProp() {
         return new RefProp();
     }
 
diff --git a/src/main/java/org/onap/clamp/clds/config/CldsUserJsonDecoder.java b/src/main/java/org/onap/clamp/clds/config/CldsUserJsonDecoder.java
index 997a20f..ecfb4aa 100644
--- a/src/main/java/org/onap/clamp/clds/config/CldsUserJsonDecoder.java
+++ b/src/main/java/org/onap/clamp/clds/config/CldsUserJsonDecoder.java
@@ -23,13 +23,13 @@
 
 package org.onap.clamp.clds.config;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+
 import java.io.IOException;
 import java.io.InputStream;
 
 import org.onap.clamp.clds.service.CldsUser;
 
-import com.fasterxml.jackson.databind.ObjectMapper;
-
 public class CldsUserJsonDecoder {
 
     /**
@@ -43,4 +43,8 @@
         // the ObjectMapper readValue method closes the stream no need to do it
         return new ObjectMapper().readValue(cldsUsersFile, CldsUser[].class);
     }
+
+    private CldsUserJsonDecoder() {
+
+    }
 }
diff --git a/src/main/java/org/onap/clamp/clds/dao/CldsDao.java b/src/main/java/org/onap/clamp/clds/dao/CldsDao.java
index 3b69502..3cc6a32 100644
--- a/src/main/java/org/onap/clamp/clds/dao/CldsDao.java
+++ b/src/main/java/org/onap/clamp/clds/dao/CldsDao.java
@@ -46,7 +46,6 @@
 import org.onap.clamp.clds.model.CldsServiceData;
 import org.onap.clamp.clds.model.CldsTemplate;
 import org.onap.clamp.clds.model.ValueItem;
-import org.springframework.dao.EmptyResultDataAccessException;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
 import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
@@ -398,8 +397,8 @@
      * @return model names
      */
     public List<ValueItem> getBpmnNames() {
-        String SQL = "SELECT model_name FROM model ORDER BY 1;";
-        return jdbcTemplateObject.query(SQL, new ValueItemMapper());
+        String sql = "SELECT model_name FROM model ORDER BY 1;";
+        return jdbcTemplateObject.query(sql, new ValueItemMapper());
     }
 
     /**
@@ -435,8 +434,8 @@
      * @return template names
      */
     public List<ValueItem> getTemplateNames() {
-        String SQL = "SELECT template_name FROM template ORDER BY 1;";
-        return jdbcTemplateObject.query(SQL, new ValueItemMapper());
+        String sql = "SELECT template_name FROM template ORDER BY 1;";
+        return jdbcTemplateObject.query(sql, new ValueItemMapper());
     }
 
     /**
@@ -466,14 +465,10 @@
     public CldsServiceData getCldsServiceCache(String invariantUUID) {
         CldsServiceData cldsServiceData = null;
         List<CldsServiceData> cldsServiceDataList = new ArrayList<>();
-        try {
-            String getCldsServiceSQL = "SELECT * , TIMESTAMPDIFF(SECOND, timestamp, CURRENT_TIMESTAMP()) FROM clds_service_cache where invariant_service_id  = ? ";
-            cldsServiceData = jdbcTemplateObject.queryForObject(getCldsServiceSQL, new Object[] { invariantUUID },
-                    new CldsServiceDataMapper());
-            logger.info("value of cldsServiceDataList: {}", cldsServiceDataList);
-        } catch (EmptyResultDataAccessException e) {
-            logger.info("cache row not found for invariantUUID: {}", invariantUUID);
-        }
+        String getCldsServiceSQL = "SELECT * , TIMESTAMPDIFF(SECOND, timestamp, CURRENT_TIMESTAMP()) FROM clds_service_cache where invariant_service_id  = ? ";
+        cldsServiceData = jdbcTemplateObject.queryForObject(getCldsServiceSQL, new Object[] { invariantUUID },
+                new CldsServiceDataMapper());
+        logger.info("value of cldsServiceDataList: {}", cldsServiceDataList);
         return cldsServiceData;
     }
 
@@ -499,7 +494,7 @@
         }
     }
 
-    public void doHealthCheck() throws SQLException, IOException {
+    public void doHealthCheck() {
         jdbcTemplateObject.execute(HEALTHCHECK);
     }
 
diff --git a/src/main/java/org/onap/clamp/clds/exception/policy/PolicyClientException.java b/src/main/java/org/onap/clamp/clds/exception/policy/PolicyClientException.java
new file mode 100644
index 0000000..eaeb0b8
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/exception/policy/PolicyClientException.java
@@ -0,0 +1,61 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2017 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.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.exception.policy;
+
+/**
+ * New exception to Policy Client errors.
+ *
+ */
+public class PolicyClientException extends RuntimeException {
+
+    /**
+     * Serial ID.
+     */
+    private static final long serialVersionUID = -8379167975420213634L;
+
+    /**
+     * This constructor can be used to create a new PolicyClientException.
+     * 
+     * @param message
+     *            A string message detailing the problem
+     * @param e
+     *            The exception sent by the code
+     */
+    public PolicyClientException(String message, Throwable e) {
+        super(message, e);
+    }
+
+    /**
+     * This constructor can be used to create a new PolicyClientException. Use
+     * this constructor only if you are creating a new exception stack, not if
+     * an exception was already raised by another code.
+     *
+     * @param message
+     *            A string message detailing the problem
+     */
+    public PolicyClientException(String message) {
+        super(message);
+    }
+
+}
diff --git a/src/main/java/org/onap/clamp/clds/model/prop/AbstractModelElement.java b/src/main/java/org/onap/clamp/clds/model/prop/AbstractModelElement.java
new file mode 100644
index 0000000..a7dd5cb
--- /dev/null
+++ b/src/main/java/org/onap/clamp/clds/model/prop/AbstractModelElement.java
@@ -0,0 +1,280 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP CLAMP
+ * ================================================================================
+ * Copyright (C) 2017 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.
+ * ============LICENSE_END============================================
+ * ===================================================================
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+
+package org.onap.clamp.clds.model.prop;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.fasterxml.jackson.databind.JsonNode;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Provide base ModelElement functionality. Perform base parsing of properties
+ * for a ModelElement (such as, Collector, StringMatch, Policy, Tca, Holmes,
+ * ...)
+ */
+public abstract class AbstractModelElement {
+    protected static final EELFLogger logger      = EELFManager.getInstance().getLogger(AbstractModelElement.class);
+    protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger();
+
+    private final String              type;
+    private final ModelBpmn           modelBpmn;
+    private final String              id;
+    protected String                  topicPublishes;
+    protected final JsonNode          modelElementJsonNode;
+    private boolean                   isFound;
+
+    private final ModelProperties     modelProp;
+
+    /**
+     * Perform base parsing of properties for a ModelElement (such as,
+     * Collector, StringMatch, Policy and Tca)
+     *
+     * @param type
+     * @param modelProp
+     * @param modelBpmn
+     * @param modelJson
+     */
+    protected AbstractModelElement(String type, ModelProperties modelProp, ModelBpmn modelBpmn, JsonNode modelJson) {
+        this.type = type;
+        this.modelProp = modelProp;
+        this.modelBpmn = modelBpmn;
+        this.id = modelBpmn.getId(type);
+        this.modelElementJsonNode = modelJson.get(id);
+        this.isFound = modelBpmn.isModelElementTypeInList(type);
+    }
+
+    /**
+     * topicSubscribes is the topicPublishes of the from Model Element (the
+     * previous one in the chain).
+     *
+     * @return the topicSubscribes
+     */
+    public String getTopicSubscribes() {
+        // get fromId for this type
+        String fromId = modelBpmn.getFromId(type);
+        // find the type of the from model element
+        String fromType = modelBpmn.getType(fromId);
+        // get the model element for the type
+        AbstractModelElement me = modelProp.getModelElementByType(fromType);
+        // get the topic publishes for the model element
+        return me.topicPublishes;
+    }
+
+    /**
+     * @return the topicPublishes
+     */
+    public String getTopicPublishes() {
+        return topicPublishes;
+    }
+
+    /**
+     * Return the value field of the json node element that has a name field
+     * equals to the given name.
+     *
+     * @param nodeIn
+     * @param name
+     * @return
+     */
+    public static String getValueByName(JsonNode nodeIn, String name) {
+        String value = null;
+        if (nodeIn != null) {
+            for (JsonNode node : nodeIn) {
+                if (node.path("name").asText().equals(name)) {
+                    JsonNode vnode = node.path("value");
+                    if (vnode.isArray()) {
+                        // if array, assume value is in first element
+                        value = vnode.path(0).asText();
+                    } else {
+                        // otherwise, just return text
+                        value = vnode.asText();
+                    }
+                }
+            }
+        }
+        if (value == null || value.length() == 0) {
+            logger.warn(name + "=" + value);
+        } else {
+            logger.debug(name + "=" + value);
+        }
+        return value;
+    }
+
+    /**
+     * Return the value field of the json node element that has a name field
+     * that equals the given name.
+     * 
+     * @param nodeIn
+     * @param name
+     * @return
+     */
+    public static String getNodeValueByName(JsonNode nodeIn, String name) {
+        String value = null;
+        if (nodeIn != null) {
+            value = nodeIn.path(name).asText();
+        }
+        if (value == null || value.length() == 0) {
+            logger.warn(name + "=" + value);
+        } else {
+            logger.debug(name + "=" + value);
+        }
+        return value;
+    }
+
+    /**
+     * Return the value field of the json node element that has a name field
+     * that equals the given name.
+     * 
+     * @param nodeIn
+     * @param name
+     * @return
+     */
+    public static List<String> getNodeValuesByName(JsonNode nodeIn, String name) {
+        List<String> values = new ArrayList<>();
+        if (nodeIn != null) {
+            Iterator<JsonNode> i = nodeIn.iterator();
+            while (i.hasNext()) {
+                JsonNode node = i.next();
+                if (node.path("name").asText().equals(name)) {
+                    JsonNode vnode = node.path("value");
+                    if (vnode.isArray()) {
+                        // if array, assume value is in first element
+                        values.add(vnode.path(0).asText());
+                    } else {
+                        // otherwise, just return text
+                        values.add(vnode.asText());
+                    }
+                }
+            }
+        }
+        return values;
+    }
+
+    /**
+     * Return the int value field of the json node element that has a name field
+     * equals to the given name.
+     *
+     * @param nodeIn
+     * @param name
+     * @return
+     */
+    public static Integer getIntValueByName(JsonNode nodeIn, String name) {
+        String value = getValueByName(nodeIn, name);
+        return Integer.valueOf(value);
+    }
+
+    /**
+     * Return an array of values for the field of the json node element that has
+     * a name field equals to the given name.
+     *
+     * @param nodeIn
+     * @param name
+     * @return
+     */
+    public static List<String> getValuesByName(JsonNode nodeIn, String name) {
+        List<String> values = null;
+        if (nodeIn != null) {
+            Iterator<JsonNode> i = nodeIn.iterator();
+            while (i.hasNext()) {
+                JsonNode node = i.next();
+                if (node.path("name").asText().equals(name)) {
+                    values = getValuesList(node);
+                }
+            }
+        }
+        if (values == null || values.isEmpty()) {
+            logger.warn(name + "=" + values);
+        } else {
+            logger.debug(name + "=" + values);
+        }
+        return values;
+    }
+
+    /**
+     * Return an array of String values.
+     *
+     * @param nodeIn
+     * @return
+     */
+    public static List<String> getValuesList(JsonNode nodeIn) {
+        ArrayList<String> al = new ArrayList<>();
+        if (nodeIn != null) {
+            Iterator<JsonNode> itr = nodeIn.path("value").elements();
+            while (itr.hasNext()) {
+                JsonNode node = itr.next();
+                al.add(node.asText());
+            }
+        }
+        return al;
+    }
+
+    /**
+     * Return the value field of the json node element that has a name field
+     * equals to the given name.
+     *
+     * @param name
+     * @return
+     */
+    public String getValueByName(String name) {
+        return getValueByName(modelElementJsonNode, name);
+    }
+
+    /**
+     * Return the int value field of the json node element that has a name field
+     * equals to the given name.
+     *
+     * @param name
+     * @return
+     */
+    public Integer getIntValueByName(String name) {
+        return getIntValueByName(modelElementJsonNode, name);
+    }
+
+    /**
+     * Return an array of values for the field of the json node element that has
+     * a name field equals to the given name.
+     *
+     * @param name
+     * @return
+     */
+    public List<String> getValuesByName(String name) {
+        return getValuesByName(modelElementJsonNode, name);
+    }
+
+    /**
+     * @return the id
+     */
+    public String getId() {
+        return id;
+    }
+
+    /**
+     * @return the isFound
+     */
+    public boolean isFound() {
+        return isFound;
+    }
+}
diff --git a/src/main/java/org/onap/clamp/clds/model/prop/Collector.java b/src/main/java/org/onap/clamp/clds/model/prop/Collector.java
index bcb9cf0..be30f3e 100644
--- a/src/main/java/org/onap/clamp/clds/model/prop/Collector.java
+++ b/src/main/java/org/onap/clamp/clds/model/prop/Collector.java
@@ -30,7 +30,7 @@
 /**
  * Parse Collector json properties.
  */
-public class Collector extends ModelElement {
+public class Collector extends AbstractModelElement {
     protected static final EELFLogger       logger         = EELFManager.getInstance().getLogger(Collector.class);
     protected static final EELFLogger auditLogger    = EELFManager.getInstance().getAuditLogger();
 
diff --git a/src/main/java/org/onap/clamp/clds/model/prop/Global.java b/src/main/java/org/onap/clamp/clds/model/prop/Global.java
index 2fb7d50..48c2fd9 100644
--- a/src/main/java/org/onap/clamp/clds/model/prop/Global.java
+++ b/src/main/java/org/onap/clamp/clds/model/prop/Global.java
@@ -54,11 +54,11 @@
      */
     public Global(JsonNode modelJson) {
         JsonNode globalNode = modelJson.get("global");
-        service = ModelElement.getValueByName(globalNode, "service");
-        actionSet = ModelElement.getValueByName(globalNode, "actionSet");
-        resourceVf = ModelElement.getValuesByName(globalNode, "vf");
-        resourceVfc = ModelElement.getValuesByName(globalNode, "vfc");
-        location = ModelElement.getValuesByName(globalNode, "location");
+        service = AbstractModelElement.getValueByName(globalNode, "service");
+        actionSet = AbstractModelElement.getValueByName(globalNode, "actionSet");
+        resourceVf = AbstractModelElement.getValuesByName(globalNode, "vf");
+        resourceVfc = AbstractModelElement.getValuesByName(globalNode, "vfc");
+        location = AbstractModelElement.getValuesByName(globalNode, "location");
     }
 
     /**
diff --git a/src/main/java/org/onap/clamp/clds/model/prop/Holmes.java b/src/main/java/org/onap/clamp/clds/model/prop/Holmes.java
index 233f656..4fa0407 100644
--- a/src/main/java/org/onap/clamp/clds/model/prop/Holmes.java
+++ b/src/main/java/org/onap/clamp/clds/model/prop/Holmes.java
@@ -32,7 +32,7 @@
  * [{"name":"correlationalLogic","value":"vcwx"},{"name":"operationalPolicy","value":"cccc"}]
  *
  */
-public class Holmes extends ModelElement {
+public class Holmes extends AbstractModelElement {
 
     private static final String TYPE_HOLMES = "holmes";
 
diff --git a/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java b/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java
index 9684eea..ac25400 100644
--- a/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java
+++ b/src/main/java/org/onap/clamp/clds/model/prop/ModelProperties.java
@@ -62,13 +62,13 @@
 
     private Global                                            global;
 
-    private final Map<String, ModelElement>                   modelElements       = new ConcurrentHashMap<>();
+    private final Map<String, AbstractModelElement>                   modelElements       = new ConcurrentHashMap<>();
 
     private String                                            currentModelElementId;
     private String                                            policyUniqueId;
 
     private static final Object                               lock                = new Object();
-    private static Map<Class<? extends ModelElement>, String> modelElementClasses = new ConcurrentHashMap<>();
+    private static Map<Class<? extends AbstractModelElement>, String> modelElementClasses = new ConcurrentHashMap<>();
 
     static {
         synchronized (lock) {
@@ -119,7 +119,7 @@
             // Parse the list of base Model Elements and build up the
             // ModelElements
             modelElementClasses.entrySet().stream().parallel()
-                    .filter(entry -> (ModelElement.class.isAssignableFrom(entry.getKey())
+                    .filter(entry -> (AbstractModelElement.class.isAssignableFrom(entry.getKey())
                             && missingTypes.contains(entry.getValue())))
                     .forEach(entry -> {
                         try {
@@ -183,8 +183,8 @@
      * @param type
      * @return
      */
-    public ModelElement getModelElementByType(String type) {
-        ModelElement modelElement = modelElements.get(type);
+    public AbstractModelElement getModelElementByType(String type) {
+        AbstractModelElement modelElement = modelElements.get(type);
         if (modelElement == null) {
             throw new IllegalArgumentException("Invalid or not found ModelElement type: " + type);
         }
@@ -338,14 +338,14 @@
         return global;
     }
 
-    public static final synchronized void registerModelElement(Class<? extends ModelElement> modelElementClass,
+    public static final synchronized void registerModelElement(Class<? extends AbstractModelElement> modelElementClass,
             String type) {
         if (!modelElementClasses.containsKey(modelElementClass.getClass())) {
             modelElementClasses.put(modelElementClass, type);
         }
     }
 
-    public <T extends ModelElement> T getType(Class<T> clazz) {
+    public <T extends AbstractModelElement> T getType(Class<T> clazz) {
         instantiateMissingModelElements();
         String type = modelElementClasses.get(clazz);
         return (type != null ? (T) modelElements.get(type) : null);
diff --git a/src/main/java/org/onap/clamp/clds/model/prop/Policy.java b/src/main/java/org/onap/clamp/clds/model/prop/Policy.java
index 452af20..80d12aa 100644
--- a/src/main/java/org/onap/clamp/clds/model/prop/Policy.java
+++ b/src/main/java/org/onap/clamp/clds/model/prop/Policy.java
@@ -48,7 +48,7 @@
  * ""]},{"name":"onOtherFailure","value":[""]},{"name":"policy_parent","value":[
  * "vf3RtPi"]}]]}]
  */
-public class Policy extends ModelElement {
+public class Policy extends AbstractModelElement {
     protected static final EELFLogger logger      = EELFManager.getInstance().getLogger(Policy.class);
     protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger();
 
diff --git a/src/main/java/org/onap/clamp/clds/model/prop/PolicyChain.java b/src/main/java/org/onap/clamp/clds/model/prop/PolicyChain.java
index 6142e9e..c8c2ef4 100644
--- a/src/main/java/org/onap/clamp/clds/model/prop/PolicyChain.java
+++ b/src/main/java/org/onap/clamp/clds/model/prop/PolicyChain.java
@@ -63,13 +63,13 @@
 
     public PolicyChain(JsonNode node) {
 
-        policyId = ModelElement.getValueByName(node, "pid");
-        timeout = ModelElement.getIntValueByName(node, "timeout");
+        policyId = AbstractModelElement.getValueByName(node, "pid");
+        timeout = AbstractModelElement.getIntValueByName(node, "timeout");
 
         // process policy configurations
         JsonNode policyNode = node.get(node.size() - 1).get("policyConfigurations");
         Iterator<JsonNode> itr = policyNode.elements();
-        policyItems = new ArrayList<PolicyItem>();
+        policyItems = new ArrayList<>();
         while (itr.hasNext()) {
             policyItems.add(new PolicyItem(itr.next()));
         }
diff --git a/src/main/java/org/onap/clamp/clds/model/prop/PolicyItem.java b/src/main/java/org/onap/clamp/clds/model/prop/PolicyItem.java
index d1729cd..c84affe 100644
--- a/src/main/java/org/onap/clamp/clds/model/prop/PolicyItem.java
+++ b/src/main/java/org/onap/clamp/clds/model/prop/PolicyItem.java
@@ -64,12 +64,12 @@
      * @param node
      */
     public PolicyItem(JsonNode node) {
-        id = ModelElement.getValueByName(node, "_id");
-        recipe = ModelElement.getValueByName(node, "recipe");
-        maxRetries = ModelElement.getIntValueByName(node, "maxRetries");
-        retryTimeLimit = ModelElement.getIntValueByName(node, "retryTimeLimit");
-        parentPolicy = ModelElement.getValueByName(node, "parentPolicy");
-        parentPolicyConditions = ModelElement.getValuesByName(node, "parentPolicyConditions");
+        id = AbstractModelElement.getValueByName(node, "_id");
+        recipe = AbstractModelElement.getValueByName(node, "recipe");
+        maxRetries = AbstractModelElement.getIntValueByName(node, "maxRetries");
+        retryTimeLimit = AbstractModelElement.getIntValueByName(node, "retryTimeLimit");
+        parentPolicy = AbstractModelElement.getValueByName(node, "parentPolicy");
+        parentPolicyConditions = AbstractModelElement.getValuesByName(node, "parentPolicyConditions");
 
     }
 
diff --git a/src/main/java/org/onap/clamp/clds/model/prop/ResourceGroup.java b/src/main/java/org/onap/clamp/clds/model/prop/ResourceGroup.java
index 6e986bb..7395ced 100644
--- a/src/main/java/org/onap/clamp/clds/model/prop/ResourceGroup.java
+++ b/src/main/java/org/onap/clamp/clds/model/prop/ResourceGroup.java
@@ -78,8 +78,8 @@
      */
     public ResourceGroup(JsonNode node) {
 
-        groupNumber = ModelElement.getValueByName(node, "rgname");
-        policyId = ModelElement.getValueByName(node, "policyId");
+        groupNumber = AbstractModelElement.getValueByName(node, "rgname");
+        policyId = AbstractModelElement.getValueByName(node, "policyId");
 
         // process Server_Configurations
         JsonNode serviceConfigurationsNode = node.get(node.size() - 1).get("serviceConfigurations");
diff --git a/src/main/java/org/onap/clamp/clds/model/prop/ServiceConfiguration.java b/src/main/java/org/onap/clamp/clds/model/prop/ServiceConfiguration.java
index 186cc21..f15d701 100644
--- a/src/main/java/org/onap/clamp/clds/model/prop/ServiceConfiguration.java
+++ b/src/main/java/org/onap/clamp/clds/model/prop/ServiceConfiguration.java
@@ -84,15 +84,15 @@
      * @param node
      */
     public ServiceConfiguration(JsonNode node) {
-        aaiMatchingFields = ModelElement.getValuesByName(node, "aaiMatchingFields");
-        aaiSendFields = ModelElement.getValuesByName(node, "aaiSendFields");
+        aaiMatchingFields = AbstractModelElement.getValuesByName(node, "aaiMatchingFields");
+        aaiSendFields = AbstractModelElement.getValuesByName(node, "aaiSendFields");
         // groupNumber = ModelElement.getValueByName(node, "groupNumber");
-        resourceVf = ModelElement.getValuesByName(node, "vf");
-        resourceVfc = ModelElement.getValuesByName(node, "vfc");
-        timeWindow = ModelElement.getValueByName(node, "timeWindow");
-        ageLimit = ModelElement.getValueByName(node, "ageLimit");
-        createClosedLoopEventId = ModelElement.getValueByName(node, "createClosedLoopEventId");
-        outputEventName = ModelElement.getValueByName(node, "outputEventName");
+        resourceVf = AbstractModelElement.getValuesByName(node, "vf");
+        resourceVfc = AbstractModelElement.getValuesByName(node, "vfc");
+        timeWindow = AbstractModelElement.getValueByName(node, "timeWindow");
+        ageLimit = AbstractModelElement.getValueByName(node, "ageLimit");
+        createClosedLoopEventId = AbstractModelElement.getValueByName(node, "createClosedLoopEventId");
+        outputEventName = AbstractModelElement.getValueByName(node, "outputEventName");
 
         // process the stringSet fields
         JsonNode ssNodes = node.findPath("stringSet");
diff --git a/src/main/java/org/onap/clamp/clds/model/prop/StringMatch.java b/src/main/java/org/onap/clamp/clds/model/prop/StringMatch.java
index 7fcc1b1..b74e7d1 100644
--- a/src/main/java/org/onap/clamp/clds/model/prop/StringMatch.java
+++ b/src/main/java/org/onap/clamp/clds/model/prop/StringMatch.java
@@ -59,7 +59,7 @@
  * "outputEventName","value":["ABATED"]}]]}]}}
  *
  */
-public class StringMatch extends ModelElement {
+public class StringMatch extends AbstractModelElement {
 
     private List<ResourceGroup> resourceGroups;
 
diff --git a/src/main/java/org/onap/clamp/clds/model/prop/Tca.java b/src/main/java/org/onap/clamp/clds/model/prop/Tca.java
index 6bc68e2..f7bbac0 100644
--- a/src/main/java/org/onap/clamp/clds/model/prop/Tca.java
+++ b/src/main/java/org/onap/clamp/clds/model/prop/Tca.java
@@ -48,7 +48,7 @@
  *
  *
  */
-public class Tca extends ModelElement {
+public class Tca extends AbstractModelElement {
 
     protected static final EELFLogger logger      = EELFManager.getInstance().getLogger(Tca.class);
     protected static final EELFLogger auditLogger = EELFManager.getInstance().getAuditLogger();
diff --git a/src/main/java/org/onap/clamp/clds/model/prop/TcaItem.java b/src/main/java/org/onap/clamp/clds/model/prop/TcaItem.java
index aa1abde..f104b09 100644
--- a/src/main/java/org/onap/clamp/clds/model/prop/TcaItem.java
+++ b/src/main/java/org/onap/clamp/clds/model/prop/TcaItem.java
@@ -70,17 +70,17 @@
      */
     public TcaItem(JsonNode node) {
 
-        tcaName = ModelElement.getValueByName(node, "tname");
-        tcaUuId = ModelElement.getValueByName(node, "tuuid");
-        nfNamingCode = ModelElement.getValueByName(node, "tnfc");
-        tcaEnable = ModelElement.getValueByName(node, "tcaEnab");
-        policyId = ModelElement.getValueByName(node, "tcaPolId");
-        if (ModelElement.getValueByName(node, "tcaInt") != null) {
-            interval = Integer.valueOf(ModelElement.getValueByName(node, "tcaInt"));
+        tcaName = AbstractModelElement.getValueByName(node, "tname");
+        tcaUuId = AbstractModelElement.getValueByName(node, "tuuid");
+        nfNamingCode = AbstractModelElement.getValueByName(node, "tnfc");
+        tcaEnable = AbstractModelElement.getValueByName(node, "tcaEnab");
+        policyId = AbstractModelElement.getValueByName(node, "tcaPolId");
+        if (AbstractModelElement.getValueByName(node, "tcaInt") != null) {
+            interval = Integer.valueOf(AbstractModelElement.getValueByName(node, "tcaInt"));
         }
-        severity = ModelElement.getValueByName(node, "tcaSev");
-        if (ModelElement.getValueByName(node, "tcaVio") != null) {
-            violations = Integer.valueOf(ModelElement.getValueByName(node, "tcaVio"));
+        severity = AbstractModelElement.getValueByName(node, "tcaSev");
+        if (AbstractModelElement.getValueByName(node, "tcaVio") != null) {
+            violations = Integer.valueOf(AbstractModelElement.getValueByName(node, "tcaVio"));
         }
 
         // process service Configurations
diff --git a/src/main/java/org/onap/clamp/clds/service/CldsService.java b/src/main/java/org/onap/clamp/clds/service/CldsService.java
index ff4cfda..920bce1 100644
--- a/src/main/java/org/onap/clamp/clds/service/CldsService.java
+++ b/src/main/java/org/onap/clamp/clds/service/CldsService.java
@@ -500,9 +500,6 @@
         if (test != null && test.equalsIgnoreCase("true")) {
             isTest = true;
         } else {
-            // if action.test.override is true, then any action will be marked
-            // as test=true (even if incoming action request had test=false);
-            // otherwise, test flag will be unchanged on the action request
             String actionTestOverride = refProp.getStringValue("action.test.override");
             if (actionTestOverride != null && actionTestOverride.equalsIgnoreCase("true")) {
                 logger.info("PUT actionTestOverride={}", actionTestOverride);
@@ -666,8 +663,7 @@
     /**
      * REST service that retrieves total properties by using invariantUUID based
      * on refresh and non refresh
-     *
-     * @throws Exception
+     * 
      */
     @ApiOperation(value = "Retrieves total properties by using invariantUUID based on refresh and non refresh", notes = "", response = String.class)
     @GET
@@ -675,7 +671,7 @@
     @Produces(MediaType.APPLICATION_JSON)
     public String getSdcPropertiesByServiceUUIDForRefresh(
             @PathParam("serviceInvariantUUID") String serviceInvariantUUID,
-            @DefaultValue("false") @QueryParam("refresh") String refresh) throws Exception {
+            @DefaultValue("false") @QueryParam("refresh") String refresh) {
         Date startTime = new Date();
         LoggingUtils.setRequestContext("CldsService: GET sdc properties by uuid", getPrincipalName());
         CldsServiceData cldsServiceData = new CldsServiceData();
@@ -901,7 +897,7 @@
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     public CldsModel deployModel(@PathParam("action") String action, @PathParam("modelName") String modelName,
-            @QueryParam("test") String test, CldsModel model) throws Exception {
+            @QueryParam("test") String test, CldsModel model) throws IOException {
         Date startTime = new Date();
         LoggingUtils.setRequestContext("CldsService: Deploy model", getPrincipalName());
         String deploymentId = "closedLoop_" + UUID.randomUUID() + "_deploymentId";
diff --git a/src/main/java/org/onap/clamp/clds/service/CldsUser.java b/src/main/java/org/onap/clamp/clds/service/CldsUser.java
index 9db1e60..34a3f8e 100644
--- a/src/main/java/org/onap/clamp/clds/service/CldsUser.java
+++ b/src/main/java/org/onap/clamp/clds/service/CldsUser.java
@@ -71,7 +71,7 @@
     }
 
     public String[] getPermissionsString() {
-        return Arrays.stream(getPermissions()).map(perm -> perm.getKey()).toArray(String[]::new);
+        return Arrays.stream(getPermissions()).map(SecureServicePermission::getKey).toArray(String[]::new);
     }
 
     /**
diff --git a/src/test/java/org/onap/clamp/clds/client/req/SdcReqTest.java b/src/test/java/org/onap/clamp/clds/client/req/SdcReqTest.java
index 20b85d6..a283f43 100644
--- a/src/test/java/org/onap/clamp/clds/client/req/SdcReqTest.java
+++ b/src/test/java/org/onap/clamp/clds/client/req/SdcReqTest.java
@@ -40,11 +40,11 @@
 
 public class SdcReqTest {
 
-    String baseUrl = "AYBABTU";
+    String baseUrl              = "AYBABTU";
     String serviceInvariantUUID = "serviceInvariantUUID";
 
     @Test
-    public void getSdcReqUrlsListNoGlobalPropTest() throws Exception {
+    public void getSdcReqUrlsListNoGlobalPropTest() {
         ModelProperties prop = mock(ModelProperties.class);
         SdcCatalogServices sdcCatalogServices = mock(SdcCatalogServices.class);
         DelegateExecution delegateExecution = mock(DelegateExecution.class);
diff --git a/src/test/java/org/onap/clamp/clds/it/PolicyClientIT.java b/src/test/java/org/onap/clamp/clds/it/PolicyClientIT.java
index 19fad48..69df972 100644
--- a/src/test/java/org/onap/clamp/clds/it/PolicyClientIT.java
+++ b/src/test/java/org/onap/clamp/clds/it/PolicyClientIT.java
@@ -119,7 +119,7 @@
             try {
                 responseMessage = policyClient.sendMicroServiceInJson(policyJson, prop, tcaPolicyRequestUuid);
             } catch (Exception e) {
-                assertTrue(e.getMessage().contains("Policy send failed: PE500 "));
+                assertTrue(e.getMessage().contains("Exception while communicating with Policy"));
             }
             System.out.println(responseMessage);
         }
diff --git a/src/test/java/org/onap/clamp/clds/it/SdcCatalogServicesIT.java b/src/test/java/org/onap/clamp/clds/it/SdcCatalogServicesIT.java
index 5d08e5e..a12d6b7 100644
--- a/src/test/java/org/onap/clamp/clds/it/SdcCatalogServicesIT.java
+++ b/src/test/java/org/onap/clamp/clds/it/SdcCatalogServicesIT.java
@@ -202,9 +202,10 @@
     @Test
     public void getServiceUuidFromServiceInvariantIdTest() throws Exception {
         SdcCatalogServices spy = Mockito.spy(sdcCatalogWired);
-        Mockito.when(spy.getSdcServicesInformation(null)).thenReturn(IOUtils.toString(
-                SdcCatalogServicesIT.class.getResourceAsStream("/example/sdc/sdcServicesListExample.json"), "UTF-8"));
 
+        Mockito.doReturn(IOUtils.toString(
+                SdcCatalogServicesIT.class.getResourceAsStream("/example/sdc/sdcServicesListExample.json"), "UTF-8"))
+                .when(spy).getSdcServicesInformation(null);
         // Try the vcts4 version 1.0, this one should be replaced by 1.1 so it
         // should not exist, returning empty string
         String resUuidVcts4Null = spy.getServiceUuidFromServiceInvariantId("a33ed748-3477-4434-b3f3-b5560f5e7d9b");
@@ -228,8 +229,10 @@
     @Test
     public void getCldsServiceDataWithAlarmConditionsTest() throws Exception {
         SdcCatalogServices spy = Mockito.spy(sdcCatalogWired);
-        Mockito.when(spy.getSdcServicesInformation(null)).thenReturn(IOUtils.toString(
-                SdcCatalogServicesIT.class.getResourceAsStream("/example/sdc/sdcServicesListExample.json"), "UTF-8"));
+
+        Mockito.doReturn(IOUtils.toString(
+                SdcCatalogServicesIT.class.getResourceAsStream("/example/sdc/sdcServicesListExample.json"), "UTF-8"))
+                .when(spy).getSdcServicesInformation(null);
 
         // This invariant uuid is the one from vcts4 v1.1
         String serviceResourceDetailUrl = refProp.getStringValue("sdc.serviceUrl")
@@ -286,7 +289,8 @@
         assertTrue("29018914-966c-442d-9d08-251b9dc45b8f".equals(cldsServiceData.getServiceUUID()));
         assertTrue(cldsServiceData.getCldsVfs().size() == 1);
 
-        List<CldsAlarmCondition> alarmsList = spy.getAllAlarmConditionsFromCldsServiceData(cldsServiceData, "alarmCondition");
+        List<CldsAlarmCondition> alarmsList = spy.getAllAlarmConditionsFromCldsServiceData(cldsServiceData,
+                "alarmCondition");
         assertTrue(alarmsList.size() == 6);
 
     }
diff --git a/src/test/java/org/onap/clamp/clds/model/prop/CustomModelElement.java b/src/test/java/org/onap/clamp/clds/model/prop/CustomModelElement.java
index c6b19d0..03d7d65 100644
--- a/src/test/java/org/onap/clamp/clds/model/prop/CustomModelElement.java
+++ b/src/test/java/org/onap/clamp/clds/model/prop/CustomModelElement.java
@@ -28,7 +28,7 @@
 /**

  * A CustomModelElement to test the capability to add new elements on the fly.

  */

-public class CustomModelElement extends ModelElement {

+public class CustomModelElement extends AbstractModelElement {

 

     private static final String CUSTOM_TYPE = "customType";