2 * ============LICENSE_START=======================================================
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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=========================================================
20 package org.openecomp.sdc.be.model.tosca.constraints;
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;
38 * Utility class to validate constraints types.
40 @NoArgsConstructor(access = AccessLevel.PRIVATE)
41 public final class ConstraintUtil {
43 private static final Logger logger = LoggerFactory.getLogger(ConstraintUtil.class);
46 * Validates that the {@link ToscaType} specified is a {@link ToscaType#STRING}.
48 * @param propertyType The property tosca type.
49 * @throws ConstraintValueDoNotMatchPropertyTypeException In case the type is not {@link ToscaType#STRING}.
51 public static void checkStringType(ToscaType propertyType) throws ConstraintValueDoNotMatchPropertyTypeException {
52 if (ToscaType.STRING != propertyType) {
53 throw new ConstraintValueDoNotMatchPropertyTypeException("Invalid property type <" + propertyType.toString() + ">");
57 public static boolean isComparableType(final ToscaType propertyType) {
58 final ToscaType toscaType = ToscaType.getToscaType(propertyType.getType());
67 case SCALAR_UNIT_SIZE:
68 case SCALAR_UNIT_TIME:
69 case SCALAR_UNIT_BITRATE:
70 case SCALAR_UNIT_FREQUENCY:
78 * Verify that the given tosca type is supported for comparison
80 * @param propertyType the tosca type to check
81 * @throws ConstraintValueDoNotMatchPropertyTypeException if the property type cannot be compared
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() + ">");
90 * Convert a string value following its type throw exception if it cannot be converted to a comparable
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
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");
103 return (Comparable) comparableObj;
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;
115 if (firstDescriptor == null) {
116 throw new IntrospectionException("Cannot find constraint name");
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());
125 public static <T> T parseToCollection(String value, TypeReference<T> typeReference) throws ConstraintValueDoNotMatchPropertyTypeException {
127 ObjectMapper objectMapper = new ObjectMapper();
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");
138 public static class ConstraintInformation {
140 private final String name;
141 private final Object reference;
142 private final String value;
143 private final String type;