756c4f1bfc9edf2b9ef443b0dab28518b113ce71
[policy/clamp.git] /
1 /*-
2  * ============LICENSE_START=======================================================
3  * Copyright (C) 2021 Nordix Foundation.
4  * ================================================================================
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  *      http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  * SPDX-License-Identifier: Apache-2.0
18  * ============LICENSE_END=========================================================
19  */
20
21 package org.onap.policy.clamp.controlloop.models.controlloop.persistence.concepts;
22
23 import java.util.LinkedHashMap;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.Map.Entry;
27 import java.util.UUID;
28 import javax.persistence.AttributeOverride;
29 import javax.persistence.CascadeType;
30 import javax.persistence.Column;
31 import javax.persistence.EmbeddedId;
32 import javax.persistence.Entity;
33 import javax.persistence.FetchType;
34 import javax.persistence.Inheritance;
35 import javax.persistence.InheritanceType;
36 import javax.persistence.ManyToMany;
37 import javax.persistence.Table;
38 import lombok.Data;
39 import lombok.EqualsAndHashCode;
40 import lombok.NonNull;
41 import org.apache.commons.lang3.ObjectUtils;
42 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoop;
43 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopElement;
44 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopOrderedState;
45 import org.onap.policy.clamp.controlloop.models.controlloop.concepts.ControlLoopState;
46 import org.onap.policy.common.parameters.annotations.NotNull;
47 import org.onap.policy.common.parameters.annotations.Valid;
48 import org.onap.policy.models.base.PfAuthorative;
49 import org.onap.policy.models.base.PfConcept;
50 import org.onap.policy.models.base.PfConceptKey;
51 import org.onap.policy.models.base.PfKey;
52 import org.onap.policy.models.base.PfReferenceKey;
53 import org.onap.policy.models.base.PfUtils;
54 import org.onap.policy.models.base.validation.annotations.VerifyKey;
55 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
56
57 /**
58  * Class to represent a control loop in the database.
59  *
60  * @author Liam Fallon (liam.fallon@est.tech)
61  */
62 @Entity
63 @Table(name = "ControlLoop")
64 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
65 @Data
66 @EqualsAndHashCode(callSuper = false)
67 public class JpaControlLoop extends PfConcept implements PfAuthorative<ControlLoop> {
68     private static final long serialVersionUID = -4725410933242154805L;
69
70     @EmbeddedId
71     @VerifyKey
72     @NotNull
73     private PfConceptKey key;
74
75     // @formatter:off
76     @VerifyKey
77     @NotNull
78     @AttributeOverride(name = "name",    column = @Column(name = "definition_name"))
79     @AttributeOverride(name = "version", column = @Column(name = "definition_version"))
80     private PfConceptKey definition;
81     // @formatter:on
82
83     @Column
84     @NotNull
85     private ControlLoopState state;
86
87     @Column
88     @NotNull
89     private ControlLoopOrderedState orderedState;
90
91     @Column
92     private String description;
93
94     @Column
95     private Boolean primed;
96
97     // @formatter:off
98     @ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
99     @NotNull
100     private Map<@NotNull UUID, @NotNull @Valid JpaControlLoopElement> elements;
101
102     /**
103      * The Default Constructor creates a {@link JpaControlLoop} object with a null key.
104      */
105     public JpaControlLoop() {
106         this(new PfConceptKey());
107     }
108
109     /**
110      * The Key Constructor creates a {@link JpaControlLoop} object with the given concept key.
111      *
112      * @param key the key
113      */
114     public JpaControlLoop(@NonNull final PfConceptKey key) {
115         this(key, new PfConceptKey(), ControlLoopState.UNINITIALISED, new LinkedHashMap<>());
116     }
117
118     /**
119      * The Key Constructor creates a {@link JpaControlLoop} object with all mandatory fields.
120      *
121      * @param key the key
122      * @param definition the TOSCA definition of the control loop
123      * @param state the state of the control loop
124      * @param elements the elements of the control looop in participants
125      */
126     public JpaControlLoop(@NonNull final PfConceptKey key, @NonNull final PfConceptKey definition,
127             @NonNull final ControlLoopState state, @NonNull final Map<UUID, JpaControlLoopElement> elements) {
128         this.key = key;
129         this.definition = definition;
130         this.state = state;
131         this.elements = elements;
132     }
133
134     /**
135      * Copy constructor.
136      *
137      * @param copyConcept the concept to copy from
138      */
139     public JpaControlLoop(@NonNull final JpaControlLoop copyConcept) {
140         super(copyConcept);
141         this.key = new PfConceptKey(copyConcept.key);
142         this.definition = new PfConceptKey(copyConcept.definition);
143         this.state = copyConcept.state;
144         this.orderedState = copyConcept.orderedState;
145         this.description = copyConcept.description;
146         this.elements = PfUtils.mapMap(copyConcept.elements, JpaControlLoopElement::new, new LinkedHashMap<>(0));
147         this.primed = copyConcept.primed;
148     }
149
150     /**
151      * Authorative constructor.
152      *
153      * @param authorativeConcept the authorative concept to copy from
154      */
155     public JpaControlLoop(@NonNull final ControlLoop authorativeConcept) {
156         this.fromAuthorative(authorativeConcept);
157     }
158
159     @Override
160     public ControlLoop toAuthorative() {
161         var controlLoop = new ControlLoop();
162
163         controlLoop.setName(getKey().getName());
164         controlLoop.setVersion(getKey().getVersion());
165         controlLoop.setDefinition(new ToscaConceptIdentifier(definition));
166         controlLoop.setState(state);
167         controlLoop.setOrderedState(orderedState != null ? orderedState : state.asOrderedState());
168         controlLoop.setDescription(description);
169         controlLoop.setElements(PfUtils.mapMap(elements, JpaControlLoopElement::toAuthorative, new LinkedHashMap<>(0)));
170         controlLoop.setPrimed(primed);
171
172         return controlLoop;
173     }
174
175     @Override
176     public void fromAuthorative(@NonNull final ControlLoop controlLoop) {
177         if (this.key == null || this.getKey().isNullKey()) {
178             this.setKey(new PfConceptKey(controlLoop.getName(), controlLoop.getVersion()));
179         }
180
181         this.definition = controlLoop.getDefinition().asConceptKey();
182         this.state = controlLoop.getState();
183         this.orderedState = controlLoop.getOrderedState();
184         this.description = controlLoop.getDescription();
185         this.primed = controlLoop.getPrimed();
186
187         this.elements = new LinkedHashMap<>(controlLoop.getElements().size());
188         for (Entry<UUID, ControlLoopElement> elementEntry : controlLoop.getElements().entrySet()) {
189             var jpaControlLoopElement = new JpaControlLoopElement();
190             jpaControlLoopElement.setKey(new PfReferenceKey(getKey(), elementEntry.getValue().getId().toString()));
191             jpaControlLoopElement.fromAuthorative(elementEntry.getValue());
192             this.elements.put(elementEntry.getKey(), jpaControlLoopElement);
193         }
194     }
195
196     @Override
197     public List<PfKey> getKeys() {
198         List<PfKey> keyList = getKey().getKeys();
199
200         keyList.add(definition);
201
202         for (JpaControlLoopElement element : elements.values()) {
203             keyList.addAll(element.getKeys());
204         }
205
206         return keyList;
207     }
208
209     @Override
210     public void clean() {
211         key.clean();
212         definition.clean();
213         description = (description == null ? null : description.trim());
214
215         for (JpaControlLoopElement element : elements.values()) {
216             element.clean();
217         }
218     }
219
220     @Override
221     public int compareTo(final PfConcept otherConcept) {
222         if (otherConcept == null) {
223             return -1;
224         }
225         if (this == otherConcept) {
226             return 0;
227         }
228         if (getClass() != otherConcept.getClass()) {
229             return this.getClass().getName().compareTo(otherConcept.getClass().getName());
230         }
231
232         final JpaControlLoop other = (JpaControlLoop) otherConcept;
233         int result = key.compareTo(other.key);
234         if (result != 0) {
235             return result;
236         }
237
238         result = definition.compareTo(other.definition);
239         if (result != 0) {
240             return result;
241         }
242
243         result = ObjectUtils.compare(state, other.state);
244         if (result != 0) {
245             return result;
246         }
247
248         result = ObjectUtils.compare(orderedState, other.orderedState);
249         if (result != 0) {
250             return result;
251         }
252
253         result = ObjectUtils.compare(description, other.description);
254         if (result != 0) {
255             return result;
256         }
257
258         result = ObjectUtils.compare(primed, other.primed);
259         if (result != 0) {
260             return result;
261         }
262         return PfUtils.compareObjects(elements, other.elements);
263     }
264 }