Skip to content

Commit

Permalink
Add property resolution for provided dependencies
Browse files Browse the repository at this point in the history
  • Loading branch information
vkalapov committed Oct 13, 2023
1 parent 0375bad commit c580606
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -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<String, Object> 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));
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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;
}

Expand All @@ -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<ProvidedDependency> getResolvedProvidedDependencies() {
return module.getProvidedDependencies()
.stream()
.map(providedDependency -> getProvidedDependencyResolver(providedDependency).resolve())
.collect(Collectors.toList());
}

}
Original file line number Diff line number Diff line change
@@ -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<ProvidedDependency> {

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<String> 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<String> 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<String, Object> resolvedProperties = resolve(dependency.getProperties(), Collections.emptyMap(), true);
Map<String, Object> resolvedParameters = resolve(dependency.getParameters(), Collections.emptyMap(), true);
dependency.setProperties(resolvedProperties);
dependency.setParameters(resolvedParameters);
return dependency;
}

@Override
protected Map<String, Object> resolve(Map<String, Object> properties, final Map<String, Object> propertyValues, Boolean isStrict) {
ProvidedValuesResolver valuesResolver = new ProvidesValuesResolver(consumerName, handler, descriptor);
return propertiesResolverBuilder.build(properties, valuesResolver, patternToMatch, prefix, isStrict, dynamicResolvableParameters)
.resolve();
}

}

0 comments on commit c580606

Please sign in to comment.