VFC Property default value enforced forced to comply with restraints
[sdc.git] / catalog-model / src / main / java / org / openecomp / sdc / be / model / tosca / constraints / ConstraintUtil.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
4  * ================================================================================
5  * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6  * ================================================================================
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  * ============LICENSE_END=========================================================
19  */
20 package org.openecomp.sdc.be.model.tosca.constraints;
21
22 import com.fasterxml.jackson.core.type.TypeReference;
23 import com.fasterxml.jackson.databind.ObjectMapper;
24 import java.beans.IntrospectionException;
25 import java.beans.Introspector;
26 import java.beans.PropertyDescriptor;
27 import java.io.IOException;
28 import java.lang.reflect.InvocationTargetException;
29 import lombok.AccessLevel;
30 import lombok.AllArgsConstructor;
31 import lombok.NoArgsConstructor;
32 import org.openecomp.sdc.be.model.tosca.ToscaType;
33 import org.openecomp.sdc.be.model.tosca.constraints.exception.ConstraintValueDoNotMatchPropertyTypeException;
34 import org.slf4j.Logger;
35 import org.slf4j.LoggerFactory;
36
37 /**
38  * Utility class to validate constraints types.
39  */
40 @NoArgsConstructor(access = AccessLevel.PRIVATE)
41 public final class ConstraintUtil {
42
43     private static final Logger logger = LoggerFactory.getLogger(ConstraintUtil.class);
44
45     /**
46      * Validates that the {@link ToscaType} specified is a {@link ToscaType#STRING}.
47      *
48      * @param propertyType The property tosca type.
49      * @throws ConstraintValueDoNotMatchPropertyTypeException In case the type is not {@link ToscaType#STRING}.
50      */
51     public static void checkStringType(ToscaType propertyType) throws ConstraintValueDoNotMatchPropertyTypeException {
52         if (ToscaType.STRING != propertyType) {
53             throw new ConstraintValueDoNotMatchPropertyTypeException("Invalid property type <" + propertyType.toString() + ">");
54         }
55     }
56     
57     public static boolean isComparableType(final ToscaType propertyType)  {
58         final ToscaType toscaType = ToscaType.getToscaType(propertyType.getType());
59         switch (toscaType) {
60             case FLOAT:
61             case DOUBLE:
62             case INTEGER:
63             case LONG:
64             case TIMESTAMP:
65             case VERSION:
66             case STRING:
67             case SCALAR_UNIT_SIZE:
68             case SCALAR_UNIT_TIME:
69             case SCALAR_UNIT_BITRATE:
70             case SCALAR_UNIT_FREQUENCY:
71                 return true;
72             default:
73                 return false;
74         }
75     }
76
77     /**
78      * Verify that the given tosca type is supported for comparison
79      *
80      * @param propertyType the tosca type to check
81      * @throws ConstraintValueDoNotMatchPropertyTypeException if the property type cannot be compared
82      */
83     public static void checkComparableType(final ToscaType propertyType) throws ConstraintValueDoNotMatchPropertyTypeException {
84         if (!isComparableType(propertyType) && !ToscaType.BOOLEAN.equals(propertyType)) {
85             throw new ConstraintValueDoNotMatchPropertyTypeException("Constraint is invalid for property type <" + propertyType.getType() + ">");
86         }
87     }
88
89     /**
90      * Convert a string value following its type throw exception if it cannot be converted to a comparable
91      *
92      * @param propertyType the type of the property
93      * @param value        the value to convert
94      * @return the converted comparable
95      * @throws ConstraintValueDoNotMatchPropertyTypeException if the converted value is not a comparable
96      */
97     @SuppressWarnings("rawtypes")
98     public static Comparable convertToComparable(ToscaType propertyType, String value) {
99         final Object comparableObj = propertyType.convert(value);
100         if (!(comparableObj instanceof Comparable)) {
101             throw new IllegalArgumentException("Try to convert a value of a type which is not comparable [" + propertyType + "] to Comparable");
102         } else {
103             return (Comparable) comparableObj;
104         }
105     }
106
107     public static ConstraintInformation getConstraintInformation(Object constraint) throws IntrospectionException {
108         PropertyDescriptor firstDescriptor = null;
109         for (final PropertyDescriptor propertyDescriptor : Introspector.getBeanInfo(constraint.getClass()).getPropertyDescriptors()) {
110             if (propertyDescriptor.getReadMethod() != null && propertyDescriptor.getWriteMethod() != null) {
111                 firstDescriptor = propertyDescriptor;
112                 break;
113             }
114         }
115         if (firstDescriptor == null) {
116             throw new IntrospectionException("Cannot find constraint name");
117         }
118         try {
119             return new ConstraintInformation(firstDescriptor.getName(), firstDescriptor.getReadMethod().invoke(constraint), null, null);
120         } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
121             throw new IntrospectionException("Cannot retrieve constraint reference " + e.getMessage());
122         }
123     }
124
125     public static <T> T parseToCollection(String value, TypeReference<T> typeReference) throws ConstraintValueDoNotMatchPropertyTypeException {
126         T objectMap;
127         ObjectMapper objectMapper = new ObjectMapper();
128         try {
129             objectMap = objectMapper.readValue(value, typeReference);
130         } catch (IOException e) {
131             logger.error(e.getMessage(), e);
132             throw new ConstraintValueDoNotMatchPropertyTypeException("The value [" + value + "] is not valid");
133         }
134         return objectMap;
135     }
136
137     @AllArgsConstructor
138     public static class ConstraintInformation {
139
140         private final String name;
141         private final Object reference;
142         private final String value;
143         private final String type;
144     }
145 }