public PolicyResult resolvePolicies(LogicalConsumer consumer) throws PolicyResolutionException {
LogicalComponent<?> component = consumer.getParent();
if (noPolicy(component)) {
return EMPTY_RESULT;
}
PolicyResultImpl policyResult = new PolicyResultImpl();
LogicalOperation operation = new LogicalOperation(DEFINITION, consumer);
IntentPair targetOperationIntentPair = interactionResolver.resolveIntents(operation, LocalBindingDefinition.INSTANCE.getType());
policyResult.addTargetProvidedIntents(operation, targetOperationIntentPair.getProvidedIntents());
IntentPair sourceImplementationIntentPair = implementationResolver.resolveIntents(component, operation);
policyResult.addSourceProvidedIntents(operation, sourceImplementationIntentPair.getProvidedIntents());
Set<PolicySet> policies = interactionResolver.resolvePolicySets(operation, consumer, LocalBindingDefinition.INSTANCE.getType());
policyResult.addTargetPolicySets(operation, CollectionUtils.filter(policies, PROVIDED));
policyResult.addInterceptedPolicySets(operation, CollectionUtils.filter(policies, INTERCEPTION));
policies = implementationResolver.resolvePolicySets(component, operation);
PolicyMetadata metadata = policyResult.getMetadata(operation);
metadata.addAll(operation.getDefinition().getMetadata());
metadata.addAll(operation.getParent().getParent().getDefinition().getImplementation().getMetadata());
policyResult.addTargetPolicySets(operation, CollectionUtils.filter(policies, PROVIDED));
policyResult.addInterceptedPolicySets(operation, CollectionUtils.filter(policies, INTERCEPTION));
overrideDirectIfExternalAttachedPolicies(policyResult);
return policyResult;
}