From cfa6730c173bf9e3ec3edda09e98baf7188c4493 Mon Sep 17 00:00:00 2001 From: Yavor16 Date: Tue, 30 Jan 2024 11:47:01 +0200 Subject: [PATCH] first working version --- .../v2/DescriptorPlaceholderResolver.java | 100 ++++++++++++++++-- 1 file changed, 91 insertions(+), 9 deletions(-) diff --git a/multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/v2/DescriptorPlaceholderResolver.java b/multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/v2/DescriptorPlaceholderResolver.java index da010743..2e6af382 100644 --- a/multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/v2/DescriptorPlaceholderResolver.java +++ b/multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/v2/DescriptorPlaceholderResolver.java @@ -1,21 +1,18 @@ package org.cloudfoundry.multiapps.mta.resolvers.v2; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import org.cloudfoundry.multiapps.common.ContentException; import org.cloudfoundry.multiapps.mta.builders.v2.ParametersChainBuilder; -import org.cloudfoundry.multiapps.mta.model.DeploymentDescriptor; +import org.cloudfoundry.multiapps.mta.model.*; import org.cloudfoundry.multiapps.mta.model.Module; -import org.cloudfoundry.multiapps.mta.model.Resource; -import org.cloudfoundry.multiapps.mta.resolvers.PlaceholderResolver; -import org.cloudfoundry.multiapps.mta.resolvers.PropertiesPlaceholderResolver; -import org.cloudfoundry.multiapps.mta.resolvers.ResolverBuilder; +import org.cloudfoundry.multiapps.mta.resolvers.*; import org.cloudfoundry.multiapps.mta.util.PropertiesUtil; +import static org.cloudfoundry.multiapps.mta.resolvers.ReferencePattern.FULLY_QUALIFIED; +import static org.cloudfoundry.multiapps.mta.resolvers.ReferencePattern.PLACEHOLDER; + public class DescriptorPlaceholderResolver extends PlaceholderResolver { protected final DeploymentDescriptor deploymentDescriptor; @@ -62,12 +59,97 @@ protected ResourcePlaceholderResolver getResourceResolver(Resource resource) { } protected List getResolvedResources() { + List resources = deploymentDescriptor.getResources(); + + for (Resource resource: resources) { + if (resource.getParameters().containsKey("config")) { + Map resourceParameters = (Map) resource.getParameters().get("config"); + + for (Map.Entry resourceParameter: resourceParameters.entrySet()) { + if(resourceParameter.getValue() instanceof Map) { + resolveMapParameter((Map) resourceParameter.getValue(), resource); + } else if (resourceParameter.getValue() instanceof String) { + resolveConfigParameter(resourceParameter, resource); + //resourceParameters.put(resourceParameter.getKey(), resolvedParameter); + } + } + } + } + deploymentDescriptor.setResources(resources); return deploymentDescriptor.getResources() .stream() .map(resource -> getResourceResolver(resource).resolve()) .collect(Collectors.toList()); } + private void resolveMapParameter(Map resourceParameter, Resource resource) { + for (Map.Entry resourceParameterEntry: resourceParameter.entrySet()) { + if (resourceParameterEntry.getValue() instanceof Map) { + resolveMapParameter((Map) resourceParameterEntry.getValue(), resource); + } else if (resourceParameterEntry.getValue() instanceof String) { + resolveConfigParameter(resourceParameterEntry, resource); + } + } + } + + private void resolveConfigParameter(Map.Entry resourceParameter, Resource resource) { + String resourceParameterValue = (String) resourceParameter.getValue(); + List references = FULLY_QUALIFIED.match(resourceParameterValue); + + if (!references.isEmpty()) { + for (Reference reference : references) { + + Optional requiredModule = deploymentDescriptor.getModules().stream().filter(module -> getModule(module, reference.getDependencyName())).findFirst(); + + if (requiredModule.isPresent()) { + Optional providedDependency = requiredModule.get().getProvidedDependencies().stream().filter(providedDependencyy -> providedDependencyy.getName().equals(reference.getDependencyName())).findAny(); + Optional requiredDependency = resource.getRequiredDependencies().stream().filter(requiredDependency1 -> requiredDependency1.getName().equals(reference.getDependencyName())).findAny(); + + if (providedDependency.isPresent() && requiredDependency.isPresent()) { + Object requiredDependencyValue = providedDependency.get().getProperties().get(reference.getKey()); + + if (requiredDependencyValue instanceof Map) { + resolveModuleProvidedDependency((Map) requiredDependencyValue, requiredModule.get()); + resourceParameter.setValue(requiredDependencyValue); + } else if (requiredDependencyValue instanceof String) { + String requiredDependencyValueString = String.valueOf(requiredDependencyValue); + if (requiredDependencyValueString.contains("${default-url}")) { + requiredDependencyValueString = requiredDependencyValueString.replace("${default-url}", (String) requiredModule.get().getParameters().get("default-live-url")); + + String b = resourceParameterValue.replace(reference.getMatchedPattern(), requiredDependencyValueString); + resourceParameter.setValue(b); + } + } + } + } + } + } + } + + private void resolveModuleProvidedDependency(Map requiredDependencyMap, Module module) { + for (Map.Entry requiredDependencyEntry: requiredDependencyMap.entrySet()) { + if (requiredDependencyEntry.getValue() instanceof Map) { + resolveModuleProvidedDependency((Map) requiredDependencyEntry.getValue(), module); + } else if (requiredDependencyEntry.getValue() instanceof String) { + String requiredDependencyString = (String) requiredDependencyEntry.getValue(); + if (requiredDependencyString.contains("${default-url}")) { + requiredDependencyString = requiredDependencyString.replace("${default-url}", (String) module.getParameters().get("default-live-url")); + requiredDependencyEntry.setValue(requiredDependencyString); + } + } + } + } + + private boolean getModule(Module module, String name) { + for (ProvidedDependency providedDependency: module.getProvidedDependencies()) { + if (providedDependency.getName().equals(name)) { + return true; + } + } + + return false; + } + protected ModulePlaceholderResolver getModuleResolver(Module module) { return new ModulePlaceholderResolver(module, prefix,