Fix blueprint installation
[clamp.git] / src / main / java / org / onap / clamp / loop / template / PolicyModelsService.java
index 0a09dd8..17cf5c1 100644 (file)
 
 package org.onap.clamp.loop.template;
 
+import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
+import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import org.onap.clamp.clds.tosca.ToscaSchemaConstants;
 import org.onap.clamp.clds.tosca.ToscaYamlToJsonConvertor;
+import org.onap.clamp.policy.pdpgroup.PdpGroup;
 import org.onap.clamp.util.SemanticVersioning;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
 
 @Service
 public class PolicyModelsService {
@@ -43,40 +49,62 @@ public class PolicyModelsService {
         toscaYamlToJsonConvertor = convertor;
     }
 
+    /**
+     * Save or Update Policy Model.
+     *
+     * @param policyModel The policyModel
+     * @return The Policy Model
+     */
     public PolicyModel saveOrUpdatePolicyModel(PolicyModel policyModel) {
-        return policyModelsRepository.save(policyModel);
+        return policyModelsRepository.saveAndFlush(policyModel);
+    }
+
+    /**
+     * Verify whether Policy Model exist by ID.
+     *
+     * @param policyModelId The policyModel Id
+     * @return The flag indicates whether Policy Model exist
+     */
+    public boolean existsById(PolicyModelId policyModelId) {
+        return policyModelsRepository.existsById(policyModelId);
     }
 
     /**
      * Creates or updates the Tosca Policy Model.
      *
-     * @param policyModelType
-     *        The policyModeltype in Tosca yaml
-     * @param policyModel
-     *        The Policymodel object
-     * @return The Policy Model
+     * @param policyModelTosca The Policymodel object
+     * @return The Policy Model created
      */
-    public PolicyModel saveOrUpdateByPolicyModelType(String policyModelType,
-        String policyModelTosca) {
+    public PolicyModel createNewPolicyModelFromTosca(String policyModelTosca) {
         JsonObject jsonObject = toscaYamlToJsonConvertor.validateAndConvertToJson(policyModelTosca);
-
-        String policyModelTypeName = toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject,
+        String policyModelTypeFromTosca = toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject,
             ToscaSchemaConstants.METADATA_POLICY_MODEL_TYPE);
-        String acronym = toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject,
-            ToscaSchemaConstants.METADATA_ACRONYM);
-        PolicyModel model = getPolicyModelByType(
-            policyModelTypeName != null ? policyModelTypeName : policyModelType);
-
-        if (model == null) {
-            model = new PolicyModel(policyModelTypeName, policyModelTosca,
-                SemanticVersioning.incrementMajorVersion(null), acronym);
-        } else {
-            model.setVersion(SemanticVersioning
-                .incrementMajorVersion(model.getVersion() != null ? model.getVersion() : null));
-            model.setPolicyModelType(policyModelTypeName);
-            model.setPolicyAcronym(acronym);
-        }
-        return saveOrUpdatePolicyModel(model);
+        Iterable<PolicyModel> models = getAllPolicyModelsByType(policyModelTypeFromTosca);
+        Collections.sort((List<PolicyModel>) models);
+        PolicyModel newPolicyModel = new PolicyModel(policyModelTypeFromTosca, policyModelTosca,
+            SemanticVersioning.incrementMajorVersion(((ArrayList) models).isEmpty() ? null
+                : ((ArrayList<PolicyModel>) models).get(0).getVersion()),
+            toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject,
+                ToscaSchemaConstants.METADATA_ACRONYM));
+        return saveOrUpdatePolicyModel(newPolicyModel);
+    }
+
+    /**
+     * Update an existing Tosca Policy Model.
+     *
+     * @param policyModelType The policy Model type in Tosca yaml
+     * @param policyModelVersion The policy Version to update
+     * @param policyModelTosca The Policy Model tosca
+     * @return The Policy Model updated
+     */
+    public PolicyModel updatePolicyModelTosca(String policyModelType, String policyModelVersion,
+        String policyModelTosca) {
+        JsonObject jsonObject = toscaYamlToJsonConvertor.validateAndConvertToJson(policyModelTosca);
+        PolicyModel thePolicyModel = getPolicyModel(policyModelType, policyModelVersion);
+        thePolicyModel.setPolicyAcronym(toscaYamlToJsonConvertor.getValueFromMetadata(jsonObject,
+            ToscaSchemaConstants.METADATA_ACRONYM));
+        thePolicyModel.setPolicyModelTosca(policyModelTosca);
+        return saveOrUpdatePolicyModel(thePolicyModel);
     }
 
     public List<String> getAllPolicyModelTypes() {
@@ -95,19 +123,51 @@ public class PolicyModelsService {
         return policyModelsRepository.findByPolicyModelType(type);
     }
 
-    public PolicyModel getPolicyModelByType(String type) {
-        List<PolicyModel> list = policyModelsRepository.findByPolicyModelType(type);
-        return list.stream().sorted().findFirst().orElse(null);
-    }
-
     /**
      * Retrieves the Tosca model Yaml string.
      *
-     * @param type The PolicyModelType
+     * @param type The Policy Model Type
+     * @param version The policy model version
      * @return The Tosca model Yaml string
      */
-    public String getPolicyModelTosca(String type) {
-        PolicyModel policyModel = getPolicyModelByType(type);
-        return policyModel != null ? policyModel.getPolicyModelTosca() : null;
+    public String getPolicyModelTosca(String type, String version) {
+        return policyModelsRepository.findById(new PolicyModelId(type, version))
+            .orElse(new PolicyModel()).getPolicyModelTosca();
+    }
+
+    /**
+     * This method creates an PolicyModel in Db if it does not exist.
+     *
+     * @param policyModel The policyModel to save
+     */
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    public PolicyModel savePolicyModelInNewTransaction(PolicyModel policyModel) {
+            return policyModelsRepository.saveAndFlush(policyModel);
+    }
+
+    /**
+     * Update the Pdp Group info in Policy Model DB.
+     *
+     * @param pdpGroupList The list of Pdp Group info received from Policy Engine
+     */
+    public void updatePdpGroupInfo(List<PdpGroup> pdpGroupList) {
+        List<PolicyModel> policyModelList = policyModelsRepository.findAll();
+        for (PolicyModel policyModel : policyModelList) {
+            JsonArray supportedPdpGroups = new JsonArray();
+            for (PdpGroup pdpGroup : pdpGroupList) {
+                JsonObject supportedPdpGroup = pdpGroup.getSupportedSubgroups(
+                    policyModel.getPolicyModelType(), policyModel.getVersion());
+                if (supportedPdpGroup != null) {
+                    supportedPdpGroups.add(supportedPdpGroup);
+                }
+            }
+
+            if (supportedPdpGroups.size() > 0) {
+                JsonObject supportedPdpJson = new JsonObject();
+                supportedPdpJson.add("supportedPdpGroups", supportedPdpGroups);
+                policyModel.setPolicyPdpGroup(supportedPdpJson);
+                policyModelsRepository.saveAndFlush(policyModel);
+            }
+        }
     }
 }