2 * ============LICENSE_START=======================================================
3 * Copyright (C) 2016-2018 Ericsson. All rights reserved.
4 * Modifications Copyright (C) 2019 Nordix Foundation.
5 * ================================================================================
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
18 * SPDX-License-Identifier: Apache-2.0
19 * ============LICENSE_END=========================================================
22 package org.onap.policy.apex.model.eventmodel.concepts;
24 import java.util.List;
26 import java.util.Map.Entry;
27 import java.util.NavigableMap;
29 import java.util.TreeMap;
30 import javax.persistence.CascadeType;
31 import javax.persistence.EmbeddedId;
32 import javax.persistence.Entity;
33 import javax.persistence.JoinColumn;
34 import javax.persistence.JoinTable;
35 import javax.persistence.ManyToMany;
36 import javax.persistence.Table;
37 import javax.xml.bind.Unmarshaller;
38 import javax.xml.bind.annotation.XmlAccessType;
39 import javax.xml.bind.annotation.XmlAccessorType;
40 import javax.xml.bind.annotation.XmlElement;
41 import javax.xml.bind.annotation.XmlType;
42 import org.onap.policy.apex.model.basicmodel.concepts.AxArtifactKey;
43 import org.onap.policy.apex.model.basicmodel.concepts.AxConcept;
44 import org.onap.policy.apex.model.basicmodel.concepts.AxConceptGetter;
45 import org.onap.policy.apex.model.basicmodel.concepts.AxConceptGetterImpl;
46 import org.onap.policy.apex.model.basicmodel.concepts.AxKey;
47 import org.onap.policy.apex.model.basicmodel.concepts.AxValidationMessage;
48 import org.onap.policy.apex.model.basicmodel.concepts.AxValidationResult;
49 import org.onap.policy.apex.model.basicmodel.concepts.AxValidationResult.ValidationResult;
50 import org.onap.policy.common.utils.validation.Assertions;
53 * This class is an event container and holds a map of the events for an entire Apex model. All Apex models that use
54 * events must have an {@link AxEvents} field. The {@link AxEvents} class implements the helper methods of the
55 * {@link AxConceptGetter} interface to allow {@link AxEvents} instances to be retrieved by calling methods directly on
56 * this class without referencing the contained map.
58 * <p>Validation checks that the container key is not null. An error is issued if no events are defined in the
59 * container. Each event entry is checked to ensure that its key and value are not null and that the key matches the key
60 * in the map value. Each event entry is then validated individually.
63 @Table(name = "AxEvents")
65 @XmlAccessorType(XmlAccessType.FIELD)
66 @XmlType(name = "AxEvents", namespace = "http://www.onap.org/policy/apex-pdp", propOrder =
67 { "key", "eventMap" })
69 public class AxEvents extends AxConcept implements AxConceptGetter<AxEvent> {
70 private static final long serialVersionUID = 4290442590545820316L;
73 @XmlElement(name = "key", required = true)
74 private AxArtifactKey key;
77 @ManyToMany(cascade = CascadeType.ALL)
79 joinColumns = { @JoinColumn(name = "eventMapName", referencedColumnName = "name"),
80 @JoinColumn(name = "eventMapVersion", referencedColumnName = "version") },
81 inverseJoinColumns = { @JoinColumn(name = "eventName", referencedColumnName = "name"),
82 @JoinColumn(name = "eventVersion", referencedColumnName = "version") })
83 @XmlElement(required = true)
84 private Map<AxArtifactKey, AxEvent> eventMap;
88 * The Default Constructor creates a {@link AxEvents} object with a null artifact key and creates an empty event
92 this(new AxArtifactKey());
98 * @param copyConcept the concept to copy from
100 public AxEvents(final AxEvents copyConcept) {
105 * The Key Constructor creates a {@link AxEvents} object with the given artifact key and creates an empty event map.
107 * @param key the event container key
109 public AxEvents(final AxArtifactKey key) {
110 this(key, new TreeMap<AxArtifactKey, AxEvent>());
114 * This Constructor creates an event container with all of its fields defined.
116 * @param key the event container key
117 * @param eventMap the events to be stored in the event container
119 public AxEvents(final AxArtifactKey key, final Map<AxArtifactKey, AxEvent> eventMap) {
121 Assertions.argumentNotNull(key, "key may not be null");
122 Assertions.argumentNotNull(eventMap, "eventMap may not be null");
125 this.eventMap = new TreeMap<>();
126 this.eventMap.putAll(eventMap);
130 * When a model is unmarshalled from disk or from the database, the event map is returned as a raw hash map. This
131 * method is called by JAXB after unmarshaling and is used to convert the hash map to a {@link NavigableMap} so that
132 * it will work with the {@link AxConceptGetter} interface.
134 * @param unmarshaler the unmarshaler that is unmarshaling the model
135 * @param parent the parent object of this object in the unmarshaler
137 public void afterUnmarshal(final Unmarshaller unmarshaler, final Object parent) {
138 // The map must be navigable to allow name and version searching, unmarshaling returns a hash map
139 final NavigableMap<AxArtifactKey, AxEvent> navigableEventMap = new TreeMap<>();
140 navigableEventMap.putAll(eventMap);
141 eventMap = navigableEventMap;
148 public AxArtifactKey getKey() {
156 public List<AxKey> getKeys() {
157 final List<AxKey> keyList = key.getKeys();
159 for (final AxEvent event : eventMap.values()) {
160 keyList.addAll(event.getKeys());
167 * Sets the key of the event container.
169 * @param key the event container key
171 public void setKey(final AxArtifactKey key) {
172 Assertions.argumentNotNull(key, "key may not be null");
177 * Gets the event map containing the events in the event container.
179 * @return the event map with all the events in the event container
181 public Map<AxArtifactKey, AxEvent> getEventMap() {
186 * Sets the event map containing the events in the event container.
188 * @param eventMap the event map containing the events in the event container
190 public void setEventMap(final Map<AxArtifactKey, AxEvent> eventMap) {
191 Assertions.argumentNotNull(eventMap, "eventMap may not be null");
192 this.eventMap = new TreeMap<>();
193 this.eventMap.putAll(eventMap);
200 public AxValidationResult validate(final AxValidationResult resultIn) {
201 AxValidationResult result = resultIn;
203 if (key.equals(AxArtifactKey.getNullKey())) {
204 result.addValidationMessage(new AxValidationMessage(key, this.getClass(), ValidationResult.INVALID,
205 "key is a null key"));
208 result = key.validate(result);
210 if (eventMap.size() == 0) {
211 result.addValidationMessage(new AxValidationMessage(key, this.getClass(), ValidationResult.INVALID,
212 "eventMap may not be empty"));
214 for (final Entry<AxArtifactKey, AxEvent> eventEntry : eventMap.entrySet()) {
215 if (eventEntry.getKey().equals(AxArtifactKey.getNullKey())) {
216 result.addValidationMessage(new AxValidationMessage(key, this.getClass(), ValidationResult.INVALID,
217 "key on event entry " + eventEntry.getKey() + " may not be the null key"));
218 } else if (eventEntry.getValue() == null) {
219 result.addValidationMessage(new AxValidationMessage(key, this.getClass(), ValidationResult.INVALID,
220 "value on event entry " + eventEntry.getKey() + " may not be null"));
222 if (!eventEntry.getKey().equals(eventEntry.getValue().getKey())) {
223 result.addValidationMessage(
224 new AxValidationMessage(key, this.getClass(), ValidationResult.INVALID,
225 "key on event entry key " + eventEntry.getKey()
226 + " does not equal event value key "
227 + eventEntry.getValue().getKey()));
230 result = eventEntry.getValue().validate(result);
242 public void clean() {
244 for (final Entry<AxArtifactKey, AxEvent> eventEntry : eventMap.entrySet()) {
245 eventEntry.getKey().clean();
246 eventEntry.getValue().clean();
254 public String toString() {
255 final StringBuilder builder = new StringBuilder();
256 builder.append(this.getClass().getSimpleName());
257 builder.append(":(");
258 builder.append("key=");
260 builder.append(",eventMap=");
261 builder.append(eventMap);
263 return builder.toString();
270 public AxConcept copyTo(final AxConcept targetObject) {
271 Assertions.argumentNotNull(targetObject, "target may not be null");
273 final Object copyObject = targetObject;
274 Assertions.instanceOf(copyObject, AxEvents.class);
276 final AxEvents copy = (AxEvents) copyObject;
277 copy.setKey(new AxArtifactKey(key));
278 final Map<AxArtifactKey, AxEvent> newEventMap = new TreeMap<>();
279 for (final Entry<AxArtifactKey, AxEvent> eventMapEntry : eventMap.entrySet()) {
280 newEventMap.put(new AxArtifactKey(eventMapEntry.getKey()), new AxEvent(eventMapEntry.getValue()));
282 copy.setEventMap(newEventMap);
291 public int hashCode() {
292 final int prime = 31;
294 result = prime * result + key.hashCode();
295 result = prime * result + eventMap.hashCode();
303 public boolean equals(final Object obj) {
311 if (getClass() != obj.getClass()) {
315 final AxEvents other = (AxEvents) obj;
316 if (!key.equals(other.key)) {
319 return eventMap.equals(other.eventMap);
326 public int compareTo(final AxConcept otherObj) {
327 if (otherObj == null) {
330 if (this == otherObj) {
333 if (getClass() != otherObj.getClass()) {
334 return this.hashCode() - otherObj.hashCode();
337 final AxEvents other = (AxEvents) otherObj;
338 if (!key.equals(other.key)) {
339 return key.compareTo(other.key);
341 if (!eventMap.equals(other.eventMap)) {
342 return (eventMap.hashCode() - other.eventMap.hashCode());
352 public AxEvent get(final AxArtifactKey conceptKey) {
353 return new AxConceptGetterImpl<>((NavigableMap<AxArtifactKey, AxEvent>) eventMap).get(conceptKey);
360 public AxEvent get(final String conceptKeyName) {
361 return new AxConceptGetterImpl<>((NavigableMap<AxArtifactKey, AxEvent>) eventMap).get(conceptKeyName);
368 public AxEvent get(final String conceptKeyName, final String conceptKeyVersion) {
369 return new AxConceptGetterImpl<>((NavigableMap<AxArtifactKey, AxEvent>) eventMap).get(conceptKeyName,
377 public Set<AxEvent> getAll(final String conceptKeyName) {
378 return new AxConceptGetterImpl<>((NavigableMap<AxArtifactKey, AxEvent>) eventMap).getAll(conceptKeyName);
385 public Set<AxEvent> getAll(final String conceptKeyName, final String conceptKeyVersion) {
386 return new AxConceptGetterImpl<>((NavigableMap<AxArtifactKey, AxEvent>) eventMap).getAll(conceptKeyName,