[SDC] rebase 1710 code
[sdc.git] / common / openecomp-tosca-datatype / src / main / java / org / openecomp / sdc / tosca / services / ToscaExtensionYamlUtil.java
1 package org.openecomp.sdc.tosca.services;
2
3 import org.yaml.snakeyaml.constructor.Constructor;
4 import org.yaml.snakeyaml.introspector.Property;
5 import org.yaml.snakeyaml.introspector.PropertyUtils;
6 import org.yaml.snakeyaml.nodes.MappingNode;
7 import org.yaml.snakeyaml.nodes.NodeId;
8
9 import java.beans.IntrospectionException;
10
11
12 public class ToscaExtensionYamlUtil extends YamlUtil {
13
14   @Override
15   public <T> Constructor getConstructor(Class<T> typClass) {
16     return new ToscaWithHeatExtensionConstructor(typClass);
17   }
18
19   @Override
20   protected PropertyUtils getPropertyUtils() {
21     return new ToscaPropertyUtilsWithHeatExtension();
22   }
23
24   public class ToscaPropertyUtilsWithHeatExtension extends MyPropertyUtils {
25     @Override
26     public Property getProperty(Class<? extends Object> type, String name)
27         throws IntrospectionException {
28       try {
29         if (type
30             .equals(Class.forName("org.openecomp.sdc.tosca.datatypes.model.ParameterDefinition"))) {
31           type = Class
32               .forName("org.openecomp.sdc.tosca.datatypes.model.heatextend.ParameterDefinitionExt");
33         }
34       } catch (ClassNotFoundException ex) {
35         throw new RuntimeException(ex);
36       }
37       return super.getProperty(type, name);
38     }
39   }
40
41   protected class ToscaWithHeatExtensionConstructor extends StrictMapAppenderConstructor {
42     public ToscaWithHeatExtensionConstructor(Class<?> theRoot) {
43       super(theRoot);
44       yamlClassConstructors.put(NodeId.mapping, new MyPersistentObjectConstruct());
45     }
46
47     class MyPersistentObjectConstruct extends Constructor.ConstructMapping {
48       @Override
49       protected Object constructJavaBean2ndStep(MappingNode node, Object object) {
50         Class type = node.getType();
51         try {
52           if (type.equals(
53               Class.forName("org.openecomp.sdc.tosca.datatypes.model.ParameterDefinition"))) {
54             Class extendHeatClass = Class.forName(
55                 "org.openecomp.sdc.tosca.datatypes.model.heatextend.ParameterDefinitionExt");
56             Object extendHeatObject = extendHeatClass.newInstance();
57             // create JavaBean
58             return super.constructJavaBean2ndStep(node, extendHeatObject);
59           } else {
60             // create JavaBean
61             return super.constructJavaBean2ndStep(node, object);
62           }
63         } catch (ClassNotFoundException | InstantiationException | IllegalAccessException ex) {
64           throw new RuntimeException(ex);
65         }
66       }
67     }
68   }
69 }