Implement validation and hierarchical get
[policy/models.git] / models-tosca / src / main / java / org / onap / policy / models / tosca / authorative / provider / AuthorativeToscaProvider.java
index cd73ae5..6e60303 100644 (file)
@@ -1,6 +1,6 @@
 /*-
  * ============LICENSE_START=======================================================
- *  Copyright (C) 2019 Nordix Foundation.
+ *  Copyright (C) 2019-2020 Nordix Foundation.
  *  Modifications Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -26,11 +26,15 @@ import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.TreeMap;
+
+import javax.ws.rs.core.Response.Status;
 
 import lombok.NonNull;
 
 import org.onap.policy.models.base.PfConceptKey;
 import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.dao.PfDao;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
@@ -65,8 +69,9 @@ public class AuthorativeToscaProvider {
 
         LOGGER.debug("->getPolicyTypes: name={}, version={}", name, version);
 
-        ToscaServiceTemplate serviceTemplate =
-                new SimpleToscaProvider().getPolicyTypes(dao, name, version).toAuthorative();
+        JpaToscaServiceTemplate jpaServiceTemplate = new SimpleToscaProvider().getPolicyTypes(dao, name, version);
+
+        ToscaServiceTemplate serviceTemplate = jpaServiceTemplate.toAuthorative();
 
         LOGGER.debug("<-getPolicyTypes: name={}, version={}, serviceTemplate={}", name, version, serviceTemplate);
         return serviceTemplate;
@@ -86,8 +91,14 @@ public class AuthorativeToscaProvider {
 
         LOGGER.debug("->getPolicyTypeList: name={}, version={}", name, version);
 
-        List<ToscaPolicyType> policyTypeList = asConceptList(
-                new SimpleToscaProvider().getPolicyTypes(dao, name, version).toAuthorative().getPolicyTypes());
+        List<ToscaPolicyType> policyTypeList;
+
+        try {
+            policyTypeList = new ArrayList<>(new SimpleToscaProvider().getPolicyTypes(dao, name, version)
+                    .toAuthorative().getPolicyTypes().values());
+        } catch (PfModelRuntimeException pfme) {
+            return handlePfModelRuntimeException(pfme);
+        }
 
         LOGGER.debug("<-getPolicyTypeList: name={}, version={}, policyTypeList={}", name, version, policyTypeList);
         return policyTypeList;
@@ -109,7 +120,7 @@ public class AuthorativeToscaProvider {
         ToscaServiceTemplate serviceTemplate =
                 new SimpleToscaProvider().getPolicyTypes(dao, null, null).toAuthorative();
 
-        List<ToscaPolicyType> filteredPolicyTypes = asConceptList(serviceTemplate.getPolicyTypes());
+        List<ToscaPolicyType> filteredPolicyTypes = new ArrayList<>(serviceTemplate.getPolicyTypes().values());
         filteredPolicyTypes = filter.filter(filteredPolicyTypes);
 
         serviceTemplate.setPolicyTypes(asConceptMap(filteredPolicyTypes));
@@ -135,6 +146,7 @@ public class AuthorativeToscaProvider {
 
         LOGGER.debug("<-getFilteredPolicyTypeList: filter={}, filteredPolicyTypeList={}", filter,
                 filteredPolicyTypeList);
+
         return filteredPolicyTypeList;
     }
 
@@ -233,8 +245,14 @@ public class AuthorativeToscaProvider {
             throws PfModelException {
         LOGGER.debug("->getPolicyList: name={}, version={}", name, version);
 
-        List<ToscaPolicy> policyList = asConceptList(new SimpleToscaProvider().getPolicies(dao, name, version)
-                .toAuthorative().getToscaTopologyTemplate().getPolicies());
+        List<ToscaPolicy> policyList;
+
+        try {
+            policyList = asConceptList(new SimpleToscaProvider().getPolicies(dao, name, version).toAuthorative()
+                    .getToscaTopologyTemplate().getPolicies());
+        } catch (PfModelRuntimeException pfme) {
+            return handlePfModelRuntimeException(pfme);
+        }
 
         LOGGER.debug("<-getPolicyList: name={}, version={}, policyTypeList={}", name, version, policyList);
         return policyList;
@@ -260,7 +278,7 @@ public class AuthorativeToscaProvider {
         List<ToscaPolicy> filteredPolicies = asConceptList(serviceTemplate.getToscaTopologyTemplate().getPolicies());
         filteredPolicies = filter.filter(filteredPolicies);
 
-        serviceTemplate.getToscaTopologyTemplate().setPolicies(asConceptMap(filteredPolicies));
+        serviceTemplate.getToscaTopologyTemplate().setPolicies(asConceptMapList(filteredPolicies));
 
         LOGGER.debug("<-getFilteredPolicies: filter={}, serviceTemplate={}", filter, serviceTemplate);
         return serviceTemplate;
@@ -371,14 +389,43 @@ public class AuthorativeToscaProvider {
      * @param conceptList the concept list
      * @return the list of concept map
      */
-    private <T extends ToscaEntity> List<Map<String, T>> asConceptMap(List<T> conceptList) {
+    private <T extends ToscaEntity> List<Map<String, T>> asConceptMapList(List<T> conceptList) {
         List<Map<String, T>> toscaEntityMapList = new ArrayList<>();
         for (T concept : conceptList) {
-            Map<String, T> conceptMap = new LinkedHashMap<>();
+            Map<String, T> conceptMap = new TreeMap<>();
             conceptMap.put(concept.getName(), concept);
             toscaEntityMapList.add(conceptMap);
         }
 
         return toscaEntityMapList;
     }
+
+    /**
+     * Return the contents of a list of concepts as map of concepts.
+     *
+     * @param conceptList the concept list
+     * @return the list of concept map
+     */
+    private <T extends ToscaEntity> Map<String, T> asConceptMap(List<T> conceptList) {
+        Map<String, T> conceptMap = new LinkedHashMap<>();
+        for (T concept : conceptList) {
+            conceptMap.put(concept.getName(), concept);
+        }
+
+        return conceptMap;
+    }
+
+    /**
+     * Handle a PfModelRuntimeException on a list call.
+     *
+     * @param pfme the model exception
+     * @return an empty list on 404
+     */
+    private <T extends ToscaEntity> List<T> handlePfModelRuntimeException(final PfModelRuntimeException pfme) {
+        if (Status.NOT_FOUND.equals(pfme.getErrorResponse().getResponseCode())) {
+            return Collections.emptyList();
+        } else {
+            throw pfme;
+        }
+    }
 }