diff options
author | liamfallon <liam.fallon@est.tech> | 2021-03-02 10:55:31 +0000 |
---|---|---|
committer | liamfallon <liam.fallon@est.tech> | 2021-03-03 18:09:26 +0000 |
commit | ed11e882d9128616156a2be08744e5a9bdb01111 (patch) | |
tree | eaa79473e7dea79813062dcfa31330a8722233da /models-tosca/src/main/java/org/onap | |
parent | fcbf3698fa3e3fbc6ea3364d80d4a3f3a8d37650 (diff) |
Refactor models for common type handling
Currently we have handling for "type" and "type_version" on TOSCA Policy
class. However, the concept of a "type" and "type_version" also exists
on the ToscaCapabilityAssignment, the ToscaNodeTemplate, and the
ToscaRequriement classes.
This review makes the type handling on Policy generic, thus extending it
to the other three types.
Issue-ID: POLICY-2983
Change-Id: Ia20e3a8c485f4841257075df08e0784eac415770
Signed-off-by: liamfallon <liam.fallon@est.tech>
Diffstat (limited to 'models-tosca/src/main/java/org/onap')
11 files changed, 189 insertions, 148 deletions
diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaCapabilityAssignment.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaCapabilityAssignment.java index 2d9cf9a39..11ffc044b 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaCapabilityAssignment.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaCapabilityAssignment.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2020 Nordix Foundation. + * Copyright (C) 2020-2021 Nordix Foundation. * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,16 +21,38 @@ package org.onap.policy.models.tosca.authorative.concepts; +import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import lombok.NonNull; +import lombok.ToString; @Data @EqualsAndHashCode(callSuper = true) @NoArgsConstructor -public class ToscaCapabilityAssignment extends ToscaWithObjectProperties { +@ToString(callSuper = true) +public class ToscaCapabilityAssignment extends ToscaWithTypeAndObjectProperties { private Map<String, Object> attributes; private List<Object> occurrences; + + /** + * Copy constructor. + * + * @param copyObject object to copy + */ + public ToscaCapabilityAssignment(@NonNull ToscaCapabilityAssignment copyObject) { + super(copyObject); + + if (copyObject.attributes != null) { + attributes = new LinkedHashMap<>(copyObject.attributes); + } + + if (copyObject.occurrences != null) { + occurrences = new ArrayList<>(copyObject.occurrences); + } + } } diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaNodeTemplate.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaNodeTemplate.java index c4bc84cd8..c95836de6 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaNodeTemplate.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaNodeTemplate.java @@ -31,12 +31,13 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.NonNull; +import lombok.ToString; @Data @EqualsAndHashCode(callSuper = true) @NoArgsConstructor -public class ToscaNodeTemplate extends ToscaWithObjectProperties { - private String type; +@ToString(callSuper = true) +public class ToscaNodeTemplate extends ToscaWithTypeAndObjectProperties { private List<Map<String, ToscaRequirement>> requirements; private Map<String, ToscaCapabilityAssignment> capabilities; @@ -48,8 +49,6 @@ public class ToscaNodeTemplate extends ToscaWithObjectProperties { public ToscaNodeTemplate(@NonNull ToscaNodeTemplate copyObject) { super(copyObject); - this.type = copyObject.type; - this.requirements = (copyObject.requirements != null ? new ArrayList<>(copyObject.requirements) : null); this.capabilities = (copyObject.capabilities != null ? new LinkedHashMap<>(copyObject.capabilities) : null); } diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaPolicy.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaPolicy.java index b3a38050a..00d783d2d 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaPolicy.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaPolicy.java @@ -23,8 +23,6 @@ package org.onap.policy.models.tosca.authorative.concepts; -import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; @@ -40,40 +38,13 @@ import lombok.ToString; @EqualsAndHashCode(callSuper = true) @NoArgsConstructor @ToString(callSuper = true) -public class ToscaPolicy extends ToscaWithObjectProperties { - private String type; - - @ApiModelProperty(name = "type_version") - @SerializedName("type_version") - private String typeVersion; - +public class ToscaPolicy extends ToscaWithTypeAndObjectProperties { /** * Copy constructor. * - * @param copyObject the obejct to copy from. + * @param copyObject object to copy */ public ToscaPolicy(@NonNull ToscaPolicy copyObject) { super(copyObject); - - this.type = copyObject.type; - this.typeVersion = copyObject.typeVersion; - } - - /** - * Gets the identifier for this policy. - * - * @return this policy's identifier - */ - public ToscaConceptIdentifier getIdentifier() { - return new ToscaConceptIdentifier(getName(), getVersion()); - } - - /** - * Gets the type identifier for this policy. - * - * @return this policy's type identifier - */ - public ToscaConceptIdentifier getTypeIdentifier() { - return new ToscaConceptIdentifier(getType(), getTypeVersion()); } } diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaRequirement.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaRequirement.java index 166b81174..d2c3b83a3 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaRequirement.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaRequirement.java @@ -1,6 +1,6 @@ /* * ============LICENSE_START======================================================= - * Copyright (C) 2020 Nordix Foundation. + * Copyright (C) 2020-2021 Nordix Foundation. * Modifications Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,15 +21,38 @@ package org.onap.policy.models.tosca.authorative.concepts; +import java.util.ArrayList; import java.util.List; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import lombok.NonNull; +import lombok.ToString; @Data @EqualsAndHashCode(callSuper = true) -public class ToscaRequirement extends ToscaWithObjectProperties { +@NoArgsConstructor +@ToString(callSuper = true) +public class ToscaRequirement extends ToscaWithTypeAndObjectProperties { private String capability; private String node; private String relationship; private List<Object> occurrences; + + /** + * Copy constructor. + * + * @param copyObject object to copy + */ + public ToscaRequirement(@NonNull ToscaRequirement copyObject) { + super(copyObject); + + this.capability = copyObject.capability; + this.node = copyObject.node; + this.relationship = copyObject.relationship; + + if (copyObject.occurrences != null) { + occurrences = new ArrayList<>(copyObject.occurrences); + } + } } diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaWithObjectProperties.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaWithTypeAndObjectProperties.java index f6cf24f61..0bcb1cf54 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaWithObjectProperties.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/authorative/concepts/ToscaWithTypeAndObjectProperties.java @@ -1,6 +1,7 @@ /* * ============LICENSE_START======================================================= * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2021 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,6 +21,8 @@ package org.onap.policy.models.tosca.authorative.concepts; +import com.google.gson.annotations.SerializedName; +import io.swagger.annotations.ApiModelProperty; import java.util.LinkedHashMap; import java.util.Map; import lombok.Data; @@ -36,19 +39,46 @@ import lombok.ToString; @EqualsAndHashCode(callSuper = true) @NoArgsConstructor @ToString -public class ToscaWithObjectProperties extends ToscaEntity { +public class ToscaWithTypeAndObjectProperties extends ToscaEntity { + private String type; + + @ApiModelProperty(name = "type_version") + @SerializedName("type_version") + private String typeVersion; + private Map<String, Object> properties; /** - * Cop[y constructor. + * Copy constructor. * * @param copyObject object to copy */ - public ToscaWithObjectProperties(@NonNull ToscaWithObjectProperties copyObject) { + public ToscaWithTypeAndObjectProperties(@NonNull ToscaWithTypeAndObjectProperties copyObject) { super(copyObject); + this.type = copyObject.type; + this.typeVersion = copyObject.typeVersion; + if (copyObject.properties != null) { properties = new LinkedHashMap<>(copyObject.properties); } } + + /** + * Gets the identifier for this policy. + * + * @return this policy's identifier + */ + public ToscaConceptIdentifier getIdentifier() { + return new ToscaConceptIdentifier(getName(), getVersion()); + } + + /** + * Gets the type identifier for this policy. + * + * @return this policy's type identifier + */ + public ToscaConceptIdentifier getTypeIdentifier() { + return new ToscaConceptIdentifier(getType(), getTypeVersion()); + } } diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaCapabilityAssignment.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaCapabilityAssignment.java index bb5cf5a73..76508dabe 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaCapabilityAssignment.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaCapabilityAssignment.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2020 Nordix Foundation. + * Copyright (C) 2020-2021 Nordix Foundation. * Modifications Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -50,7 +50,7 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaCapabilityAssignme @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @Data @EqualsAndHashCode(callSuper = false) -public class JpaToscaCapabilityAssignment extends JpaToscaWithStringProperties<ToscaCapabilityAssignment> { +public class JpaToscaCapabilityAssignment extends JpaToscaWithTypeAndStringProperties<ToscaCapabilityAssignment> { private static final long serialVersionUID = 1675770231921107988L; diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaNodeTemplate.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaNodeTemplate.java index 9507a9d2f..f6cfc1258 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaNodeTemplate.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaNodeTemplate.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2020 Nordix Foundation. + * Copyright (C) 2020-2021 Nordix Foundation. * Modifications Copyright (C) 2020-2021 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,7 +26,6 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.persistence.CascadeType; -import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.Inheritance; @@ -39,8 +38,6 @@ 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.parameters.annotations.Valid; import org.onap.policy.common.utils.coder.CoderException; import org.onap.policy.common.utils.coder.StandardCoder; @@ -59,16 +56,11 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaNodeTemplate; @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @Data @EqualsAndHashCode(callSuper = false) -public class JpaToscaNodeTemplate extends JpaToscaWithStringProperties<ToscaNodeTemplate> { +public class JpaToscaNodeTemplate extends JpaToscaWithTypeAndStringProperties<ToscaNodeTemplate> { private static final long serialVersionUID = 1675770231921107988L; private static final StandardCoder STANDARD_CODER = new StandardCoder(); - @Column - @NotNull - @NotBlank - private String type; - // formatter:off @OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true) @JoinColumn(name = "requirementsName", referencedColumnName = "name") @@ -106,7 +98,7 @@ public class JpaToscaNodeTemplate extends JpaToscaWithStringProperties<ToscaNode */ public JpaToscaNodeTemplate(final JpaToscaNodeTemplate copyConcept) { super(copyConcept); - this.type = copyConcept.type; + this.requirements = (copyConcept.requirements != null ? new JpaToscaRequirements(copyConcept.requirements) : null); this.capabilities = @@ -121,7 +113,6 @@ public class JpaToscaNodeTemplate extends JpaToscaWithStringProperties<ToscaNode */ public JpaToscaNodeTemplate(@NonNull final PfConceptKey key, final String type) { super(key); - this.type = type; } /** @@ -139,8 +130,6 @@ public class JpaToscaNodeTemplate extends JpaToscaWithStringProperties<ToscaNode super.setToscaEntity(toscaNodeTemplate); super.toAuthorative(); - toscaNodeTemplate.setType(type); - if (requirements != null) { toscaNodeTemplate.setRequirements(requirements.toAuthorative()); } @@ -160,8 +149,6 @@ public class JpaToscaNodeTemplate extends JpaToscaWithStringProperties<ToscaNode public void fromAuthorative(ToscaNodeTemplate toscaNodeTemplate) { super.fromAuthorative(toscaNodeTemplate); - type = toscaNodeTemplate.getType(); - if (toscaNodeTemplate.getRequirements() != null) { requirements = new JpaToscaRequirements(); requirements.fromAuthorative(toscaNodeTemplate.getRequirements()); @@ -212,8 +199,6 @@ public class JpaToscaNodeTemplate extends JpaToscaWithStringProperties<ToscaNode public void clean() { super.clean(); - type = type.trim(); - if (requirements != null) { requirements.clean(); } @@ -236,11 +221,6 @@ public class JpaToscaNodeTemplate extends JpaToscaWithStringProperties<ToscaNode final JpaToscaNodeTemplate other = (JpaToscaNodeTemplate) otherConcept; - result = type.compareTo(other.type); - if (result != 0) { - return result; - } - result = ObjectUtils.compare(requirements, other.requirements); if (result != 0) { return result; diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicy.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicy.java index dae3527ee..b33205c43 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicy.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaPolicy.java @@ -3,7 +3,7 @@ * ONAP Policy Model * ================================================================================ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright (C) 2019-2020 Nordix Foundation. + * Modifications Copyright (C) 2019-2021 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,8 +25,6 @@ package org.onap.policy.models.tosca.simple.concepts; import java.util.LinkedHashMap; import java.util.List; -import javax.persistence.AttributeOverride; -import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Entity; import javax.persistence.Inheritance; @@ -46,7 +44,6 @@ 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.ToscaPolicy; /** @@ -60,7 +57,7 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy; @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @Data @EqualsAndHashCode(callSuper = true) -public class JpaToscaPolicy extends JpaToscaWithStringProperties<ToscaPolicy> { +public class JpaToscaPolicy extends JpaToscaWithTypeAndStringProperties<ToscaPolicy> { private static final long serialVersionUID = 3265174757061982805L; // Tags for metadata @@ -69,23 +66,14 @@ public class JpaToscaPolicy extends JpaToscaWithStringProperties<ToscaPolicy> { private static final StandardCoder STANDARD_CODER = new StandardCoder(); - // @formatter:off - @Column - @AttributeOverride(name = "name", column = @Column(name = "type_name")) - @AttributeOverride(name = "version", column = @Column(name = "type_version")) - @VerifyKey - @NotNull - private PfConceptKey type; - @ElementCollection private List<@NotNull @Valid PfConceptKey> targets; - // @formatter:on /** * The Default Constructor creates a {@link JpaToscaPolicy} object with a null key. */ public JpaToscaPolicy() { - this(new PfConceptKey()); + super(); } /** @@ -94,7 +82,7 @@ public class JpaToscaPolicy extends JpaToscaWithStringProperties<ToscaPolicy> { * @param key the key */ public JpaToscaPolicy(@NonNull final PfConceptKey key) { - this(key, new PfConceptKey()); + super(key, new PfConceptKey()); } /** @@ -104,8 +92,7 @@ public class JpaToscaPolicy extends JpaToscaWithStringProperties<ToscaPolicy> { * @param type the type of the policy */ public JpaToscaPolicy(@NonNull final PfConceptKey key, @NonNull final PfConceptKey type) { - super(key); - this.type = type; + super(key, type); } /** @@ -115,7 +102,6 @@ public class JpaToscaPolicy extends JpaToscaWithStringProperties<ToscaPolicy> { */ public JpaToscaPolicy(@NonNull final JpaToscaPolicy copyConcept) { super(copyConcept); - this.type = new PfConceptKey(copyConcept.type); this.targets = PfUtils.mapList(copyConcept.targets, PfConceptKey::new); } @@ -126,7 +112,6 @@ public class JpaToscaPolicy extends JpaToscaWithStringProperties<ToscaPolicy> { */ public JpaToscaPolicy(final ToscaPolicy authorativeConcept) { super(new PfConceptKey()); - type = new PfConceptKey(); this.fromAuthorative(authorativeConcept); } @@ -136,14 +121,6 @@ public class JpaToscaPolicy extends JpaToscaWithStringProperties<ToscaPolicy> { super.setToscaEntity(toscaPolicy); super.toAuthorative(); - toscaPolicy.setType(type.getName()); - - if (!PfKey.NULL_KEY_VERSION.equals(type.getVersion())) { - toscaPolicy.setTypeVersion(type.getVersion()); - } else { - toscaPolicy.setTypeVersion(null); - } - return toscaPolicy; } @@ -151,22 +128,6 @@ public class JpaToscaPolicy extends JpaToscaWithStringProperties<ToscaPolicy> { public void fromAuthorative(@NonNull final ToscaPolicy toscaPolicy) { super.fromAuthorative(toscaPolicy); - if (toscaPolicy.getType() != null) { - type.setName(toscaPolicy.getType()); - } else { - throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, - "PolicyType type not specified, the type of the PolicyType for this policy must be specified in " - + "the type field"); - } - - if (toscaPolicy.getTypeVersion() != null) { - type.setVersion(toscaPolicy.getTypeVersion()); - } else { - throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, - "PolicyType version not specified, the version of the PolicyType for this policy must be specified" - + " in the type_version field"); - } - // Add the property metadata if it doesn't exist already if (toscaPolicy.getMetadata() == null) { setMetadata(new LinkedHashMap<>()); @@ -201,8 +162,6 @@ public class JpaToscaPolicy extends JpaToscaWithStringProperties<ToscaPolicy> { public List<PfKey> getKeys() { final List<PfKey> keyList = super.getKeys(); - keyList.addAll(type.getKeys()); - if (targets != null) { keyList.addAll(targets); } @@ -214,8 +173,6 @@ public class JpaToscaPolicy extends JpaToscaWithStringProperties<ToscaPolicy> { public void clean() { super.clean(); - type.clean(); - if (targets != null) { for (PfConceptKey target : targets) { target.clean(); @@ -245,11 +202,6 @@ public class JpaToscaPolicy extends JpaToscaWithStringProperties<ToscaPolicy> { final JpaToscaPolicy other = (JpaToscaPolicy) otherConcept; - result = type.compareTo(other.type); - if (result != 0) { - return result; - } - return PfUtils.compareCollections(targets, other.targets); } } diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaRequirement.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaRequirement.java index eeae03dd7..20b6aff96 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaRequirement.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaRequirement.java @@ -3,7 +3,7 @@ * ONAP Requirement Model * ================================================================================ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved. - * Modifications Copyright (C) 2019-2020 Nordix Foundation. + * Modifications Copyright (C) 2019-2021 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -53,7 +53,7 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaRequirement; @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) @Data @EqualsAndHashCode(callSuper = true) -public class JpaToscaRequirement extends JpaToscaWithStringProperties<ToscaRequirement> { +public class JpaToscaRequirement extends JpaToscaWithTypeAndStringProperties<ToscaRequirement> { private static final long serialVersionUID = 2785481541573683089L; private static final String AUTHORATIVE_UNBOUNDED_LITERAL = "UNBOUNDED"; diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaWithStringProperties.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaWithTypeAndStringProperties.java index afe4a84d1..1ba63cad5 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaWithStringProperties.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/simple/concepts/JpaToscaWithTypeAndStringProperties.java @@ -1,6 +1,7 @@ /*- * ============LICENSE_START======================================================= * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2021 Nordix Foundation. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,10 +22,14 @@ package org.onap.policy.models.tosca.simple.concepts; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; +import javax.persistence.AttributeOverride; +import javax.persistence.Column; import javax.persistence.ElementCollection; import javax.persistence.Lob; import javax.persistence.MappedSuperclass; +import javax.ws.rs.core.Response; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NonNull; @@ -33,8 +38,11 @@ import org.onap.policy.common.parameters.annotations.NotNull; 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.tosca.authorative.concepts.ToscaWithObjectProperties; +import org.onap.policy.models.base.validation.annotations.VerifyKey; +import org.onap.policy.models.tosca.authorative.concepts.ToscaWithTypeAndObjectProperties; /** * Class to represent JPA TOSCA classes containing property maps whose values are Strings. @@ -42,31 +50,47 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaWithObjectProperti @MappedSuperclass @Data @EqualsAndHashCode(callSuper = true) -public abstract class JpaToscaWithStringProperties<T extends ToscaWithObjectProperties> extends JpaToscaEntityType<T> - implements PfAuthorative<T> { +public abstract class JpaToscaWithTypeAndStringProperties<T extends ToscaWithTypeAndObjectProperties> + extends JpaToscaEntityType<T> implements PfAuthorative<T> { private static final long serialVersionUID = 2785481541573683089L; + @Column + @AttributeOverride(name = "name", column = @Column(name = "type_name")) + @AttributeOverride(name = "version", column = @Column(name = "type_version")) + @VerifyKey + @NotNull + private PfConceptKey type; + @ElementCollection @Lob private Map<@NotNull String, @NotNull String> properties; /** - * The Default Constructor creates a {@link JpaToscaWithStringProperties} object with - * a null key. + * The Default Constructor creates a {@link JpaToscaWithTypeAndStringProperties} object with a null key. */ - protected JpaToscaWithStringProperties() { + protected JpaToscaWithTypeAndStringProperties() { this(new PfConceptKey()); } /** - * The Key Constructor creates a {@link JpaToscaWithStringProperties} object with the - * given concept key. + * The Key Constructor creates a {@link JpaToscaWithTypeAndStringProperties} object with the given concept key. + * + * @param key the key + */ + protected JpaToscaWithTypeAndStringProperties(@NonNull final PfConceptKey key) { + this(key, new PfConceptKey()); + } + + /** + * The full Constructor creates a {@link JpaToscaWithTypeAndStringProperties} object with all mandatory fields. * * @param key the key + * @param type the type of the policy */ - protected JpaToscaWithStringProperties(@NonNull final PfConceptKey key) { + protected JpaToscaWithTypeAndStringProperties(@NonNull final PfConceptKey key, @NonNull final PfConceptKey type) { super(key); + this.type = type; } /** @@ -74,8 +98,9 @@ public abstract class JpaToscaWithStringProperties<T extends ToscaWithObjectProp * * @param copyConcept the concept to copy from */ - protected JpaToscaWithStringProperties(@NonNull final JpaToscaWithStringProperties<T> copyConcept) { + protected JpaToscaWithTypeAndStringProperties(@NonNull final JpaToscaWithTypeAndStringProperties<T> copyConcept) { super(copyConcept); + this.type = new PfConceptKey(copyConcept.type); this.properties = (copyConcept.properties != null ? new LinkedHashMap<>(copyConcept.properties) : null); } @@ -84,8 +109,9 @@ public abstract class JpaToscaWithStringProperties<T extends ToscaWithObjectProp * * @param authorativeConcept the authorative concept to copy from */ - protected JpaToscaWithStringProperties(final T authorativeConcept) { + protected JpaToscaWithTypeAndStringProperties(final T authorativeConcept) { super(new PfConceptKey()); + type = new PfConceptKey(); this.fromAuthorative(authorativeConcept); } @@ -93,6 +119,14 @@ public abstract class JpaToscaWithStringProperties<T extends ToscaWithObjectProp public T toAuthorative() { T tosca = super.toAuthorative(); + tosca.setType(type.getName()); + + if (!PfKey.NULL_KEY_VERSION.equals(type.getVersion())) { + tosca.setTypeVersion(type.getVersion()); + } else { + tosca.setTypeVersion(null); + } + tosca.setProperties(PfUtils.mapMap(properties, this::deserializePropertyValue)); return tosca; @@ -102,6 +136,21 @@ public abstract class JpaToscaWithStringProperties<T extends ToscaWithObjectProp public void fromAuthorative(@NonNull final T authorativeConcept) { super.fromAuthorative(authorativeConcept); + if (authorativeConcept.getType() != null) { + type.setName(authorativeConcept.getType()); + } else { + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, + "Type not specified, the type of this TOSCA entity must be specified in the type field"); + } + + if (authorativeConcept.getTypeVersion() != null) { + type.setVersion(authorativeConcept.getTypeVersion()); + } else { + throw new PfModelRuntimeException(Response.Status.BAD_REQUEST, + "Version not specified, the version of this TOSCA entity must be specified" + + " in the type_version field"); + } + properties = PfUtils.mapMap(authorativeConcept.getProperties(), this::serializePropertyValue); } @@ -121,11 +170,21 @@ public abstract class JpaToscaWithStringProperties<T extends ToscaWithObjectProp */ protected abstract String serializePropertyValue(Object propValue); + @Override + public List<PfKey> getKeys() { + final List<PfKey> keyList = super.getKeys(); + + keyList.addAll(type.getKeys()); + + return keyList; + } @Override public void clean() { super.clean(); + type.clean(); + properties = PfUtils.mapMap(properties, String::trim); } @@ -155,7 +214,12 @@ public abstract class JpaToscaWithStringProperties<T extends ToscaWithObjectProp } @SuppressWarnings("unchecked") - final JpaToscaWithStringProperties<T> other = (JpaToscaWithStringProperties<T>) otherConcept; + final JpaToscaWithTypeAndStringProperties<T> other = (JpaToscaWithTypeAndStringProperties<T>) otherConcept; + + result = type.compareTo(other.type); + if (result != 0) { + return result; + } return PfUtils.compareMaps(properties, other.properties); } diff --git a/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaUtils.java b/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaUtils.java index b806e4152..5dda6ecfc 100644 --- a/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaUtils.java +++ b/models-tosca/src/main/java/org/onap/policy/models/tosca/utils/ToscaUtils.java @@ -1,6 +1,6 @@ /*- * ============LICENSE_START======================================================= - * Copyright (C) 2019-2020 Nordix Foundation. + * Copyright (C) 2019-2021 Nordix Foundation. * Modifications Copyright (C) 2020 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); @@ -145,7 +145,7 @@ public final class ToscaUtils { * @param serviceTemplate the service template containing policy types to be checked */ public static void assertExist(final JpaToscaServiceTemplate serviceTemplate, - final Function<JpaToscaServiceTemplate, String> checkerFunction) { + final Function<JpaToscaServiceTemplate, String> checkerFunction) { String message = checkerFunction.apply(serviceTemplate); if (message != null) { throw new PfModelRuntimeException(Response.Status.NOT_FOUND, message); @@ -158,7 +158,7 @@ public final class ToscaUtils { * @param serviceTemplate the service template containing policy types to be checked */ public static boolean doExist(final JpaToscaServiceTemplate serviceTemplate, - final Function<JpaToscaServiceTemplate, String> checkerFunction) { + final Function<JpaToscaServiceTemplate, String> checkerFunction) { return checkerFunction.apply(serviceTemplate) == null; } @@ -220,8 +220,8 @@ public final class ToscaUtils { * @return the entity set containing the ancestors of the incoming entity */ public static Collection<JpaToscaEntityType<ToscaEntity>> getEntityTypeAncestors( - @NonNull PfConceptContainer<? extends PfConcept, ? extends PfNameVersion> entityTypes, - @NonNull JpaToscaEntityType<?> entityType, @NonNull final BeanValidationResult result) { + @NonNull PfConceptContainer<? extends PfConcept, ? extends PfNameVersion> entityTypes, + @NonNull JpaToscaEntityType<?> entityType, @NonNull final BeanValidationResult result) { PfConceptKey parentEntityTypeKey = entityType.getDerivedFrom(); if (parentEntityTypeKey == null || parentEntityTypeKey.getName().endsWith(ROOT_KEY_NAME_SUFFIX)) { @@ -230,17 +230,17 @@ public final class ToscaUtils { if (entityType.getKey().equals(parentEntityTypeKey)) { result.addResult(new ObjectValidationResult("entity type", entityType.getKey().getId(), - ValidationStatus.INVALID, "ancestor of itself")); + ValidationStatus.INVALID, "ancestor of itself")); throw new PfModelRuntimeException(Response.Status.CONFLICT, result.getResult()); } @SuppressWarnings("unchecked") Set<JpaToscaEntityType<ToscaEntity>> ancestorEntitySet = (Set<JpaToscaEntityType<ToscaEntity>>) entityTypes - .getAll(parentEntityTypeKey.getName(), parentEntityTypeKey.getVersion()); + .getAll(parentEntityTypeKey.getName(), parentEntityTypeKey.getVersion()); Set<JpaToscaEntityType<ToscaEntity>> ancestorEntitySetToReturn = new HashSet<>(ancestorEntitySet); if (ancestorEntitySet.isEmpty()) { - result.addResult(new ObjectValidationResult("parent", parentEntityTypeKey.getId(), - ValidationStatus.INVALID, Validated.NOT_FOUND)); + result.addResult(new ObjectValidationResult("parent", parentEntityTypeKey.getId(), ValidationStatus.INVALID, + Validated.NOT_FOUND)); } else { for (JpaToscaEntityType<?> filteredEntityType : ancestorEntitySet) { ancestorEntitySetToReturn.addAll(getEntityTypeAncestors(entityTypes, filteredEntityType, result)); @@ -257,18 +257,18 @@ public final class ToscaUtils { * @param entityVersion the version of the entity */ public static void getEntityTree( - @NonNull final PfConceptContainer<? extends PfConcept, ? extends PfNameVersion> entityTypes, - final String entityName, final String entityVersion) { + @NonNull final PfConceptContainer<? extends PfConcept, ? extends PfNameVersion> entityTypes, + final String entityName, final String entityVersion) { BeanValidationResult result = new BeanValidationResult("entity", entityName); @SuppressWarnings("unchecked") Set<JpaToscaEntityType<?>> filteredEntitySet = - (Set<JpaToscaEntityType<?>>) entityTypes.getAllNamesAndVersions(entityName, entityVersion); + (Set<JpaToscaEntityType<?>>) entityTypes.getAllNamesAndVersions(entityName, entityVersion); Set<JpaToscaEntityType<?>> filteredEntitySetToReturn = new HashSet<>(filteredEntitySet); for (JpaToscaEntityType<?> filteredEntityType : filteredEntitySet) { filteredEntitySetToReturn - .addAll(ToscaUtils.getEntityTypeAncestors(entityTypes, filteredEntityType, result)); + .addAll(ToscaUtils.getEntityTypeAncestors(entityTypes, filteredEntityType, result)); } if (!result.isValid()) { @@ -276,6 +276,6 @@ public final class ToscaUtils { } entityTypes.getConceptMap().entrySet() - .removeIf(entityEntry -> !filteredEntitySetToReturn.contains(entityEntry.getValue())); + .removeIf(entityEntry -> !filteredEntitySetToReturn.contains(entityEntry.getValue())); } } |