Fix metadataSet serialization for db persistence and retrieval. 85/127785/1
authorrameshiyer27 <ramesh.murugan.iyer@est.tech>
Mon, 14 Mar 2022 15:24:25 +0000 (15:24 +0000)
committerRamesh Murugan Iyer <ramesh.murugan.iyer@est.tech>
Mon, 14 Mar 2022 23:16:13 +0000 (23:16 +0000)
PDP fails to parse metadataSet from PDP_UPDATE message. MetadataSet(Lob)
needs to be serialized and de-serialized for storage/retrieval to
preserve the format.

Issue-ID: POLICY-3934
Signed-off-by: zrrmmua <ramesh.murugan.iyer@est.tech>
Change-Id: I5f7a0649639f142c7afb4dd93cc8081ebaac4081

models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaEntityType.java
models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicy.java

index 84381fb..14c8ca4 100644 (file)
@@ -31,16 +31,20 @@ import javax.persistence.ElementCollection;
 import javax.persistence.EmbeddedId;
 import javax.persistence.Lob;
 import javax.persistence.MappedSuperclass;
+import javax.ws.rs.core.Response;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NonNull;
 import org.apache.commons.lang3.ObjectUtils;
 import org.onap.policy.common.parameters.annotations.NotBlank;
 import org.onap.policy.common.parameters.annotations.NotNull;
+import org.onap.policy.common.utils.coder.CoderException;
+import org.onap.policy.common.utils.coder.StandardCoder;
 import org.onap.policy.models.base.PfAuthorative;
 import org.onap.policy.models.base.PfConcept;
 import org.onap.policy.models.base.PfConceptKey;
 import org.onap.policy.models.base.PfKey;
+import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.base.PfUtils;
 import org.onap.policy.models.base.validation.annotations.VerifyKey;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
@@ -54,6 +58,8 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaEntity;
 public class JpaToscaEntityType<T extends ToscaEntity> extends PfConcept implements PfAuthorative<T> {
     private static final long serialVersionUID = -1330661834220739393L;
 
+    private static final StandardCoder STANDARD_CODER = new StandardCoder();
+
     @EmbeddedId
     @VerifyKey
     @NotNull
@@ -128,7 +134,7 @@ public class JpaToscaEntityType<T extends ToscaEntity> extends PfConcept impleme
             toscaEntity.setDescription(description);
         }
 
-        toscaEntity.setMetadata(PfUtils.mapMap(metadata, item -> item));
+        toscaEntity.setMetadata(PfUtils.mapMap(metadata, this::deserializeMetadataValue));
 
         return toscaEntity;
     }
@@ -158,7 +164,7 @@ public class JpaToscaEntityType<T extends ToscaEntity> extends PfConcept impleme
             description = toscaEntity.getDescription();
         }
 
-        metadata = PfUtils.mapMap(toscaEntity.getMetadata(), Object::toString);
+        metadata = PfUtils.mapMap(toscaEntity.getMetadata(), this::serializeMetadataValue);
     }
 
     @Override
@@ -219,4 +225,22 @@ public class JpaToscaEntityType<T extends ToscaEntity> extends PfConcept impleme
 
         return ObjectUtils.compare(description, other.description);
     }
+
+    protected Object deserializeMetadataValue(String metadataValue) {
+        try {
+            return STANDARD_CODER.decode(metadataValue, Object.class);
+        } catch (CoderException ce) {
+            String errorMessage = "error decoding metadata JSON value read from database: " + metadataValue;
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, errorMessage, ce);
+        }
+    }
+
+    protected String serializeMetadataValue(Object metadataValue) {
+        try {
+            return STANDARD_CODER.encode(metadataValue);
+        } catch (CoderException ce) {
+            String errorMessage = "error encoding metadata JSON value for database: " + metadataValue;
+            throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR, errorMessage, ce);
+        }
+    }
 }
index feae48e..92e0fae 100644 (file)
@@ -62,6 +62,8 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
 @EqualsAndHashCode(callSuper = true)
 public class JpaToscaPolicy extends JpaToscaWithTypeAndStringProperties<ToscaPolicy> {
     private static final long serialVersionUID = 3265174757061982805L;
+    private static final String METADATA_METADATA_SET_NAME_TAG = "metadataSetName";
+    private static final String METADATA_METADATA_SET_VERSION_TAG = "metadataSetVersion";
 
     // Tags for metadata
     private static final String METADATA_POLICY_ID_TAG = "policy-id";
@@ -143,6 +145,16 @@ public class JpaToscaPolicy extends JpaToscaWithTypeAndStringProperties<ToscaPol
         // Add the policy name and version fields to the metadata
         getMetadata().put(METADATA_POLICY_ID_TAG, getKey().getName());
         getMetadata().put(METADATA_POLICY_VERSION_TAG, getKey().getVersion());
+
+        // Add metadataSet name and version to the metadata
+        if (getMetadata().containsKey(METADATA_METADATA_SET_NAME_TAG)
+                && getMetadata().containsKey(METADATA_METADATA_SET_VERSION_TAG)) {
+            getMetadata().put(METADATA_METADATA_SET_NAME_TAG, getMetadata().get(METADATA_METADATA_SET_NAME_TAG)
+                    .replaceAll("^\"|\"$", ""));
+
+            getMetadata().put(METADATA_METADATA_SET_VERSION_TAG, getMetadata().get(METADATA_METADATA_SET_VERSION_TAG)
+                    .replaceAll("^\"|\"$", ""));
+        }
     }
 
     @Override