X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=models-base%2Fsrc%2Fmain%2Fjava%2Forg%2Fonap%2Fpolicy%2Fmodels%2Fbase%2FPfConceptContainer.java;h=395a42ce97c347e1078a4d9d91562b80b2bfee85;hb=938005505883cf7a636a8840e20e3dc8a0ad9176;hp=b8f2ed6cb218fc72b2da564c12828aefb1825ad7;hpb=59f4f54cdf4c1a5c155360239272da690e8c4a72;p=policy%2Fmodels.git diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfConceptContainer.java b/models-base/src/main/java/org/onap/policy/models/base/PfConceptContainer.java index b8f2ed6cb..395a42ce9 100644 --- a/models-base/src/main/java/org/onap/policy/models/base/PfConceptContainer.java +++ b/models-base/src/main/java/org/onap/policy/models/base/PfConceptContainer.java @@ -1,7 +1,8 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2019-2020 Nordix Foundation. - * Modifications Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved. + * Copyright (C) 2019-2020, 2023 Nordix Foundation. + * Modifications Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2022 Bell Canada. 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. @@ -22,6 +23,15 @@ package org.onap.policy.models.base; import com.google.re2j.Pattern; +import jakarta.persistence.CascadeType; +import jakarta.persistence.EmbeddedId; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.JoinTable; +import jakarta.persistence.ManyToMany; +import jakarta.persistence.MappedSuperclass; +import jakarta.persistence.Table; +import jakarta.ws.rs.core.Response; +import java.io.Serial; import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -33,20 +43,14 @@ import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; import java.util.function.Function; -import javax.persistence.CascadeType; -import javax.persistence.EmbeddedId; -import javax.persistence.Entity; -import javax.persistence.JoinColumn; -import javax.persistence.JoinTable; -import javax.persistence.ManyToMany; -import javax.persistence.MappedSuperclass; -import javax.persistence.Table; -import javax.ws.rs.core.Response; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NonNull; import org.apache.commons.lang3.StringUtils; -import org.onap.policy.models.base.PfValidationResult.ValidationResult; +import org.onap.policy.common.parameters.BeanValidationResult; +import org.onap.policy.common.parameters.ValidationResult; +import org.onap.policy.common.parameters.annotations.NotNull; +import org.onap.policy.models.base.validation.annotations.VerifyKey; // @formatter:off /** @@ -58,22 +62,25 @@ import org.onap.policy.models.base.PfValidationResult.ValidationResult; * Each concept entry is checked to ensure that its key and value are not null and that the key matches the key in the * map value. Each concept entry is then validated individually. * - * @param C the concept being contained + * @param the concept being contained */ //@formatter:on @MappedSuperclass -@Entity @Table(name = "PfConceptContainer") @Data @EqualsAndHashCode(callSuper = false) public class PfConceptContainer extends PfConcept implements PfConceptGetter, PfAuthorative>> { + @Serial private static final long serialVersionUID = -324211738823208318L; + private static final String VALUE_FIELD = "value"; private static final Pattern KEY_ID_PATTERN = Pattern.compile(PfKey.KEY_ID_REGEXP); @EmbeddedId + @VerifyKey + @NotNull private PfConceptKey key; @ManyToMany(cascade = CascadeType.ALL) @@ -110,9 +117,9 @@ public class PfConceptContainer ex } /** - * This Constructor creates an concept container with all of its fields defined. + * This Constructor creates a concept container with all of its fields defined. * - * @param key the concept container key + * @param key the concept container key * @param conceptMap the concepts to be stored in the concept container */ public PfConceptContainer(@NonNull final PfConceptKey key, @NonNull final Map conceptMap) { @@ -133,8 +140,8 @@ public class PfConceptContainer ex this.conceptMap = new TreeMap<>(); for (final Entry conceptMapEntry : copyConcept.conceptMap.entrySet()) { - PfConceptKey newK = new PfConceptKey(conceptMapEntry.getKey()); - C newC = PfUtils.makeCopy(conceptMapEntry.getValue()); + var newK = new PfConceptKey(conceptMapEntry.getKey()); + var newC = PfUtils.makeCopy(conceptMapEntry.getValue()); this.conceptMap.put(newK, newC); } } @@ -182,7 +189,7 @@ public class PfConceptContainer ex // Add the map entries one by one for (Entry incomingConceptEntry : incomingConceptMap.entrySet()) { - PfConceptKey conceptKey = new PfConceptKey(); + var conceptKey = new PfConceptKey(); if (KEY_ID_PATTERN.matches(incomingConceptEntry.getKey())) { conceptKey = new PfConceptKey(incomingConceptEntry.getKey()); } else { @@ -195,11 +202,11 @@ public class PfConceptContainer ex } incomingConceptEntry.getValue().setName(findConceptField(conceptKey, conceptKey.getName(), - incomingConceptEntry.getValue(), PfNameVersion::getName)); + incomingConceptEntry.getValue(), PfNameVersion::getDefinedName)); incomingConceptEntry.getValue().setVersion(findConceptField(conceptKey, conceptKey.getVersion(), - incomingConceptEntry.getValue(), PfNameVersion::getVersion)); + incomingConceptEntry.getValue(), PfNameVersion::getDefinedVersion)); - C jpaConcept = getConceptNewInstance(); + var jpaConcept = getConceptNewInstance(); // This cast allows us to call the fromAuthorative method @SuppressWarnings("unchecked") PfAuthorative authoritiveImpl = (PfAuthorative) jpaConcept; @@ -243,19 +250,9 @@ public class PfConceptContainer ex } @Override - public PfValidationResult validate(@NonNull final PfValidationResult resultIn) { - PfValidationResult result = resultIn; - - if (key.equals(PfConceptKey.getNullKey())) { - result.addValidationMessage( - new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID, "key is a null key")); - } - - result = key.validate(result); - - if (!conceptMap.isEmpty()) { - result = validateConceptMap(result); - } + public BeanValidationResult validate(@NonNull String fieldName) { + BeanValidationResult result = new PfValidator().validateTop(fieldName, this); + result.addResult(validateConceptMap()); return result; } @@ -263,36 +260,35 @@ public class PfConceptContainer ex /** * Validate the concept map of the container. * - * @param resultIn the incoming validation results so far - * @return the validation results with the results of this validation added + * @return the validation result */ - private PfValidationResult validateConceptMap(final PfValidationResult resultIn) { - PfValidationResult result = resultIn; + private ValidationResult validateConceptMap() { + var result = new BeanValidationResult("conceptMap", conceptMap); for (final Entry conceptEntry : conceptMap.entrySet()) { + BeanValidationResult result2 = null; + if (conceptEntry.getKey().equals(PfConceptKey.getNullKey())) { - result.addValidationMessage(new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID, - "key on concept entry " + conceptEntry.getKey() + " may not be the null key")); + addResult(result, "key on concept entry", conceptEntry.getKey(), IS_A_NULL_KEY); } else if (conceptEntry.getValue() == null) { - result.addValidationMessage(new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID, - "value on concept entry " + conceptEntry.getKey() + " may not be null")); + result2 = new BeanValidationResult(conceptEntry.getKey().getId(), conceptEntry.getKey()); + addResult(result2, VALUE_FIELD, conceptEntry.getValue(), IS_NULL); } else if (!conceptEntry.getKey().equals(conceptEntry.getValue().getKey())) { - result.addValidationMessage(new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID, - "key on concept entry key " + conceptEntry.getKey() + " does not equal concept value key " - + conceptEntry.getValue().getKey())); - result = conceptEntry.getValue().validate(result); + result2 = new BeanValidationResult(conceptEntry.getKey().getId(), conceptEntry.getKey()); + addResult(result2, VALUE_FIELD, conceptEntry.getValue(), "does not equal concept key"); + result2.addResult(conceptEntry.getValue().validate(VALUE_FIELD)); } else { - result = conceptEntry.getValue().validate(result); + result2 = new BeanValidationResult(conceptEntry.getKey().getId(), conceptEntry.getKey()); + result2.addResult(conceptEntry.getValue().validate(VALUE_FIELD)); } + + result.addResult(result2); } - return result; + return (result.isClean() ? null : result); } @Override - public int compareTo(final PfConcept otherConcept) { - if (otherConcept == null) { - return -1; - } + public int compareTo(@NonNull final PfConcept otherConcept) { if (this == otherConcept) { return 0; } @@ -300,24 +296,19 @@ public class PfConceptContainer ex return getClass().getName().compareTo(otherConcept.getClass().getName()); } - @SuppressWarnings("unchecked") - final PfConceptContainer other = (PfConceptContainer) otherConcept; + @SuppressWarnings("unchecked") final PfConceptContainer other = (PfConceptContainer) otherConcept; int retVal = key.compareTo(other.key); if (retVal != 0) { return retVal; } - if (!conceptMap.equals(other.conceptMap)) { - return (conceptMap.hashCode() - other.conceptMap.hashCode()); - } - - return 0; + return PfUtils.compareMaps(conceptMap, other.conceptMap); } /** * Get all the concepts that match the given name and version. * - * @param conceptKeyName the name of the concept, if null, return all names + * @param conceptKeyName the name of the concept, if null, return all names * @param conceptKeyVersion the version of the concept, if null, return all versions * @return conceptKeyVersion */ @@ -326,7 +317,7 @@ public class PfConceptContainer ex return getAll(conceptKeyName, conceptKeyVersion); } else { final Set returnSet = new TreeSet<>(); - C foundConcept = get(conceptKeyName, conceptKeyVersion); + var foundConcept = get(conceptKeyName, conceptKeyVersion); if (foundConcept != null) { returnSet.add(foundConcept); } @@ -339,30 +330,37 @@ public class PfConceptContainer ex if (conceptKey.isNullVersion()) { return get(conceptKey.getName()); } else { - return new PfConceptGetterImpl<>((NavigableMap) conceptMap).get(conceptKey); + return new PfConceptGetterImpl<>(getNavigableConceptMap()).get(conceptKey); } } @Override public C get(final String conceptKeyName) { - return new PfConceptGetterImpl<>((NavigableMap) conceptMap).get(conceptKeyName); + return new PfConceptGetterImpl<>(getNavigableConceptMap()).get(conceptKeyName); } @Override public C get(final String conceptKeyName, final String conceptKeyVersion) { - return new PfConceptGetterImpl<>((NavigableMap) conceptMap).get(conceptKeyName, - conceptKeyVersion); + return new PfConceptGetterImpl<>(getNavigableConceptMap()).get(conceptKeyName, conceptKeyVersion); } @Override public Set getAll(final String conceptKeyName) { - return new PfConceptGetterImpl<>((NavigableMap) conceptMap).getAll(conceptKeyName); + return new PfConceptGetterImpl<>(getNavigableConceptMap()).getAll(conceptKeyName); } @Override public Set getAll(final String conceptKeyName, final String conceptKeyVersion) { - return new PfConceptGetterImpl<>((NavigableMap) conceptMap).getAll(conceptKeyName, - conceptKeyVersion); + return new PfConceptGetterImpl<>(getNavigableConceptMap()).getAll(conceptKeyName, conceptKeyVersion); + } + + /** + * Get the concept map as a NavigableMap object. + * + * @return NavigableMap conceptMap instance. + */ + private NavigableMap getNavigableConceptMap() { + return new TreeMap<>(conceptMap); } /** @@ -383,7 +381,8 @@ public class PfConceptContainer ex } private String findConceptField(final PfConceptKey conceptKey, final String keyFieldValue, - final PfNameVersion concept, final Function fieldGetterFunction) { + final PfNameVersion concept, + final Function fieldGetterFunction) { String conceptField = fieldGetterFunction.apply(concept); @@ -394,4 +393,4 @@ public class PfConceptContainer ex + keyFieldValue + " does not match the value " + conceptField + " in the concept field"); } } -} +} \ No newline at end of file