From c58060643da823210316ee8ef9f53d264b69d1e8 Mon Sep 17 00:00:00 2001 From: Velizar Kalapov Date: Mon, 9 Oct 2023 12:25:45 +0300 Subject: [PATCH] Add property resolution for provided dependencies --- .../mta/resolvers/ProvidesValuesResolver.java | 41 +++++++++++++ .../resolvers/v3/ModuleReferenceResolver.java | 18 ++++++ .../ProvidedDependencyReferenceResolver.java | 60 +++++++++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/ProvidesValuesResolver.java create mode 100644 multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/v3/ProvidedDependencyReferenceResolver.java diff --git a/multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/ProvidesValuesResolver.java b/multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/ProvidesValuesResolver.java new file mode 100644 index 00000000..f31ed55f --- /dev/null +++ b/multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/ProvidesValuesResolver.java @@ -0,0 +1,41 @@ +package org.cloudfoundry.multiapps.mta.resolvers; + +import static java.text.MessageFormat.format; + +import java.util.Map; + +import org.cloudfoundry.multiapps.common.ContentException; +import org.cloudfoundry.multiapps.mta.Messages; +import org.cloudfoundry.multiapps.mta.handlers.v3.DescriptorHandler; +import org.cloudfoundry.multiapps.mta.model.DeploymentDescriptor; +import org.cloudfoundry.multiapps.mta.model.RequiredDependency; +import org.cloudfoundry.multiapps.mta.model.Resource; + +public class ProvidesValuesResolver implements ProvidedValuesResolver { + + private DescriptorHandler handler; + private String consumerName; + private DeploymentDescriptor descriptor; + + public ProvidesValuesResolver(String consumerName, DescriptorHandler handler, DeploymentDescriptor descriptor) { + + this.handler = handler; + this.consumerName = consumerName; + this.descriptor = descriptor; + } + + @Override + public Map resolveProvidedValues(String dependencyName) throws ContentException { + assertRequiredDependencyExists(dependencyName); + Resource resource = handler.findResource(descriptor, dependencyName); + return resource.getProperties(); + } + + protected void assertRequiredDependencyExists(String dependencyName) { + RequiredDependency requiredDependency = handler.findRequiredDependency(descriptor, consumerName, dependencyName); + if (requiredDependency == null) { + throw new ContentException(format(Messages.ILLEGAL_REFERENCES_DETECTED, consumerName, dependencyName)); + } + } + +} diff --git a/multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/v3/ModuleReferenceResolver.java b/multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/v3/ModuleReferenceResolver.java index 66143586..f279da04 100644 --- a/multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/v3/ModuleReferenceResolver.java +++ b/multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/v3/ModuleReferenceResolver.java @@ -8,6 +8,7 @@ import org.cloudfoundry.multiapps.mta.model.DeploymentDescriptor; import org.cloudfoundry.multiapps.mta.model.Hook; import org.cloudfoundry.multiapps.mta.model.Module; +import org.cloudfoundry.multiapps.mta.model.ProvidedDependency; import org.cloudfoundry.multiapps.mta.resolvers.ResolverBuilder; public class ModuleReferenceResolver extends org.cloudfoundry.multiapps.mta.resolvers.v2.ModuleReferenceResolver { @@ -26,6 +27,7 @@ public ModuleReferenceResolver(DeploymentDescriptor descriptor, Module module, S public Module resolve() throws ContentException { super.resolve(); module.setHooks(getResolvedHooks()); + module.setProvidedDependencies(getResolvedProvidedDependencies()); return module; } @@ -46,4 +48,20 @@ private HookReferenceResolver getHookReferenceResolver(Hook hook) { dynamicResolvableParameters); } + protected ProvidedDependencyReferenceResolver getProvidedDependencyResolver(ProvidedDependency providedDependency) { + return new ProvidedDependencyReferenceResolver(descriptor, + module, + providedDependency, + prefix, + new ResolverBuilder(), + dynamicResolvableParameters); + } + + protected List getResolvedProvidedDependencies() { + return module.getProvidedDependencies() + .stream() + .map(providedDependency -> getProvidedDependencyResolver(providedDependency).resolve()) + .collect(Collectors.toList()); + } + } diff --git a/multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/v3/ProvidedDependencyReferenceResolver.java b/multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/v3/ProvidedDependencyReferenceResolver.java new file mode 100644 index 00000000..0a75fc2f --- /dev/null +++ b/multiapps-mta/src/main/java/org/cloudfoundry/multiapps/mta/resolvers/v3/ProvidedDependencyReferenceResolver.java @@ -0,0 +1,60 @@ +package org.cloudfoundry.multiapps.mta.resolvers.v3; + +import static org.cloudfoundry.multiapps.mta.resolvers.ReferencePattern.FULLY_QUALIFIED; + +import java.util.Collections; +import java.util.Map; +import java.util.Set; + +import org.cloudfoundry.multiapps.common.ContentException; +import org.cloudfoundry.multiapps.mta.handlers.v3.DescriptorHandler; +import org.cloudfoundry.multiapps.mta.model.DeploymentDescriptor; +import org.cloudfoundry.multiapps.mta.model.NamedElement; +import org.cloudfoundry.multiapps.mta.model.ProvidedDependency; +import org.cloudfoundry.multiapps.mta.resolvers.ProvidedValuesResolver; +import org.cloudfoundry.multiapps.mta.resolvers.ProvidesValuesResolver; +import org.cloudfoundry.multiapps.mta.resolvers.ReferenceResolver; +import org.cloudfoundry.multiapps.mta.resolvers.ResolverBuilder; + +public class ProvidedDependencyReferenceResolver extends ReferenceResolver { + + protected final ProvidedDependency dependency; + protected final ResolverBuilder propertiesResolverBuilder; + private DescriptorHandler handler; + private DeploymentDescriptor descriptor; + private String consumerName; + + public ProvidedDependencyReferenceResolver(DeploymentDescriptor descriptor, NamedElement consumer, ProvidedDependency dependency, + String prefix, ResolverBuilder propertiesResolverBuilder, + Set dynamicResolvableParameters) { + this(descriptor, consumer, dependency, prefix, new DescriptorHandler(), propertiesResolverBuilder, dynamicResolvableParameters); + } + + public ProvidedDependencyReferenceResolver(DeploymentDescriptor descriptor, NamedElement consumer, ProvidedDependency dependency, + String prefix, DescriptorHandler handler, ResolverBuilder propertiesResolverBuilder, + Set dynamicResolvableParameters) { + super(dependency.getName(), prefix, handler, descriptor, consumer.getName(), FULLY_QUALIFIED, dynamicResolvableParameters); + this.dependency = dependency; + this.propertiesResolverBuilder = propertiesResolverBuilder; + this.handler = handler; + this.consumerName = consumer.getName(); + this.descriptor = descriptor; + } + + @Override + public ProvidedDependency resolve() throws ContentException { + Map resolvedProperties = resolve(dependency.getProperties(), Collections.emptyMap(), true); + Map resolvedParameters = resolve(dependency.getParameters(), Collections.emptyMap(), true); + dependency.setProperties(resolvedProperties); + dependency.setParameters(resolvedParameters); + return dependency; + } + + @Override + protected Map resolve(Map properties, final Map propertyValues, Boolean isStrict) { + ProvidedValuesResolver valuesResolver = new ProvidesValuesResolver(consumerName, handler, descriptor); + return propertiesResolverBuilder.build(properties, valuesResolver, patternToMatch, prefix, isStrict, dynamicResolvableParameters) + .resolve(); + } + +}