/* * Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com * The software in this package is published under the terms of the CPAL v1.0 * license, a copy of which has been included with this distribution in the * LICENSE.txt file. */ package org.mule.runtime.module.extension.internal.runtime; import org.mule.runtime.api.exception.MuleException; import org.mule.runtime.api.meta.model.ComponentModel; import org.mule.runtime.api.meta.model.ExtensionModel; import org.mule.runtime.core.api.Event; import org.mule.runtime.extension.api.runtime.ConfigurationInstance; import org.mule.runtime.extension.api.runtime.operation.ExecutionContext; import org.mule.runtime.module.extension.internal.runtime.resolver.ResolverSet; import org.mule.runtime.module.extension.internal.runtime.resolver.ValueResolver; import org.mule.runtime.module.extension.internal.runtime.resolver.ValueResolvingContext; import java.util.Map; import java.util.NoSuchElementException; import java.util.Optional; /** * A lazy version of a {@link ExecutionContext} which resolves the values of the parameters * of the operation on demand. * The laziness of this class is meant for cases where the resolution of a parameters are wanted to * be isolated between each other, so when resolving a parameter value, does not matter if other * parameters have invalid values. * * @param <M> the generic type of of the model which represents the component beign executed * @since 4.0 */ public class LazyExecutionContext<M extends ComponentModel> implements EventedExecutionContext<M> { private final Map<String, ValueResolver> valueResolvers; private final M componentModel; private final ExtensionModel extensionModel; private final ValueResolvingContext resolvingContext; public LazyExecutionContext(ResolverSet resolverSet, M componentModel, ExtensionModel extensionModel, ValueResolvingContext resolvingContext) { this.valueResolvers = resolverSet.getResolvers(); this.componentModel = componentModel; this.extensionModel = extensionModel; this.resolvingContext = resolvingContext; } /** * {@inheritDoc} */ @Override public boolean hasParameter(String parameterName) { return valueResolvers.containsKey(parameterName); } /** * {@inheritDoc} */ @Override public <T> T getParameter(String parameterName) { if (hasParameter(parameterName)) { try { return (T) valueResolvers.get(parameterName).resolve(resolvingContext); } catch (MuleException e) { throw new RuntimeException(e); } } else { throw new NoSuchElementException(); } } /** * {@inheritDoc} */ @Override public Optional<ConfigurationInstance> getConfiguration() { return resolvingContext.getConfig(); } @Override public Event getEvent() { return resolvingContext.getEvent(); } /** * {@inheritDoc} */ @Override public M getComponentModel() { return componentModel; } /** * {@inheritDoc} */ @Override public ExtensionModel getExtensionModel() { return extensionModel; } }