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 org.openecomp.sdc.be.model.tosca.ToscaType;
30 import org.openecomp.sdc.be.model.tosca.constraints.exception.ConstraintValueDoNotMatchPropertyTypeException;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
35 * Utility class to validate constraints types.
37 public final class ConstraintUtil {
39 private static final Logger logger = LoggerFactory.getLogger(ConstraintUtil.class);
41 private ConstraintUtil() {
45 * Validates that the {@link ToscaType} specified is a {@link ToscaType#STRING}.
47 * @param propertyType The property tosca type.
48 * @throws ConstraintValueDoNotMatchPropertyTypeException In case the type is not {@link ToscaType#STRING}.
50 public static void checkStringType(ToscaType propertyType) throws ConstraintValueDoNotMatchPropertyTypeException {
51 if (ToscaType.STRING != propertyType) {
52 throw new ConstraintValueDoNotMatchPropertyTypeException("Invalid property type <" + propertyType.toString() + ">");
57 * Verify that the given tosca type is supported for comparison
59 * @param propertyType the tosca type to check
60 * @throws ConstraintValueDoNotMatchPropertyTypeException if the property type cannot be compared
62 public static void checkComparableType(ToscaType propertyType) throws ConstraintValueDoNotMatchPropertyTypeException {
63 // The validity of the value is already assured by us with our
65 // ToscaType.convert() method
67 // here we just want to check that the constraint is not used on
69 // unsupported type as boolean
70 switch (propertyType) {
78 throw new ConstraintValueDoNotMatchPropertyTypeException("Constraint is invalid for property type <" + propertyType.toString() + ">");
80 throw new ConstraintValueDoNotMatchPropertyTypeException("Invalid property type <" + propertyType.toString() + ">");
85 * Convert a string value following its type throw exception if it cannot be converted to a comparable
87 * @param propertyType the type of the property
88 * @param value the value to convert
89 * @return the converted comparable
90 * @throws ConstraintValueDoNotMatchPropertyTypeException if the converted value is not a comparable
92 @SuppressWarnings("rawtypes")
93 public static Comparable convertToComparable(ToscaType propertyType, String value) {
94 Object comparableObj = propertyType.convert(value);
95 if (!(comparableObj instanceof Comparable)) {
96 throw new IllegalArgumentException("Try to convert a value of a type which is not comparable [" + propertyType + "] to Comparable");
98 return (Comparable) comparableObj;
102 public static ConstraintInformation getConstraintInformation(Object constraint) throws IntrospectionException {
103 PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(constraint.getClass()).getPropertyDescriptors();
104 PropertyDescriptor firstDescriptor = null;
105 for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
106 if (propertyDescriptor.getReadMethod() != null && propertyDescriptor.getWriteMethod() != null) {
107 firstDescriptor = propertyDescriptor;
111 if (firstDescriptor == null) {
112 throw new IntrospectionException("Cannot find constraint name");
115 return new ConstraintInformation(firstDescriptor.getName(), firstDescriptor.getReadMethod().invoke(constraint), null, null);
116 } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
117 throw new IntrospectionException("Cannot retrieve constraint reference " + e.getMessage());
121 public static <T> T parseToCollection(String value, TypeReference<T> typeReference) throws ConstraintValueDoNotMatchPropertyTypeException {
123 ObjectMapper objectMapper = new ObjectMapper();
125 objectMap = objectMapper.readValue(value, typeReference);
126 } catch (IOException e) {
127 logger.error(e.getMessage(), e);
128 throw new ConstraintValueDoNotMatchPropertyTypeException("The value [" + value + "] is not valid");
133 public static class ConstraintInformation {
136 private Object reference;
137 private String value;
140 public ConstraintInformation(String name, Object reference, String value, String type) {
142 this.reference = reference;