Complete filters for Database Fetches
[policy/models.git] / models-tosca / src / main / java / org / onap / policy / models / tosca / simple / concepts / JpaToscaPolicy.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * ONAP Policy Model
4  * ================================================================================
5  * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
6  * Modifications Copyright (C) 2019 Nordix Foundation.
7  * ================================================================================
8  * Licensed under the Apache License, Version 2.0 (the "License");
9  * you may not use this file except in compliance with the License.
10  * You may obtain a copy of the License at
11  *
12  *      http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing, software
15  * distributed under the License is distributed on an "AS IS" BASIS,
16  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17  * See the License for the specific language governing permissions and
18  * limitations under the License.
19  *
20  * SPDX-License-Identifier: Apache-2.0
21  * ============LICENSE_END=========================================================
22  */
23
24 package org.onap.policy.models.tosca.simple.concepts;
25
26 import java.util.ArrayList;
27 import java.util.LinkedHashMap;
28 import java.util.List;
29 import java.util.Map;
30 import java.util.Map.Entry;
31
32 import javax.persistence.AttributeOverride;
33 import javax.persistence.AttributeOverrides;
34 import javax.persistence.Column;
35 import javax.persistence.ElementCollection;
36 import javax.persistence.Entity;
37 import javax.persistence.Inheritance;
38 import javax.persistence.InheritanceType;
39 import javax.persistence.Lob;
40 import javax.persistence.Table;
41
42 import lombok.Data;
43 import lombok.EqualsAndHashCode;
44 import lombok.NonNull;
45
46 import org.onap.policy.common.utils.validation.Assertions;
47 import org.onap.policy.common.utils.validation.ParameterValidationUtils;
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.PfUtils;
53 import org.onap.policy.models.base.PfValidationMessage;
54 import org.onap.policy.models.base.PfValidationResult;
55 import org.onap.policy.models.base.PfValidationResult.ValidationResult;
56 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
57
58 /**
59  * Class to represent the policy in TOSCA definition.
60  *
61  * @author Chenfei Gao (cgao@research.att.com)
62  * @author Liam Fallon (liam.fallon@est.tech)
63  */
64 @Entity
65 @Table(name = "ToscaPolicy")
66 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
67 @Data
68 @EqualsAndHashCode(callSuper = true)
69 public class JpaToscaPolicy extends JpaToscaEntityType<ToscaPolicy> implements PfAuthorative<ToscaPolicy> {
70     private static final long serialVersionUID = 3265174757061982805L;
71
72     // @formatter:off
73     @Column
74     @AttributeOverrides({
75         @AttributeOverride(name = "name",
76                            column = @Column(name = "type_name")),
77         @AttributeOverride(name = "version",
78                            column = @Column(name = "type_version"))
79         })
80     private PfConceptKey type;
81
82     @ElementCollection
83     @Lob
84     private Map<String, String> properties;
85
86     @ElementCollection
87     private List<PfConceptKey> targets;
88     // @formatter:on
89
90     /**
91      * The Default Constructor creates a {@link JpaToscaPolicy} object with a null key.
92      */
93     public JpaToscaPolicy() {
94         this(new PfConceptKey());
95     }
96
97     /**
98      * The Key Constructor creates a {@link JpaToscaPolicy} object with the given concept key.
99      *
100      * @param key the key
101      */
102     public JpaToscaPolicy(@NonNull final PfConceptKey key) {
103         this(key, new PfConceptKey());
104     }
105
106     /**
107      * The full Constructor creates a {@link JpaToscaPolicy} object with all mandatory fields.
108      *
109      * @param key the key
110      * @param type the type of the policy
111      */
112     public JpaToscaPolicy(@NonNull final PfConceptKey key, @NonNull final PfConceptKey type) {
113         super(key);
114         this.type = type;
115     }
116
117     /**
118      * Copy constructor.
119      *
120      * @param copyConcept the concept to copy from
121      */
122     public JpaToscaPolicy(@NonNull final JpaToscaPolicy copyConcept) {
123         super(copyConcept);
124     }
125
126     /**
127      * Authorative constructor.
128      *
129      * @param authorativeConcept the authorative concept to copy from
130      */
131     public JpaToscaPolicy(final ToscaPolicy authorativeConcept) {
132         this.fromAuthorative(authorativeConcept);
133     }
134
135     @Override
136     public ToscaPolicy toAuthorative() {
137         ToscaPolicy toscaPolicy = new ToscaPolicy();
138         super.setToscaEntity(toscaPolicy);
139         super.toAuthorative();
140
141         toscaPolicy.setType(type.getName());
142
143         if (!PfKey.NULL_KEY_VERSION.equals(type.getVersion())) {
144             toscaPolicy.setTypeVersion(type.getVersion());
145         }
146         else {
147             toscaPolicy.setTypeVersion(null);
148         }
149
150         if (properties != null) {
151             Map<String, Object> propertyMap = new LinkedHashMap<>();
152
153             for (Entry<String, String> entry : properties.entrySet()) {
154                 propertyMap.put(entry.getKey(), entry.getValue());
155             }
156
157             toscaPolicy.setProperties(propertyMap);
158         }
159
160         return toscaPolicy;
161     }
162
163     @Override
164     public void fromAuthorative(@NonNull final ToscaPolicy toscaPolicy) {
165         super.fromAuthorative(toscaPolicy);
166
167         type.setName(toscaPolicy.getType());
168         type.setVersion(toscaPolicy.getTypeVersion());
169         if (type.getVersion() == null) {
170             type.setVersion(PfKey.NULL_KEY_VERSION);
171         }
172
173         if (toscaPolicy.getProperties() != null) {
174             properties = new LinkedHashMap<>();
175
176             for (Entry<String, Object> propertyEntry : toscaPolicy.getProperties().entrySet()) {
177                 // TODO: This is a HACK, we need to validate the properties against their
178                 // TODO: their data type in their policy type definition in TOSCA, which means reading
179                 // TODO: the policy type from the database and parsing the property value object correctly
180                 // TODO: Here we are simply serializing the property value into a string and storing it
181                 // TODO: unvalidated into the database
182                 properties.put(propertyEntry.getKey(), propertyEntry.getValue().toString());
183             }
184         }
185     }
186
187     @Override
188     public List<PfKey> getKeys() {
189         final List<PfKey> keyList = super.getKeys();
190
191         keyList.addAll(type.getKeys());
192
193         if (targets != null) {
194             keyList.addAll(targets);
195         }
196
197         return keyList;
198     }
199
200     @Override
201     public void clean() {
202         super.clean();
203
204         type.clean();
205
206         if (targets != null) {
207             for (PfConceptKey target : targets) {
208                 target.clean();
209             }
210         }
211     }
212
213     @Override
214     public PfValidationResult validate(@NonNull final PfValidationResult resultIn) {
215         PfValidationResult result = super.validate(resultIn);
216
217         if (type == null || type.isNullKey()) {
218             result.addValidationMessage(new PfValidationMessage(type, this.getClass(), ValidationResult.INVALID,
219                     "type is null or a null key"));
220         } else {
221             result = type.validate(result);
222         }
223
224         if (properties != null) {
225             result = validateProperties(result);
226         }
227
228         if (targets != null) {
229             result = validateTargets(result);
230         }
231
232         return result;
233     }
234
235     /**
236      * Validate the policy properties.
237      *
238      * @param result The result of validations up to now
239      * @return the validation result
240      */
241     private PfValidationResult validateProperties(@NonNull final PfValidationResult resultIn) {
242         PfValidationResult result = resultIn;
243
244         for (Entry<String, String> propertyEntry : properties.entrySet()) {
245             if (!ParameterValidationUtils.validateStringParameter(propertyEntry.getKey())) {
246                 result.addValidationMessage(new PfValidationMessage(getKey(), this.getClass(), ValidationResult.INVALID,
247                         "policy property key may not be null "));
248             } else if (propertyEntry.getValue() == null) {
249                 result.addValidationMessage(new PfValidationMessage(getKey(), this.getClass(), ValidationResult.INVALID,
250                         "policy property value may not be null "));
251             }
252         }
253         return result;
254     }
255
256     /**
257      * Validate the policy targets.
258      *
259      * @param result The result of validations up to now
260      * @return the validation result
261      */
262     private PfValidationResult validateTargets(final PfValidationResult resultIn) {
263         PfValidationResult result = resultIn;
264
265         for (PfConceptKey target : targets) {
266             if (target == null) {
267                 result.addValidationMessage(new PfValidationMessage(getKey(), this.getClass(), ValidationResult.INVALID,
268                         "policy target may not be null "));
269             } else {
270                 result = target.validate(result);
271             }
272         }
273         return result;
274     }
275
276     @Override
277     public int compareTo(final PfConcept otherConcept) {
278         if (otherConcept == null) {
279             return -1;
280         }
281
282         if (this == otherConcept) {
283             return 0;
284         }
285
286         if (getClass() != otherConcept.getClass()) {
287             return this.hashCode() - otherConcept.hashCode();
288         }
289
290         final JpaToscaPolicy other = (JpaToscaPolicy) otherConcept;
291         if (!super.equals(other)) {
292             return super.compareTo(other);
293         }
294
295         if (!type.equals(other.type)) {
296             return type.compareTo(other.type);
297         }
298
299         int retVal = PfUtils.compareObjects(properties, other.properties);
300         if (retVal != 0) {
301             return retVal;
302         }
303
304         return PfUtils.compareObjects(targets, other.targets);
305     }
306
307     @Override
308     public PfConcept copyTo(@NonNull PfConcept target) {
309         final Object copyObject = target;
310         Assertions.instanceOf(copyObject, PfConcept.class);
311
312         final JpaToscaPolicy copy = ((JpaToscaPolicy) copyObject);
313         super.copyTo(target);
314
315         copy.setType(new PfConceptKey(type));
316
317         if (properties == null) {
318             copy.setProperties(null);
319         } else {
320             copy.setProperties(properties);
321         }
322
323         if (targets == null) {
324             copy.setTargets(null);
325         } else {
326             final List<PfConceptKey> newTargets = new ArrayList<>();
327             for (final PfConceptKey oldTarget : targets) {
328                 newTargets.add(new PfConceptKey(oldTarget));
329             }
330             copy.setTargets(newTargets);
331         }
332
333         return copy;
334     }
335 }