+ private byte[] updateMergingContentFromDependencies(final byte[] mergingContent, final List<Component> dependencies) {
+ final DumperOptions options = new DumperOptions();
+ options.setDefaultFlowStyle(FlowStyle.BLOCK);
+ final Yaml yaml = new Yaml(options);
+ final Map<String, Object> stringObjectMap = (Map<String, Object>) yaml.load(new String(mergingContent));
+ final Map<String, Object> nodeTypes = (Map<String, Object>) stringObjectMap.get("node_types");
+ for (final Component dependency : dependencies) {
+ final Map<String, Object> dependencyAsMap = yaml.load(yaml.dumpAsMap(dependency));
+ final String toscaResourceName = ((ResourceMetadataDataDefinition) dependency.getComponentMetadataDefinition()
+ .getMetadataDataDefinition()).getToscaResourceName();
+ final Map<String, Object> nodeType = (Map<String, Object>) nodeTypes.get(toscaResourceName);
+ final Map<String, Object> propertiesFromDependency = (Map<String, Object>) ((List) dependencyAsMap.get("properties"))
+ .stream().collect(Collectors.toMap(s -> ((Map<String, Object>) s).get("name"), s -> s));
+ if (MapUtils.isNotEmpty(nodeType) && MapUtils.isNotEmpty(propertiesFromDependency)) {
+ final Map<String, Object> propertiesFromMergingContent = (Map<String, Object>) nodeType.get("properties");
+ final Map<String, Object> updatedMap = updatePropertiesFromDependency(propertiesFromMergingContent, propertiesFromDependency);
+ nodeType.replace("properties", updatedMap);
+ nodeTypes.replace(toscaResourceName, nodeType);
+ }
+ }
+ stringObjectMap.replace("node_types", nodeTypes);
+ return yaml.dumpAsMap(stringObjectMap).getBytes();
+ }
+
+ private Map<String, Object> updatePropertiesFromDependency(final Map<String, Object> propertiesFromMergingContent,
+ final Map<String, Object> propertiesFromDependency) {
+ final Map<String, Object> result = new HashMap<>();
+ for (final Entry<String, Object> entry : propertiesFromDependency.entrySet()) {
+ final Map<String, Object> propertiesMap = new HashMap<>();
+ final String key = entry.getKey();
+ final Object value = entry.getValue();
+ if (propertiesFromMergingContent instanceof Map) {
+ final Object object = propertiesFromMergingContent.get(key);
+ if (object instanceof Map) {
+ ((Map<String, Object>) object).keySet().forEach(s ->
+ propertiesMap.put(s, ((Map<String, Object>) value).get(s))
+ );
+ } else {
+ propertiesMap.putAll(createProperties(value));
+ }
+ } else {
+ propertiesMap.putAll(createProperties(value));
+ }
+ result.put(key, propertiesMap);
+ }
+ return result;
+ }
+
+ private Map<String, Object> createProperties(final Object value) {
+ final Map<String, Object> propertiesMap = new HashMap<>();
+ propertiesMap.put("type", ((Map<String, Object>) value).get("type"));
+ propertiesMap.put("required", ((Map<String, Object>) value).get("required"));
+ final Object entrySchema = ((Map<String, Object>) value).get("entry_schema");
+ if (entrySchema != null) {
+ propertiesMap.put("entry_schema", entrySchema);
+ }
+ return propertiesMap;
+ }
+