4120c6994c53760fa80bd79a97e9129b144637b2
[sdc.git] /
1 package org.openecomp.core.impl;
2
3 import org.apache.commons.lang.StringUtils;
4 import org.codehaus.jackson.map.ObjectMapper;
5 import org.openecomp.core.converter.errors.CreateToscaObjectErrorBuilder;
6 import org.openecomp.core.utilities.json.JsonUtil;
7 import org.openecomp.sdc.common.errors.CoreException;
8 import org.openecomp.sdc.common.errors.ErrorCategory;
9 import org.openecomp.sdc.common.errors.ErrorCode;
10
11 import java.lang.reflect.Field;
12 import java.util.Map;
13 import java.util.Objects;
14 import java.util.Optional;
15
16 public class ToscaConverterUtil {
17   private static final String set = "set";
18
19   public static <T> Optional<T> createObjectFromClass(String objectId,
20                                        Object objectCandidate,
21                                        Class<T> classToCreate) {
22     try {
23       return createObjectUsingSetters(objectCandidate, classToCreate);
24     } catch (Exception e) {
25       throw new CoreException(
26           new CreateToscaObjectErrorBuilder(classToCreate.getSimpleName(), objectId, e.getMessage())
27               .build());
28     }
29   }
30
31   private static <T> Optional<T> createObjectUsingSetters(Object objectCandidate,
32                                                           Class<T> classToCreate) throws Exception {
33     if(!(objectCandidate instanceof Map)){
34       return Optional.empty();
35     }
36
37     Map<String, Object> objectAsMap = (Map<String, Object>) objectCandidate;
38     Field[] classFields = classToCreate.getDeclaredFields();
39     T result = classToCreate.newInstance();
40
41     for(Field field : classFields){
42       Object fieldValueToAssign = objectAsMap.get(field.getName());
43       String methodName = set + StringUtils.capitalize(field.getName());
44
45       if(shouldSetterMethodNeedsToGetInvoked(classToCreate, field, fieldValueToAssign, methodName)){
46         classToCreate.getMethod(methodName, field.getType()).invoke(result, fieldValueToAssign);
47       }
48     }
49
50     return Optional.of(result);
51   }
52
53   private static <T> boolean shouldSetterMethodNeedsToGetInvoked(Class<T> classToCreate,
54                                                                  Field field,
55                                                                  Object fieldValueToAssign,
56                                                                  String methodName) {
57
58     try {
59       return Objects.nonNull(fieldValueToAssign)
60           && Objects.nonNull(classToCreate.getMethod(methodName, field.getType()));
61     } catch (NoSuchMethodException e) {
62       return false;
63     }
64   }
65 }