summaryrefslogtreecommitdiffstats
path: root/models-base/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'models-base/src/main')
-rw-r--r--models-base/src/main/java/org/onap/policy/models/base/PfConcept.java28
-rw-r--r--models-base/src/main/java/org/onap/policy/models/base/PfConceptContainer.java268
-rw-r--r--models-base/src/main/java/org/onap/policy/models/base/PfConceptKey.java20
-rw-r--r--models-base/src/main/java/org/onap/policy/models/base/PfKey.java13
-rw-r--r--models-base/src/main/java/org/onap/policy/models/base/PfKeyUse.java84
-rw-r--r--models-base/src/main/java/org/onap/policy/models/base/PfModel.java73
-rw-r--r--models-base/src/main/java/org/onap/policy/models/base/PfModelException.java38
-rw-r--r--models-base/src/main/java/org/onap/policy/models/base/PfModelRuntimeException.java38
-rw-r--r--models-base/src/main/java/org/onap/policy/models/base/PfModelService.java36
-rw-r--r--models-base/src/main/java/org/onap/policy/models/base/PfReferenceKey.java5
-rw-r--r--models-base/src/main/java/org/onap/policy/models/base/PfUtils.java59
-rw-r--r--models-base/src/main/java/org/onap/policy/models/base/PfValidationResult.java23
12 files changed, 506 insertions, 179 deletions
diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfConcept.java b/models-base/src/main/java/org/onap/policy/models/base/PfConcept.java
index b74b0374d..c41b0de56 100644
--- a/models-base/src/main/java/org/onap/policy/models/base/PfConcept.java
+++ b/models-base/src/main/java/org/onap/policy/models/base/PfConcept.java
@@ -23,7 +23,7 @@ package org.onap.policy.models.base;
import java.io.Serializable;
import java.util.List;
-import org.onap.policy.common.utils.validation.Assertions;
+import lombok.NonNull;
/**
* This class is the base class for all Policy Framework concept classes. It enforces implementation
@@ -43,8 +43,7 @@ public abstract class PfConcept implements Serializable, Comparable<PfConcept> {
*
* @param copyConcept the concept to copy from
*/
- public PfConcept(final PfConcept copyConcept) {
- Assertions.argumentNotNull(copyConcept, "copy concept may not be null");
+ public PfConcept(@NonNull final PfConcept copyConcept) {
copyConcept.copyTo(this);
}
@@ -70,7 +69,7 @@ public abstract class PfConcept implements Serializable, Comparable<PfConcept> {
* @return the validation result that was passed in in the @{link result} field with the result
* of this validation added
*/
- public abstract PfValidationResult validate(PfValidationResult result);
+ public abstract PfValidationResult validate(@NonNull final PfValidationResult result);
/**
* Clean this concept, tidy up any superfluous information such as leading and trailing white
@@ -78,27 +77,12 @@ public abstract class PfConcept implements Serializable, Comparable<PfConcept> {
*/
public abstract void clean();
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#equals(java.lang.Object)
- */
@Override
public abstract boolean equals(Object otherObject);
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#toString()
- */
@Override
public abstract String toString();
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Object#hashCode()
- */
@Override
public abstract int hashCode();
@@ -109,7 +93,7 @@ public abstract class PfConcept implements Serializable, Comparable<PfConcept> {
* @param target the target object to which this object is copied
* @return the copied object
*/
- public abstract PfConcept copyTo(PfConcept target);
+ public abstract PfConcept copyTo(@NonNull PfConcept target);
/**
* Gets the ID string of this concept.
@@ -126,9 +110,7 @@ public abstract class PfConcept implements Serializable, Comparable<PfConcept> {
* @param id the key ID to match against
* @return true, if this key matches the ID
*/
- public final boolean matchesId(final String id) {
- Assertions.argumentNotNull(id, "id may not be null");
-
+ public final boolean matchesId(@NonNull final String id) {
// Check the ID
return getId().equals(id);
}
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
new file mode 100644
index 000000000..46094610a
--- /dev/null
+++ b/models-base/src/main/java/org/onap/policy/models/base/PfConceptContainer.java
@@ -0,0 +1,268 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.base;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.NavigableMap;
+import java.util.Set;
+import java.util.TreeMap;
+
+import javax.persistence.CascadeType;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.ManyToMany;
+import javax.persistence.Table;
+import javax.ws.rs.core.Response;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NonNull;
+
+import org.onap.policy.common.utils.validation.Assertions;
+import org.onap.policy.models.base.PfValidationResult.ValidationResult;
+
+/**
+ * This class is a concept container and holds a map of concepts. The {@link PfConceptContainer}
+ * class implements the helper methods of the {@link PfConceptGetter} interface to allow
+ * {@link PfConceptContainer} instances to be retrieved by calling methods directly on this class
+ * without referencing the contained map.
+ *
+ * <p>Validation checks that the container key is not null. An error is issued if no concepts are
+ * defined in the container. 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
+ */
+@Entity
+@Table(name = "PfConceptContainer")
+@Data
+@EqualsAndHashCode(callSuper = false)
+
+public class PfConceptContainer<C extends PfConcept> extends PfConcept implements PfConceptGetter<C> {
+ private static final long serialVersionUID = -324211738823208318L;
+
+ @EmbeddedId
+ private PfConceptKey key;
+
+ @ManyToMany(cascade = CascadeType.ALL)
+ private Map<PfConceptKey, C> conceptMap;
+
+ /**
+ * The Default Constructor creates a {@link PfConceptContainer} object with a null artifact key
+ * and creates an empty concept map.
+ */
+ public PfConceptContainer() {
+ this(new PfConceptKey());
+ }
+
+ /**
+ * The Key Constructor creates a {@link PfConceptContainer} object with the given artifact key
+ * and creates an empty concept map.
+ *
+ * @param key the concept key
+ */
+ public PfConceptContainer(@NonNull final PfConceptKey key) {
+ this(key, new TreeMap<PfConceptKey, C>());
+ }
+
+ /**
+ * This Constructor creates an concept container with all of its fields defined.
+ *
+ * @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<PfConceptKey, C> conceptMap) {
+ super();
+
+ this.key = key;
+ this.conceptMap = new TreeMap<>(conceptMap);
+ }
+
+ /**
+ * Copy constructor.
+ *
+ * @param copyConcept the concept to copy from
+ */
+ public PfConceptContainer(@NonNull final PfConceptContainer<C> copyConcept) {
+ super(copyConcept);
+ }
+
+ @Override
+ public List<PfKey> getKeys() {
+ final List<PfKey> keyList = key.getKeys();
+
+ for (final C concept : conceptMap.values()) {
+ keyList.addAll(concept.getKeys());
+ }
+
+ return keyList;
+ }
+
+ @Override
+ public void clean() {
+ key.clean();
+ for (final Entry<PfConceptKey, C> conceptEntry : conceptMap.entrySet()) {
+ conceptEntry.getKey().clean();
+ conceptEntry.getValue().clean();
+ }
+ }
+
+ @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.addValidationMessage(new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID,
+ "conceptMap may not be empty"));
+ } else {
+ result = validateConceptMap(result);
+ }
+
+ return result;
+ }
+
+ /**
+ * 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
+ */
+ private PfValidationResult validateConceptMap(final PfValidationResult resultIn) {
+ PfValidationResult result = resultIn;
+
+ for (final Entry<PfConceptKey, C> conceptEntry : conceptMap.entrySet()) {
+ 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"));
+ } else if (conceptEntry.getValue() == null) {
+ result.addValidationMessage(new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID,
+ "value on concept entry " + conceptEntry.getKey() + " may not be 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);
+ } else {
+ result = conceptEntry.getValue().validate(result);
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public int compareTo(final PfConcept otherConcept) {
+ if (otherConcept == null) {
+ return -1;
+ }
+ if (this == otherConcept) {
+ return 0;
+ }
+ if (getClass() != otherConcept.getClass()) {
+ return this.hashCode() - otherConcept.hashCode();
+ }
+
+ @SuppressWarnings("unchecked")
+ final PfConceptContainer<C> other = (PfConceptContainer<C>) 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;
+ }
+
+ @Override
+ public PfConcept copyTo(@NonNull final PfConcept target) {
+ Assertions.instanceOf(target, PfConceptContainer.class);
+
+ @SuppressWarnings("unchecked")
+ final PfConceptContainer<C> copy = (PfConceptContainer<C>) target;
+ copy.setKey(new PfConceptKey(key));
+ final Map<PfConceptKey, C> newConceptMap = new TreeMap<>();
+ for (final Entry<PfConceptKey, C> conceptMapEntry : conceptMap.entrySet()) {
+ newConceptMap.put(new PfConceptKey(conceptMapEntry.getKey()),
+ new ConceptCloner().cloneConcept(conceptMapEntry.getValue()));
+ }
+ copy.setConceptMap(newConceptMap);
+
+ return copy;
+ }
+
+ @Override
+ public C get(final PfConceptKey conceptKey) {
+ return new PfConceptGetterImpl<>((NavigableMap<PfConceptKey, C>) conceptMap).get(conceptKey);
+ }
+
+ @Override
+ public C get(final String conceptKeyName) {
+ return new PfConceptGetterImpl<>((NavigableMap<PfConceptKey, C>) conceptMap).get(conceptKeyName);
+ }
+
+ @Override
+ public C get(final String conceptKeyName, final String conceptKeyVersion) {
+ return new PfConceptGetterImpl<>((NavigableMap<PfConceptKey, C>) conceptMap).get(conceptKeyName,
+ conceptKeyVersion);
+ }
+
+ @Override
+ public Set<C> getAll(final String conceptKeyName) {
+ return new PfConceptGetterImpl<>((NavigableMap<PfConceptKey, C>) conceptMap).getAll(conceptKeyName);
+ }
+
+ @Override
+ public Set<C> getAll(final String conceptKeyName, final String conceptKeyVersion) {
+ return new PfConceptGetterImpl<>((NavigableMap<PfConceptKey, C>) conceptMap).getAll(conceptKeyName,
+ conceptKeyVersion);
+ }
+
+ /**
+ * Private inner class that returns a clone of a concept by calling the copy constructor on the
+ * original class.
+ */
+ private class ConceptCloner {
+ @SuppressWarnings("unchecked")
+ public C cloneConcept(final C originalConcept) {
+ try {
+ C clonedConcept = (C) originalConcept.getClass().newInstance();
+ originalConcept.copyTo(clonedConcept);
+ return clonedConcept;
+ } catch (Exception ex) {
+ throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR,
+ "Failed to create a clone of class \"" + originalConcept.getClass().getCanonicalName() + "\"",
+ ex);
+ }
+ }
+ }
+}
diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfConceptKey.java b/models-base/src/main/java/org/onap/policy/models/base/PfConceptKey.java
index efcbe392c..695ca4712 100644
--- a/models-base/src/main/java/org/onap/policy/models/base/PfConceptKey.java
+++ b/models-base/src/main/java/org/onap/policy/models/base/PfConceptKey.java
@@ -28,6 +28,7 @@ import javax.persistence.Embeddable;
import lombok.Data;
import lombok.EqualsAndHashCode;
+import lombok.NonNull;
import org.onap.policy.common.utils.validation.Assertions;
import org.onap.policy.models.base.PfValidationResult.ValidationResult;
@@ -67,7 +68,7 @@ public class PfConceptKey extends PfKey {
*
* @param copyConcept the concept to copy from
*/
- public PfConceptKey(final PfConceptKey copyConcept) {
+ public PfConceptKey(@NonNull final PfConceptKey copyConcept) {
super(copyConcept);
}
@@ -77,7 +78,7 @@ public class PfConceptKey extends PfKey {
* @param name the key name
* @param version the key version
*/
- public PfConceptKey(final String name, final String version) {
+ public PfConceptKey(@NonNull final String name, @NonNull final String version) {
super();
this.name = Assertions.validateStringParameter(NAME_TOKEN, name, NAME_REGEXP);
this.version = Assertions.validateStringParameter(VERSION_TOKEN, version, VERSION_REGEXP);
@@ -88,9 +89,7 @@ public class PfConceptKey extends PfKey {
*
* @param id the key ID in a format that respects the KEY_ID_REGEXP
*/
- public PfConceptKey(final String id) {
- Assertions.argumentNotNull(id, "id may not be null");
-
+ public PfConceptKey(@NonNull final String id) {
// Check the incoming ID is valid
Assertions.validateStringParameter("id", id, KEY_ID_REGEXP);
@@ -131,7 +130,12 @@ public class PfConceptKey extends PfKey {
}
@Override
- public PfKey.Compatibility getCompatibility(final PfKey otherKey) {
+ public boolean isNullKey() {
+ return this.equals(PfConceptKey.getNullKey());
+ }
+
+ @Override
+ public PfKey.Compatibility getCompatibility(@NonNull final PfKey otherKey) {
if (!(otherKey instanceof PfConceptKey)) {
return Compatibility.DIFFERENT;
}
@@ -161,7 +165,7 @@ public class PfConceptKey extends PfKey {
}
@Override
- public boolean isCompatible(final PfKey otherKey) {
+ public boolean isCompatible(@NonNull final PfKey otherKey) {
if (!(otherKey instanceof PfConceptKey)) {
return false;
}
@@ -212,7 +216,7 @@ public class PfConceptKey extends PfKey {
}
@Override
- public int compareTo(final PfConcept otherObj) {
+ public int compareTo(@NonNull final PfConcept otherObj) {
Assertions.argumentNotNull(otherObj, "comparison object may not be null");
if (this == otherObj) {
diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfKey.java b/models-base/src/main/java/org/onap/policy/models/base/PfKey.java
index dda4cdc03..6e9035e95 100644
--- a/models-base/src/main/java/org/onap/policy/models/base/PfKey.java
+++ b/models-base/src/main/java/org/onap/policy/models/base/PfKey.java
@@ -20,6 +20,8 @@
package org.onap.policy.models.base;
+import lombok.NonNull;
+
/**
* The key uniquely identifies every entity in the system. This class is an abstract class to give a common parent for
* all key types in the system.
@@ -89,7 +91,7 @@ public abstract class PfKey extends PfConcept {
* @param otherKey the key to check compatibility against
* @return the compatibility result of the check
*/
- public abstract Compatibility getCompatibility(PfKey otherKey);
+ public abstract Compatibility getCompatibility(@NonNull PfKey otherKey);
/**
* Check if two keys are compatible, that is the keys are IDENTICAL or have only MINOR, PATCH differences.
@@ -97,5 +99,12 @@ public abstract class PfKey extends PfConcept {
* @param otherKey the key to check compatibility against
* @return true, if the keys are compatible
*/
- public abstract boolean isCompatible(PfKey otherKey);
+ public abstract boolean isCompatible(@NonNull PfKey otherKey);
+
+ /**
+ * Check if a key equals its null key.
+ *
+ * @return true, if the key is a null key
+ */
+ public abstract boolean isNullKey();
}
diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfKeyUse.java b/models-base/src/main/java/org/onap/policy/models/base/PfKeyUse.java
index 0eb55a711..57141c2fa 100644
--- a/models-base/src/main/java/org/onap/policy/models/base/PfKeyUse.java
+++ b/models-base/src/main/java/org/onap/policy/models/base/PfKeyUse.java
@@ -22,16 +22,20 @@ package org.onap.policy.models.base;
import java.util.List;
+import javax.ws.rs.core.Response;
+
import lombok.EqualsAndHashCode;
+import lombok.NonNull;
import lombok.ToString;
import org.onap.policy.common.utils.validation.Assertions;
import org.onap.policy.models.base.PfValidationResult.ValidationResult;
/**
- * This class records a usage of a key in the system. When the list of keys being used by a concept is built using the
- * getKeys() method of the {@link PfConcept} class, an instance of this class is created for every key occurrence. The
- * list of keys returned by the getKeys() method is a list of {@link PfKeyUse} objects.
+ * This class records a usage of a key in the system. When the list of keys being used by a concept
+ * is built using the getKeys() method of the {@link PfConcept} class, an instance of this class is
+ * created for every key occurrence. The list of keys returned by the getKeys() method is a list of
+ * {@link PfKeyUse} objects.
*
* <p>Validation checks that each key is valid.
*/
@@ -50,22 +54,21 @@ public class PfKeyUse extends PfKey {
}
/**
- * Copy constructor.
+ * This constructor creates an instance of this class, and holds a reference to a used key.
*
- * @param copyConcept the concept to copy from
+ * @param usedKey a used key
*/
- public PfKeyUse(final PfKeyUse copyConcept) {
- super(copyConcept);
+ public PfKeyUse(@NonNull final PfKey usedKey) {
+ this.usedKey = usedKey;
}
/**
- * This constructor creates an instance of this class, and holds a reference to a used key.
+ * Copy constructor.
*
- * @param usedKey a used key
+ * @param copyConcept the concept to copy from
*/
- public PfKeyUse(final PfKey usedKey) {
- Assertions.argumentNotNull(usedKey, "usedKey may not be null");
- this.usedKey = usedKey;
+ public PfKeyUse(@NonNull final PfKeyUse copyConcept) {
+ super(copyConcept);
}
@Override
@@ -83,56 +86,42 @@ public class PfKeyUse extends PfKey {
return usedKey.getId();
}
+ @Override
+ public boolean isNullKey() {
+ return usedKey.isNullKey();
+ }
+
/**
* Sets the key.
*
* @param key the key
*/
- public void setKey(final PfKey key) {
- Assertions.argumentNotNull(key, "usedKey may not be null");
+ public void setKey(@NonNull final PfKey key) {
this.usedKey = key;
}
@Override
- public PfKey.Compatibility getCompatibility(final PfKey otherKey) {
+ public PfKey.Compatibility getCompatibility(@NonNull final PfKey otherKey) {
return usedKey.getCompatibility(otherKey);
}
@Override
- public boolean isCompatible(final PfKey otherKey) {
+ public boolean isCompatible(@NonNull final PfKey otherKey) {
return usedKey.isCompatible(otherKey);
}
@Override
- public PfValidationResult validate(final PfValidationResult result) {
- if (usedKey.equals(PfConceptKey.getNullKey())) {
- result.addValidationMessage(new PfValidationMessage(usedKey, this.getClass(), ValidationResult.INVALID,
- "usedKey is a null key"));
- }
- return usedKey.validate(result);
- }
-
- @Override
public void clean() {
usedKey.clean();
}
@Override
- public PfConcept copyTo(final PfConcept target) {
- Assertions.argumentNotNull(target, "target may not be null");
-
- final Object copyObject = target;
- Assertions.instanceOf(copyObject, PfKeyUse.class);
-
- final PfKeyUse copy = ((PfKeyUse) copyObject);
- try {
- copy.usedKey = usedKey.getClass().newInstance();
- } catch (final Exception e) {
- throw new PfModelRuntimeException("error copying concept key: " + e.getMessage(), e);
+ public PfValidationResult validate(@NonNull final PfValidationResult result) {
+ if (usedKey.isNullKey()) {
+ result.addValidationMessage(new PfValidationMessage(usedKey, this.getClass(), ValidationResult.INVALID,
+ "usedKey is a null key"));
}
- usedKey.copyTo(copy.usedKey);
-
- return copy;
+ return usedKey.validate(result);
}
@Override
@@ -150,4 +139,21 @@ public class PfKeyUse extends PfKey {
return usedKey.compareTo(other.usedKey);
}
+
+ @Override
+ public PfConcept copyTo(@NonNull final PfConcept target) {
+ final Object copyObject = target;
+ Assertions.instanceOf(copyObject, PfKeyUse.class);
+
+ final PfKeyUse copy = ((PfKeyUse) copyObject);
+ try {
+ copy.usedKey = usedKey.getClass().newInstance();
+ } catch (final Exception e) {
+ throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR,
+ "error copying concept key: " + e.getMessage(), e);
+ }
+ usedKey.copyTo(copy.usedKey);
+
+ return copy;
+ }
}
diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfModel.java b/models-base/src/main/java/org/onap/policy/models/base/PfModel.java
index c9174bde8..3dc233b02 100644
--- a/models-base/src/main/java/org/onap/policy/models/base/PfModel.java
+++ b/models-base/src/main/java/org/onap/policy/models/base/PfModel.java
@@ -63,8 +63,7 @@ public abstract class PfModel extends PfConcept {
private static final long serialVersionUID = -771659065637205430L;
@EmbeddedId
- @NonNull
- private PfConceptKey key = PfConceptKey.getNullKey();
+ private PfConceptKey key;
/**
* The Default Constructor creates this concept with a NULL artifact key.
@@ -74,20 +73,11 @@ public abstract class PfModel extends PfConcept {
}
/**
- * Copy constructor.
- *
- * @param copyConcept the concept to copy from
- */
- public PfModel(final PfModel copyConcept) {
- super(copyConcept);
- }
-
- /**
* Constructor to create this concept with the specified key.
*
* @param key the key of this concept
*/
- public PfModel(final PfConceptKey key) {
+ public PfModel(@NonNull final PfConceptKey key) {
super();
Assertions.argumentNotNull(key, "key may not be null");
@@ -95,6 +85,15 @@ public abstract class PfModel extends PfConcept {
}
/**
+ * Copy constructor.
+ *
+ * @param copyConcept the concept to copy from
+ */
+ public PfModel(@NonNull final PfModel copyConcept) {
+ super(copyConcept);
+ }
+
+ /**
* Registers this model with the {@link PfModelService}. All models are registered with the
* model service so that models can be references from anywhere in the Policy Framework system
* without being passed as references through deep call chains.
@@ -107,10 +106,15 @@ public abstract class PfModel extends PfConcept {
}
@Override
- public PfValidationResult validate(final PfValidationResult resultIn) {
+ public void clean() {
+ key.clean();
+ }
+
+ @Override
+ public PfValidationResult validate(@NonNull final PfValidationResult resultIn) {
PfValidationResult result = resultIn;
- if (key.equals(PfConceptKey.getNullKey())) {
+ if (key.isNullKey()) {
result.addValidationMessage(
new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID, "key is a null key"));
}
@@ -129,7 +133,7 @@ public abstract class PfModel extends PfConcept {
} else if (pfKey instanceof PfReferenceKey) {
result = validateReferenceKeyInModel((PfReferenceKey) pfKey, referenceKeySet, result);
}
- // It must be an PfKeyUse, nothing else is legal
+ // It must be a PfKeyUse, nothing else is legal
else {
usedKeySet.add((PfKeyUse) pfKey);
}
@@ -160,7 +164,7 @@ public abstract class PfModel extends PfConcept {
private PfValidationResult validateArtifactKeyInModel(final PfConceptKey artifactKey,
final Set<PfConceptKey> artifactKeySet, final PfValidationResult result) {
// Null key check
- if (artifactKey.equals(PfConceptKey.getNullKey())) {
+ if (artifactKey.isNullKey()) {
result.addValidationMessage(new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID,
"key " + artifactKey + IS_A_NULL_KEY));
}
@@ -194,13 +198,13 @@ public abstract class PfModel extends PfConcept {
private PfValidationResult validateReferenceKeyInModel(final PfReferenceKey referenceKey,
final Set<PfReferenceKey> referenceKeySet, final PfValidationResult result) {
// Null key check
- if (referenceKey.equals(PfReferenceKey.getNullKey())) {
+ if (referenceKey.isNullKey()) {
result.addValidationMessage(new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID,
"key " + referenceKey + IS_A_NULL_KEY));
}
// Null parent key check
- if (referenceKey.getParentConceptKey().equals(PfConceptKey.getNullKey())) {
+ if (referenceKey.getParentConceptKey().isNullKey()) {
result.addValidationMessage(new PfValidationMessage(key, this.getClass(), ValidationResult.INVALID,
"parent artifact key of key " + referenceKey + IS_A_NULL_KEY));
}
@@ -262,29 +266,6 @@ public abstract class PfModel extends PfConcept {
}
@Override
- public void clean() {
- key.clean();
- }
-
- @Override
- public PfConcept copyTo(final PfConcept target) {
- Assertions.argumentNotNull(target, "target may not be null");
-
- final Object copyObject = target;
- Assertions.instanceOf(copyObject, PfModel.class);
-
- final PfModel copy = ((PfModel) copyObject);
- copy.setKey(new PfConceptKey(key));
-
- return copy;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see java.lang.Comparable#compareTo(java.lang.Object)
- */
- @Override
public int compareTo(final PfConcept otherObj) {
if (otherObj == null) {
return -1;
@@ -300,4 +281,14 @@ public abstract class PfModel extends PfConcept {
return key.compareTo(other.key);
}
+
+ @Override
+ public PfConcept copyTo(@NonNull final PfConcept target) {
+ Assertions.instanceOf(target, PfModel.class);
+
+ final PfModel copy = ((PfModel) target);
+ copy.setKey(new PfConceptKey(key));
+
+ return copy;
+ }
}
diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfModelException.java b/models-base/src/main/java/org/onap/policy/models/base/PfModelException.java
index 3d1bb1794..97ea7de00 100644
--- a/models-base/src/main/java/org/onap/policy/models/base/PfModelException.java
+++ b/models-base/src/main/java/org/onap/policy/models/base/PfModelException.java
@@ -20,54 +20,71 @@
package org.onap.policy.models.base;
+import javax.ws.rs.core.Response;
+
+import lombok.Getter;
+import lombok.ToString;
+
/**
* This class is a base exception from which all model exceptions are sub classes.
*/
+@Getter
+@ToString
public class PfModelException extends Exception {
private static final long serialVersionUID = -8507246953751956974L;
+ // The status code on the exception
+ private final Response.Status statusCode;
+
// The object on which the exception was thrown
private final transient Object object;
/**
* Instantiates a new model exception.
*
+ * @param statusCode the return code for the exception
* @param message the message on the exception
*/
- public PfModelException(final String message) {
- this(message, null);
+ public PfModelException(final Response.Status statusCode, final String message) {
+ this(statusCode, message, null);
}
/**
* Instantiates a new model exception.
*
+ * @param statusCode the return code for the exception
* @param message the message on the exception
* @param object the object that the exception was thrown on
*/
- public PfModelException(final String message, final Object object) {
+ public PfModelException(final Response.Status statusCode, final String message, final Object object) {
super(message);
+ this.statusCode = statusCode;
this.object = object;
}
/**
* Instantiates a new model exception.
*
+ * @param statusCode the return code for the exception
* @param message the message on the exception
* @param exception the exception that caused this exception
*/
- public PfModelException(final String message, final Exception exception) {
- this(message, exception, null);
+ public PfModelException(final Response.Status statusCode, final String message, final Exception exception) {
+ this(statusCode, message, exception, null);
}
/**
* Instantiates a new exception.
*
+ * @param statusCode the return code for the exception
* @param message the message on the exception
* @param exception the exception that caused this exception
* @param object the object that the exception was thrown on
*/
- public PfModelException(final String message, final Exception exception, final Object object) {
+ public PfModelException(final Response.Status statusCode, final String message, final Exception exception,
+ final Object object) {
super(message, exception);
+ this.statusCode = statusCode;
this.object = object;
}
@@ -97,13 +114,4 @@ public class PfModelException extends Exception {
return builder.toString();
}
-
- /**
- * Get the object on which the exception was thrown.
- *
- * @return The object on which the exception was thrown
- */
- public Object getObject() {
- return object;
- }
}
diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfModelRuntimeException.java b/models-base/src/main/java/org/onap/policy/models/base/PfModelRuntimeException.java
index 0780a9e20..c4684bc09 100644
--- a/models-base/src/main/java/org/onap/policy/models/base/PfModelRuntimeException.java
+++ b/models-base/src/main/java/org/onap/policy/models/base/PfModelRuntimeException.java
@@ -20,56 +20,73 @@
package org.onap.policy.models.base;
+import javax.ws.rs.core.Response;
+
+import lombok.Getter;
+import lombok.ToString;
+
/**
* This class is a base model run time exception from which all model run time exceptions are sub
* classes.
*/
+@Getter
+@ToString
public class PfModelRuntimeException extends RuntimeException {
private static final long serialVersionUID = -8507246953751956974L;
+ // The return code on the exception
+ private final Response.Status statusCode;
+
// The object on which the exception was thrown
private final transient Object object;
/**
* Instantiates a new model runtime exception.
*
+ * @param statusCode the return code for the exception
* @param message the message on the exception
*/
- public PfModelRuntimeException(final String message) {
- this(message, null);
+ public PfModelRuntimeException(final Response.Status statusCode, final String message) {
+ this(statusCode, message, null);
}
/**
* Instantiates a new model runtime exception.
*
+ * @param statusCode the return code for the exception
* @param message the message on the exception
* @param object the object that the exception was thrown on
*/
- public PfModelRuntimeException(final String message, final Object object) {
+ public PfModelRuntimeException(final Response.Status statusCode, final String message, final Object object) {
super(message);
this.object = object;
+ this.statusCode = statusCode;
}
/**
* Instantiates a new model runtime exception.
*
+ * @param statusCode the return code for the exception
* @param message the message on the exception
* @param exception the exception that caused this model exception
*/
- public PfModelRuntimeException(final String message, final Exception exception) {
- this(message, exception, null);
+ public PfModelRuntimeException(final Response.Status statusCode, final String message, final Exception exception) {
+ this(statusCode, message, exception, null);
}
/**
* Instantiates a new model runtime exception.
*
+ * @param statusCode the return code for the exception
* @param message the message on the exception
* @param exception the exception that caused this model exception
* @param object the object that the exception was thrown on
*/
- public PfModelRuntimeException(final String message, final Exception exception, final Object object) {
+ public PfModelRuntimeException(final Response.Status statusCode, final String message, final Exception exception,
+ final Object object) {
super(message, exception);
this.object = object;
+ this.statusCode = statusCode;
}
/**
@@ -80,13 +97,4 @@ public class PfModelRuntimeException extends RuntimeException {
public String getCascadedMessage() {
return PfModelException.buildCascadedMessage(this);
}
-
- /**
- * Get the object on which the exception was thrown.
- *
- * @return The object
- */
- public Object getObject() {
- return object;
- }
}
diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfModelService.java b/models-base/src/main/java/org/onap/policy/models/base/PfModelService.java
index c02de6aa7..67ba59c8b 100644
--- a/models-base/src/main/java/org/onap/policy/models/base/PfModelService.java
+++ b/models-base/src/main/java/org/onap/policy/models/base/PfModelService.java
@@ -23,6 +23,10 @@ package org.onap.policy.models.base;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
+import javax.ws.rs.core.Response;
+
+import lombok.NonNull;
+
/**
* The model service makes Policy Framework models available to all classes in a JVM.
*
@@ -37,7 +41,7 @@ import java.util.concurrent.ConcurrentHashMap;
*/
public abstract class PfModelService {
// The map holding the models
- private static Map<Class<?>, PfConcept> modelMap = new ConcurrentHashMap<>();
+ private static Map<String, PfConcept> modelMap = new ConcurrentHashMap<>();
/**
* This class is an abstract static class that cannot be extended.
@@ -48,37 +52,36 @@ public abstract class PfModelService {
* Register a model with the model service.
*
* @param <M> the generic type
- * @param modelClass the class of the model, used to index the model
+ * @param modelKey the key of the model, used to index the model
* @param model The model
*/
- public static <M extends PfConcept> void registerModel(final Class<M> modelClass, final M model) {
- modelMap.put(modelClass, model);
+ public static <M extends PfConcept> void registerModel(@NonNull final String modelKey, @NonNull final M model) {
+ modelMap.put(modelKey, model);
}
/**
* Remove a model from the model service.
*
- * @param <M> the generic type
- * @param modelClass the class of the model, used to index the model
+ * @param modelKey the key of the model, used to index the model
*/
- public static <M extends PfConcept> void deregisterModel(final Class<M> modelClass) {
- modelMap.remove(modelClass);
+ public static void deregisterModel(@NonNull final String modelKey) {
+ modelMap.remove(modelKey);
}
/**
* Get a model from the model service.
*
* @param <M> the generic type
- * @param modelClass the class of the model, used to index the model
+ * @param modelKey the key of the model, used to index the model
* @return The model
*/
@SuppressWarnings("unchecked")
- public static <M extends PfConcept> M getModel(final Class<M> modelClass) {
- final M model = (M) modelMap.get(modelClass);
+ public static <M extends PfConcept> M getModel(@NonNull final String modelKey) {
+ final M model = (M) modelMap.get(modelKey);
if (model == null) {
- throw new PfModelRuntimeException(
- "Model for " + modelClass.getCanonicalName() + " not found in model service");
+ throw new PfModelRuntimeException(Response.Status.INTERNAL_SERVER_ERROR,
+ "Model for name " + modelKey + " not found in model service");
}
return model;
@@ -87,12 +90,11 @@ public abstract class PfModelService {
/**
* Check if a model is defined on the model service.
*
- * @param <M> the generic type
- * @param modelClass the class of the model, used to index the model
+ * @param modelKey the key of the model, used to index the model
* @return true if the model is defined
*/
- public static <M extends PfConcept> boolean existsModel(final Class<M> modelClass) {
- return modelMap.get(modelClass) != null;
+ public static boolean existsModel(final String modelKey) {
+ return modelMap.get(modelKey) != null;
}
/**
diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfReferenceKey.java b/models-base/src/main/java/org/onap/policy/models/base/PfReferenceKey.java
index e3b92c0e9..2e9f48ba5 100644
--- a/models-base/src/main/java/org/onap/policy/models/base/PfReferenceKey.java
+++ b/models-base/src/main/java/org/onap/policy/models/base/PfReferenceKey.java
@@ -243,6 +243,11 @@ public class PfReferenceKey extends PfKey {
return parentKeyName + ':' + parentKeyVersion + ':' + parentLocalName + ':' + localName;
}
+ @Override
+ public boolean isNullKey() {
+ return this.equals(PfReferenceKey.getNullKey());
+ }
+
/**
* Gets the parent concept key of this reference key.
*
diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfUtils.java b/models-base/src/main/java/org/onap/policy/models/base/PfUtils.java
new file mode 100644
index 000000000..a18315ceb
--- /dev/null
+++ b/models-base/src/main/java/org/onap/policy/models/base/PfUtils.java
@@ -0,0 +1,59 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.models.base;
+
+/**
+ * Utility class for Policy Framework concept utilities.
+ *
+ * @author Liam Fallon (liam.fallon@est.tech)
+ */
+public final class PfUtils {
+ private PfUtils() {
+ // Cannot be subclassed
+ }
+
+ /**
+ * Compare two objects using their equals methods, nulls are allowed.
+ *
+ * @param leftObject the first object
+ * @param rightObject the second object
+ * @return a measure of the comparison
+ */
+ public static int compareObjects(final Object leftObject, final Object rightObject) {
+ if (leftObject == null && rightObject == null) {
+ return 0;
+ }
+
+ if (leftObject == null) {
+ return 1;
+ }
+
+ if (rightObject == null) {
+ return -1;
+ }
+
+ if (!leftObject.equals(rightObject)) {
+ return leftObject.hashCode() - rightObject.hashCode();
+ }
+
+ return 0;
+ }
+}
diff --git a/models-base/src/main/java/org/onap/policy/models/base/PfValidationResult.java b/models-base/src/main/java/org/onap/policy/models/base/PfValidationResult.java
index 284c11ac2..4f8d06bdc 100644
--- a/models-base/src/main/java/org/onap/policy/models/base/PfValidationResult.java
+++ b/models-base/src/main/java/org/onap/policy/models/base/PfValidationResult.java
@@ -23,9 +23,12 @@ package org.onap.policy.models.base;
import java.util.LinkedList;
import java.util.List;
+import lombok.Getter;
+
/**
- * This class records the result of a validation and holds all validatino observation messages.
+ * This class records the result of a validation and holds all validation observation messages.
*/
+@Getter
public class PfValidationResult {
/**
* The ValidationResult enumeration describes the severity of a validation result.
@@ -77,24 +80,6 @@ public class PfValidationResult {
}
/**
- * Gets the validation result.
- *
- * @return the validation result on a concept
- */
- public ValidationResult getValidationResult() {
- return validationResult;
- }
-
- /**
- * Gets the list of validation results on the concept.
- *
- * @return the list of validaiton results
- */
- public List<PfValidationMessage> getMessageList() {
- return messageList;
- }
-
- /**
* Adds a validation message to the validation result, used by validate() implementations on
* {@link PfConcept} subclasses to report validaiton observations.
*