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.Arrays;
28 import java.util.List;
29 import java.util.Locale;
31 import java.util.regex.Matcher;
32 import java.util.regex.Pattern;
33 import java.util.stream.Collectors;
34 import lombok.AllArgsConstructor;
36 import org.openecomp.sdc.be.model.tosca.constraints.ConstraintUtil;
37 import org.openecomp.sdc.be.model.tosca.constraints.exception.ConstraintValueDoNotMatchPropertyTypeException;
38 import org.openecomp.sdc.be.model.tosca.validators.TimestampValidator;
41 * The primitive type that TOSCA YAML supports.
46 public enum ToscaType {
52 TIMESTAMP("timestamp"),
57 SCALAR_UNIT("scalar-unit"),
58 SCALAR_UNIT_SIZE("scalar-unit.size"),
59 SCALAR_UNIT_TIME("scalar-unit.time"),
60 SCALAR_UNIT_BITRATE("scalar-unit.bitrate"),
61 SCALAR_UNIT_FREQUENCY("scalar-unit.frequency");
64 private final String type;
67 private static final List<String> SCALAR_UNIT_BITRATE_VALID_UNITS = Arrays.asList("TiBps", "TBps", "GiBps", "GBps", "MiBps", "MBps", "KiBps", "KBps", "Bps", "Tibps", "Tbps", "Gibps", "Gbps", "Mibps", "Mbps", "Kibps", "Kbps", "bps");
68 private static final String SCALAR_UNIT_BITRATE_PATTERN = "(^[0-9]+\\.?[0-9]*) ?(" + SCALAR_UNIT_BITRATE_VALID_UNITS.stream().collect(Collectors.joining("|")) + ")$";
69 private static final List<String> SCALAR_UNIT_TIME_VALID_UNITS = Arrays.asList("d", "h", "m", "s", "ms", "us", "ns");
70 private static final String SCALAR_UNIT_TIME_PATTERN = "(^[0-9]+\\.?[0-9]*) ?(" + SCALAR_UNIT_TIME_VALID_UNITS.stream().collect(Collectors.joining("|")) + ")$";
71 private static final List<String> SCALAR_UNIT_SIZE_VALID_UNITS = Arrays.asList("TiB", "TB", "GiB", "GB", "MiB", "MB", "KiB", "kB", "B");
72 private static final String SCALAR_UNIT_SIZE_PATTERN = "(^[0-9]+\\.?[0-9]*) ?(" + SCALAR_UNIT_SIZE_VALID_UNITS.stream().collect(Collectors.joining("|")) + ")$";
73 private static final List<String> SCALAR_UNIT_FREQUENCY_VALID_UNITS = Arrays.asList("GHz", "MHz", "kHz", "Hz");
74 private static final String SCALAR_UNIT_FREQUENCY_PATTERN = "(^[0-9]+\\.?[0-9]*) ?(" + SCALAR_UNIT_FREQUENCY_VALID_UNITS.stream().collect(Collectors.joining("|")) + ")$";
76 private static final double B_IN_TiB = Math.pow(1024, 4);
77 private static final double B_IN_GiB = Math.pow(1024, 3);
78 private static final double B_IN_MiB = Math.pow(1024, 2);
79 private static final double B_IN_KiB = Math.pow(1024, 1);
80 private static final double B_IN_TB = Math.pow(1000, 4);
81 private static final double B_IN_GB = Math.pow(1000, 3);
82 private static final double B_IN_MB = Math.pow(1000, 2);
83 private static final double B_IN_KB = Math.pow(1000, 1);
85 public static ToscaType getToscaType(String typeName) {
86 if (typeName == null) {
89 for (ToscaType type : ToscaType.values()) {
90 if (type.getType().equals(typeName)) {
97 public static boolean isPrimitiveType(String dataTypeName) {
98 if (!ToscaPropertyType.MAP.getType().equals(dataTypeName) && !ToscaPropertyType.LIST.getType().equals(dataTypeName)) {
99 return isValidType(dataTypeName) != null;
104 public static ToscaType isValidType(String typeName) {
105 if (typeName == null) {
108 for (ToscaType type : ToscaType.values()) {
109 if (type.getType().equals(typeName)) {
116 public static boolean isCollectionType(String type) {
117 return ToscaPropertyType.MAP.getType().equals(type) || ToscaPropertyType.LIST.getType().equals(type);
120 public boolean isValueTypeValid(Object value) {
123 return value.equals(true) || value.equals(false);
125 return value instanceof Float;
128 return value instanceof Integer;
130 case SCALAR_UNIT_SIZE:
131 case SCALAR_UNIT_TIME:
132 case SCALAR_UNIT_BITRATE:
133 case SCALAR_UNIT_FREQUENCY:
136 return value instanceof String;
146 public boolean isValidValue(String value) {
149 return value.equalsIgnoreCase("true") || value.equalsIgnoreCase("false");
151 return isFloat(value);
153 return isInteger(value);
154 case SCALAR_UNIT_SIZE:
155 return isScalarUnitSize(value);
156 case SCALAR_UNIT_TIME:
157 return isScalarUnitTime(value);
158 case SCALAR_UNIT_BITRATE:
159 return isScalarUnitBitrate(value);
160 case SCALAR_UNIT_FREQUENCY:
161 return isScalarUnitFrequency(value);
165 return TimestampValidator.getInstance().isValid(value, null);
167 return VersionUtil.isValid(value);
169 return isList(value);
178 private boolean isList(String value) {
179 ObjectMapper objectMapper = new ObjectMapper();
181 objectMapper.readValue(value, new TypeReference<List<Object>>() {
183 } catch (IOException e) {
189 private boolean isMap(String value) {
190 ObjectMapper objectMapper = new ObjectMapper();
192 objectMapper.readValue(value, new TypeReference<Map<String, Object>>() {
194 } catch (IOException e) {
200 private boolean isFloat(String value) {
202 Float.valueOf(value);
203 } catch (NumberFormatException e) {
209 private boolean isInteger(String value) {
212 } catch (NumberFormatException e) {
218 public boolean isScalarUnit() {
220 case SCALAR_UNIT_TIME:
221 case SCALAR_UNIT_SIZE:
222 case SCALAR_UNIT_BITRATE:
223 case SCALAR_UNIT_FREQUENCY:
230 public Object convert(String value) {
234 case SCALAR_UNIT_TIME:
235 return convertScalarUnitTime(value);
236 case SCALAR_UNIT_BITRATE:
237 return convertScalarUnitBitrate(value);
238 case SCALAR_UNIT_SIZE:
239 return convertScalarUnitSize(value);
240 case SCALAR_UNIT_FREQUENCY:
241 return convertScalarUnitFrequency(value);
243 return Boolean.valueOf(value);
245 return Float.valueOf(value);
248 return Long.valueOf(value);
251 return new SimpleDateFormat("MMM dd, yyyy hh:mm:ss a", Locale.US).parse(value);
252 } catch (ParseException e) {
253 throw new IllegalArgumentException("Value must be a valid timestamp", e);
256 return VersionUtil.parseVersion(value);
259 return ConstraintUtil.parseToCollection(value, new TypeReference<List<Object>>() {
261 } catch (ConstraintValueDoNotMatchPropertyTypeException e) {
262 throw new IllegalArgumentException("Value must be a valid List", e);
266 return ConstraintUtil.parseToCollection(value, new TypeReference<Map<String, Object>>() {
268 } catch (ConstraintValueDoNotMatchPropertyTypeException e) {
269 throw new IllegalArgumentException("Value must be a valid Map", e);
277 private Long convertScalarUnitSize(final String value) {
278 if (isScalarUnitSize(value)) {
279 final Matcher matcher = Pattern.compile(SCALAR_UNIT_SIZE_PATTERN).matcher(value.trim());
280 if (matcher.find()) {
281 switch (matcher.group(2)) {
283 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_TiB);
285 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_TB);
287 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_GiB);
289 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_GB);
291 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_MiB);
293 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_MB);
295 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_KiB);
297 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_KB);
299 return (long) (Double.parseDouble(matcher.group(1)));
301 throw new IllegalArgumentException("Value must be a valid scalar-unit.size");
304 throw new IllegalArgumentException("Value must be a valid 'scalar-unit.size': " + SCALAR_UNIT_SIZE_VALID_UNITS);
307 throw new IllegalArgumentException("Value must be a valid 'scalar-unit.size': " + SCALAR_UNIT_SIZE_VALID_UNITS);
311 private Long convertScalarUnitTime(final String value) {
312 if (isScalarUnitTime(value)) {
313 final Matcher matcher = Pattern.compile(SCALAR_UNIT_TIME_PATTERN).matcher(value.trim());
314 if (matcher.find()) {
315 switch (matcher.group(2)) {
317 return (long) (Double.parseDouble(matcher.group(1)) * 24 * 60 * 60 * 1_000_000_000L); // 24hours * 60minutes * 60seconds
319 return (long) (Double.parseDouble(matcher.group(1)) * 60 * 60 * 1_000_000_000L); // 60minutes * 60seconds
321 return (long) (Double.parseDouble(matcher.group(1)) * 60 * 1_000_000_000L); // 60seconds
323 return (long) (Double.parseDouble(matcher.group(1)) * 1_000_000_000L);
325 return (long) (Double.parseDouble(matcher.group(1)) * 1_000_000L);
327 return (long) (Double.parseDouble(matcher.group(1)) * 1_000L);
329 return (long) (Double.parseDouble(matcher.group(1)));
331 throw new IllegalArgumentException("Value must be a valid scalar-unit.time");
334 throw new IllegalArgumentException("Value must be a valid 'scalar-unit.time':" + SCALAR_UNIT_TIME_VALID_UNITS);
337 throw new IllegalArgumentException("Value must be a valid 'scalar-unit.time':" + SCALAR_UNIT_TIME_VALID_UNITS);
341 private Long convertScalarUnitFrequency(final String value) {
342 if (isScalarUnitFrequency(value)) {
343 final Matcher matcher = Pattern.compile(SCALAR_UNIT_FREQUENCY_PATTERN).matcher(value.trim());
344 if (matcher.find()) {
345 switch (matcher.group(2)) {
347 return (long) (Double.parseDouble(matcher.group(1)) * 1_000_000_000L);
349 return (long) (Double.parseDouble(matcher.group(1)) * 1_000_000L);
351 return (long) (Double.parseDouble(matcher.group(1)) * 1_000L);
353 return (long) (Double.parseDouble(matcher.group(1)));
355 throw new IllegalArgumentException("Value must be a valid scalar-unit.frequency");
358 throw new IllegalArgumentException("Value must be a valid 'scalar-unit.frequency':" + SCALAR_UNIT_FREQUENCY_VALID_UNITS);
361 throw new IllegalArgumentException("Value must be a valid 'scalar-unit.frequency':" + SCALAR_UNIT_FREQUENCY_VALID_UNITS);
365 private Long convertScalarUnitBitrate(final String value) {
366 if (isScalarUnitBitrate(value)) {
367 final Matcher matcher = Pattern.compile(SCALAR_UNIT_BITRATE_PATTERN).matcher(value.trim());
368 if (matcher.find()) {
369 switch (matcher.group(2)) {
371 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_TiB);
373 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_TB);
375 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_GiB);
377 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_GB);
379 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_MiB);
381 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_MB);
383 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_KiB);
385 return (long) (Double.parseDouble(matcher.group(1)) * 8 * B_IN_KB);
387 return (long) (Double.parseDouble(matcher.group(1)) * 8);
389 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_TiB);
391 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_TB);
393 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_GiB);
395 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_GB);
397 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_MiB);
399 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_MB);
401 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_KiB);
403 return (long) (Double.parseDouble(matcher.group(1)) * B_IN_KB);
405 return (long) (Double.parseDouble(matcher.group(1)));
407 throw new IllegalArgumentException("Value must be a valid scalar-unit.bitrate");
410 throw new IllegalArgumentException("Value must be a valid 'scalar-unit.bitrate':" + SCALAR_UNIT_BITRATE_VALID_UNITS);
413 throw new IllegalArgumentException("Value must be a valid 'scalar-unit.bitrate':" + SCALAR_UNIT_BITRATE_VALID_UNITS);
417 private boolean isScalarUnitBitrate(final String value) {
418 final Matcher matcher = Pattern.compile(SCALAR_UNIT_BITRATE_PATTERN).matcher(value.trim());
419 return matcher.find() && SCALAR_UNIT_BITRATE_VALID_UNITS.contains(matcher.group(2));
422 private boolean isScalarUnitSize(final String value) {
423 final Matcher matcher = Pattern.compile(SCALAR_UNIT_SIZE_PATTERN).matcher(value.trim());
424 return matcher.find() && SCALAR_UNIT_SIZE_VALID_UNITS.contains(matcher.group(2));
427 private boolean isScalarUnitTime(final String value) {
428 final Matcher matcher = Pattern.compile(SCALAR_UNIT_TIME_PATTERN).matcher(value.trim());
429 return matcher.find() && SCALAR_UNIT_TIME_VALID_UNITS.contains(matcher.group(2));
432 private boolean isScalarUnitFrequency(final String value) {
433 final Matcher matcher = Pattern.compile(SCALAR_UNIT_FREQUENCY_PATTERN).matcher(value.trim());
434 return matcher.find() && SCALAR_UNIT_FREQUENCY_VALID_UNITS.contains(matcher.group(2));
437 public String getValidValues() {
439 case SCALAR_UNIT_TIME:
440 return String.valueOf(SCALAR_UNIT_TIME_VALID_UNITS);
441 case SCALAR_UNIT_SIZE:
442 return String.valueOf(SCALAR_UNIT_SIZE_VALID_UNITS);
443 case SCALAR_UNIT_BITRATE:
444 return String.valueOf(SCALAR_UNIT_BITRATE_VALID_UNITS);
445 case SCALAR_UNIT_FREQUENCY:
446 return String.valueOf(SCALAR_UNIT_FREQUENCY_VALID_UNITS);