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;
22 import com.fasterxml.jackson.core.type.TypeReference;
23 import com.fasterxml.jackson.databind.ObjectMapper;
24 import java.io.IOException;
25 import java.text.ParseException;
26 import java.text.SimpleDateFormat;
27 import java.util.List;
28 import java.util.Locale;
30 import java.util.regex.Matcher;
31 import java.util.regex.Pattern;
32 import lombok.AllArgsConstructor;
34 import org.openecomp.sdc.be.model.tosca.constraints.ConstraintUtil;
35 import org.openecomp.sdc.be.model.tosca.constraints.exception.ConstraintValueDoNotMatchPropertyTypeException;
36 import org.openecomp.sdc.be.model.tosca.validators.TimestampValidator;
39 * The primitive type that TOSCA YAML supports.
44 public enum ToscaType {
50 TIMESTAMP("timestamp"),
55 SCALAR_UNIT("scalar-unit"),
56 SCALAR_UNIT_SIZE("scalar-unit.size"),
57 SCALAR_UNIT_TIME("scalar-unit.time"),
58 SCALAR_UNIT_BITRATE("scalar-unit.bitrate"),
59 SCALAR_UNIT_FREQUENCY("scalar-unit.frequency");
62 private static final String SCALAR_UNIT_BITRATE_PATTERN = "(^[0-9]+\\.?[0-9]*) ?([TtGgMmKk]?i?[Bb]ps)$";
63 private static final String SCALAR_UNIT_TIME_PATTERN = "(^[0-9]+\\.?[0-9]*) ?([mun]?[dhms])$";
64 private static final String SCALAR_UNIT_SIZE_PATTERN = "(^[0-9]+\\.?[0-9]*) ?([TtGgMmKk]?i?[Bb])$";
65 private static final String SCALAR_UNIT_FREQUENCY_PATTERN = "(^[0-9]+\\.?[0-9]*) ?([kMG]?Hz)$";
66 private static final double B_IN_TiB = Math.pow(1024, 4);
67 private static final double B_IN_GiB = Math.pow(1024, 3);
68 private static final double B_IN_MiB = Math.pow(1024, 2);
69 private static final double B_IN_KiB = Math.pow(1024, 1);
70 private static final double B_IN_TB = Math.pow(1000, 4);
71 private static final double B_IN_GB = Math.pow(1000, 3);
72 private static final double B_IN_MB = Math.pow(1000, 2);
73 private static final double B_IN_KB = Math.pow(1000, 1);
76 private final String type;
78 public static ToscaType getToscaType(String typeName) {
79 if (typeName == null) {
82 for (ToscaType type : ToscaType.values()) {
83 if (type.getType().equals(typeName)) {
90 public static boolean isPrimitiveType(String dataTypeName) {
91 if (!ToscaPropertyType.MAP.getType().equals(dataTypeName) && !ToscaPropertyType.LIST.getType().equals(dataTypeName)) {
92 return isValidType(dataTypeName) != null;
97 public static ToscaType isValidType(String typeName) {
98 if (typeName == null) {
101 for (ToscaType type : ToscaType.values()) {
102 if (type.getType().equals(typeName)) {
109 public static boolean isCollectionType(String type) {
110 return ToscaPropertyType.MAP.getType().equals(type) || ToscaPropertyType.LIST.getType().equals(type);
113 public boolean isValueTypeValid(Object value) {
116 return value.equals(true) || value.equals(false);
118 return value instanceof Float;
121 return value instanceof Integer;
123 case SCALAR_UNIT_SIZE:
124 case SCALAR_UNIT_TIME:
125 case SCALAR_UNIT_BITRATE:
126 case SCALAR_UNIT_FREQUENCY:
129 return value instanceof String;
139 public boolean isValidValue(String value) {
142 return value.equalsIgnoreCase("true") || value.equalsIgnoreCase("false");
144 return isFloat(value);
146 return isInteger(value);
147 case SCALAR_UNIT_SIZE:
148 return isScalarUnitSize(value);
149 case SCALAR_UNIT_TIME:
150 return isScalarUnitTime(value);
151 case SCALAR_UNIT_BITRATE:
152 return isScalarUnitBitrate(value);
153 case SCALAR_UNIT_FREQUENCY:
154 return isScalarUnitFrequency(value);
158 return TimestampValidator.getInstance().isValid(value, null);
160 return VersionUtil.isValid(value);
162 return isList(value);
171 private boolean isList(String value) {
172 ObjectMapper objectMapper = new ObjectMapper();
174 objectMapper.readValue(value, new TypeReference<List<Object>>() {
176 } catch (IOException e) {
182 private boolean isMap(String value) {
183 ObjectMapper objectMapper = new ObjectMapper();
185 objectMapper.readValue(value, new TypeReference<Map<String, Object>>() {
187 } catch (IOException e) {
193 private boolean isFloat(String value) {
195 Float.valueOf(value);
196 } catch (NumberFormatException e) {
202 private boolean isInteger(String value) {
205 } catch (NumberFormatException e) {
211 public Object convert(String value) {
215 case SCALAR_UNIT_TIME:
216 return convertScalarUnitTime(value);
217 case SCALAR_UNIT_BITRATE:
218 return convertScalarUnitBitrate(value);
219 case SCALAR_UNIT_SIZE:
220 return convertScalarUnitSize(value);
221 case SCALAR_UNIT_FREQUENCY:
222 return convertScalarUnitFrequency(value);
224 return Boolean.valueOf(value);
226 return Float.valueOf(value);
229 return Long.valueOf(value);
232 return new SimpleDateFormat("MMM dd, yyyy hh:mm:ss a", Locale.US).parse(value);
233 } catch (ParseException e) {
234 throw new IllegalArgumentException("Value must be a valid timestamp", e);
237 return VersionUtil.parseVersion(value);
240 return ConstraintUtil.parseToCollection(value, new TypeReference<List<Object>>() {
242 } catch (ConstraintValueDoNotMatchPropertyTypeException e) {
243 throw new IllegalArgumentException("Value must be a valid List", e);
247 return ConstraintUtil.parseToCollection(value, new TypeReference<Map<String, Object>>() {
249 } catch (ConstraintValueDoNotMatchPropertyTypeException e) {
250 throw new IllegalArgumentException("Value must be a valid Map", e);
258 private Long convertScalarUnitSize(final String value) {
259 final Matcher matcher = Pattern.compile(SCALAR_UNIT_SIZE_PATTERN).matcher(value.trim());
260 if (matcher.find()) {
261 switch (matcher.group(2)) {
263 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_TiB);
265 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_TB);
267 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_GiB);
269 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_GB);
271 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_MiB);
273 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_MB);
275 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_KiB);
277 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_KB);
279 return (long) (Double.parseDouble(matcher.group(1)));
281 throw new IllegalArgumentException("Value must be a valid scalar-unit.size");
284 throw new IllegalArgumentException("Value must be a valid scalar-unit.size");
288 private Long convertScalarUnitTime(final String value) {
289 final Matcher matcher = Pattern.compile(SCALAR_UNIT_TIME_PATTERN).matcher(value.trim());
290 if (matcher.find()) {
291 switch (matcher.group(2)) {
293 return (long) (Double.parseDouble(matcher.group(1)) * 24 * 60 * 60 * 1_000_000_000L); // 24hours * 60minutes * 60seconds
295 return (long) (Double.parseDouble(matcher.group(1)) * 60 * 60 * 1_000_000_000L); // 60minutes * 60seconds
297 return (long) (Double.parseDouble(matcher.group(1)) * 60 * 1_000_000_000L); // 60seconds
299 return (long) (Double.parseDouble(matcher.group(1)) * 1_000_000_000L);
301 return (long) (Double.parseDouble(matcher.group(1)) * 1_000_000L);
303 return (long) (Double.parseDouble(matcher.group(1)) * 1_000L);
305 return (long) (Double.parseDouble(matcher.group(1)));
307 throw new IllegalArgumentException("Value must be a valid scalar-unit.time");
310 throw new IllegalArgumentException("Value must be a valid scalar-unit.time");
314 private Long convertScalarUnitFrequency(final String value) {
315 final Matcher matcher = Pattern.compile(SCALAR_UNIT_FREQUENCY_PATTERN).matcher(value.trim());
316 if (matcher.find()) {
317 switch (matcher.group(2)) {
319 return (long) (Double.parseDouble(matcher.group(1)) * 1_000_000_000L);
321 return (long) (Double.parseDouble(matcher.group(1)) * 1_000_000L);
323 return (long) (Double.parseDouble(matcher.group(1)) * 1_000L);
325 return (long) (Double.parseDouble(matcher.group(1)));
327 throw new IllegalArgumentException("Value must be a valid scalar-unit.frequency");
330 throw new IllegalArgumentException("Value must be a valid scalar-unit.frequency");
334 private Long convertScalarUnitBitrate(final String value) {
335 final Matcher matcher = Pattern.compile(SCALAR_UNIT_BITRATE_PATTERN).matcher(value.trim());
336 if (matcher.find()) {
337 switch (matcher.group(2)) {
339 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_TiB);
341 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_TB);
343 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_GiB);
345 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_GB);
347 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_MiB);
349 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_MB);
351 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_KiB);
353 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_KB);
355 return (long) (Double.parseDouble(matcher.group(1)) * 8);
357 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_TiB);
359 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_TB);
361 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_GiB);
363 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_GB);
365 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_MiB);
367 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_MB);
369 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_KiB);
371 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_KB);
373 return (long) (Double.parseDouble(matcher.group(1)));
375 throw new IllegalArgumentException("Value must be a valid scalar-unit.bitrate");
378 throw new IllegalArgumentException("Value must be a valid scalar-unit.bitrate");
382 private boolean isScalarUnitBitrate(final String value) {
383 return Pattern.compile(SCALAR_UNIT_BITRATE_PATTERN).matcher(value.trim()).find();
386 private boolean isScalarUnitSize(final String value) {
387 return Pattern.compile(SCALAR_UNIT_SIZE_PATTERN).matcher(value.trim()).find();
390 private boolean isScalarUnitTime(final String value) {
391 return Pattern.compile(SCALAR_UNIT_TIME_PATTERN).matcher(value.trim()).find();
394 private boolean isScalarUnitFrequency(final String value) {
395 return Pattern.compile(SCALAR_UNIT_FREQUENCY_PATTERN).matcher(value.trim()).find();