use of org.mule.runtime.api.metadata.resolving.MetadataFailure in project mule by mulesoft.
the class MetadataOutputDelegate method getOutputMetadataDescriptor.
/**
* Creates an {@link OutputMetadataDescriptor} representing the Component's output metadata using the
* {@link OutputTypeResolver}, if one is available to resolve the output {@link MetadataType}.
*
* @param context current {@link MetadataContext} that will be used by the {@link InputTypeResolver}
* @param key {@link MetadataKey} of the type which's structure has to be resolved
* @return Success with an {@link OutputMetadataDescriptor} representing the Component's output metadata, resolved using the
* {@link OutputTypeResolver} if one is available to resolve its {@link MetadataType}. Failure if the dynamic
* resolution fails for any reason.
*/
MetadataResult<OutputMetadataDescriptor> getOutputMetadataDescriptor(MetadataContext context, Object key) {
if (!(component instanceof HasOutputModel)) {
return failure(MetadataFailure.Builder.newFailure().withMessage("The given component has not output definition to be described").onComponent());
}
MetadataResult<MetadataType> output = getOutputMetadata(context, key);
MetadataResult<MetadataType> attributes = getOutputAttributesMetadata(context, key);
HasOutputModel componentWithOutput = (HasOutputModel) this.component;
MetadataResult<TypeMetadataDescriptor> outputDescriptor = toMetadataDescriptorResult(componentWithOutput.getOutput().getType(), componentWithOutput.getOutput().hasDynamicType(), output);
MetadataResult<TypeMetadataDescriptor> attributesDescriptor = toMetadataDescriptorResult(componentWithOutput.getOutputAttributes().getType(), false, attributes);
OutputMetadataDescriptor descriptor = OutputMetadataDescriptor.builder().withReturnType(outputDescriptor.get()).withAttributesType(attributesDescriptor.get()).build();
if (!output.isSuccess() || !attributes.isSuccess()) {
List<MetadataFailure> failures = ImmutableList.<MetadataFailure>builder().addAll(output.getFailures()).addAll(attributes.getFailures()).build();
return failure(descriptor, failures);
}
return success(descriptor);
}
use of org.mule.runtime.api.metadata.resolving.MetadataFailure in project mule by mulesoft.
the class MetadataOutputDelegate method getOutputMetadata.
/**
* Given a {@link MetadataKey} of a type and a {@link MetadataContext}, resolves the {@link MetadataType} of the Components's
* output using the {@link OutputTypeResolver} associated to the current component.
*
* @param context {@link MetadataContext} of the Metadata resolution
* @param key {@link MetadataKey} of the type which's structure has to be resolved
* @return a {@link MetadataResult} with the {@link MetadataType} of the component's output
*/
private MetadataResult<MetadataType> getOutputMetadata(final MetadataContext context, final Object key) {
OutputModel output = ((HasOutputModel) component).getOutput();
if (isVoid(output.getType()) || !output.hasDynamicType()) {
return success(output.getType());
}
try {
MetadataType metadata = resolverFactory.getOutputResolver().getOutputType(context, key);
if (isMetadataResolvedCorrectly(metadata, true)) {
return success(adaptToListIfNecessary(metadata, key, context));
}
MetadataFailure failure = newFailure().withMessage("Error resolving Output Payload metadata").withFailureCode(NO_DYNAMIC_TYPE_AVAILABLE).withReason(NULL_TYPE_ERROR).onOutputPayload();
return failure(output.getType(), failure);
} catch (Exception e) {
return failure(output.getType(), newFailure(e).onOutputAttributes());
}
}
use of org.mule.runtime.api.metadata.resolving.MetadataFailure in project mule by mulesoft.
the class MetadataInputDelegate method getInputMetadataDescriptors.
/**
* For each of the Component's {@link ParameterModel} creates the corresponding {@link TypeMetadataDescriptor} using only its
* static {@link MetadataType} and ignoring if any parameter has a dynamic type.
*
* @return A {@link List} containing a {@link MetadataResult} of {@link TypeMetadataDescriptor} for each input parameter using
* only its static {@link MetadataType} and ignoring if any parameter has a dynamic type.
*/
MetadataResult<InputMetadataDescriptor> getInputMetadataDescriptors(MetadataContext context, Object key) {
InputMetadataDescriptor.InputMetadataDescriptorBuilder input = InputMetadataDescriptor.builder();
List<MetadataResult<ParameterMetadataDescriptor>> results = new LinkedList<>();
for (ParameterModel parameter : component.getAllParameterModels()) {
MetadataResult<ParameterMetadataDescriptor> result = getParameterMetadataDescriptor(parameter, context, key);
input.withParameter(parameter.getName(), result.get());
results.add(result);
}
List<MetadataFailure> failures = results.stream().flatMap(e -> e.getFailures().stream()).collect(toList());
return failures.isEmpty() ? success(input.build()) : failure(input.build(), failures);
}
use of org.mule.runtime.api.metadata.resolving.MetadataFailure in project mule by mulesoft.
the class MetadataInputDelegate method getParameterMetadata.
/**
* Given a {@link MetadataKey} of a type and a {@link MetadataContext}, resolves the {@link MetadataType} of the
* {@code parameter} using the {@link InputTypeResolver} associated to the current component.
*
* @param context {@link MetadataContext} of the MetaData resolution
* @param key {@link MetadataKey} of the type which's structure has to be resolved
* @return a {@link MetadataResult} with the {@link MetadataType} of the {@code parameter}.
*/
private MetadataResult<MetadataType> getParameterMetadata(ParameterModel parameter, MetadataContext context, Object key) {
try {
boolean allowsNullType = !parameter.isRequired() && (parameter.getDefaultValue() == null);
MetadataType metadata = resolverFactory.getInputResolver(parameter.getName()).getInputMetadata(context, key);
if (isMetadataResolvedCorrectly(metadata, allowsNullType)) {
return success(adaptToListIfNecessary(metadata, parameter, context));
}
MetadataFailure failure = newFailure().withMessage(format("Error resolving metadata for the [%s] input parameter", parameter.getName())).withFailureCode(NO_DYNAMIC_TYPE_AVAILABLE).withReason(NULL_TYPE_ERROR).onParameter(parameter.getName());
return failure(parameter.getType(), failure);
} catch (Exception e) {
return failure(parameter.getType(), newFailure(e).onParameter(parameter.getName()));
}
}
use of org.mule.runtime.api.metadata.resolving.MetadataFailure in project mule by mulesoft.
the class MetadataMediator method getMetadata.
/**
* Resolves the {@link ComponentMetadataDescriptor} for the associated {@code context} using static and dynamic resolving of the
* Component parameters, attributes and output.
*
* @param context current {@link MetadataContext} that will be used by the {@link InputTypeResolver} and
* {@link OutputTypeResolver}
* @param keyValue {@link Object} resolved {@link MetadataKey} object
* @return Successful {@link MetadataResult} if the MetadataTypes are resolved without errors Failure {@link MetadataResult}
* when the Metadata retrieval of any element fails for any reason
*/
private MetadataResult<ComponentMetadataDescriptor<T>> getMetadata(MetadataContext context, Object keyValue, MetadataAttributes.MetadataAttributesBuilder attributesBuilder) {
MetadataResult<OutputMetadataDescriptor> output = outputDelegate.getOutputMetadataDescriptor(context, keyValue);
MetadataResult<InputMetadataDescriptor> input = inputDelegate.getInputMetadataDescriptors(context, keyValue);
if (output.isSuccess() && input.isSuccess()) {
MetadataAttributes metadataAttributes = getMetadataAttributes(attributesBuilder, outputDelegate, input.get());
T model = getTypedModel(input.get(), output.get());
return success(ComponentMetadataDescriptor.builder(model).withAttributes(metadataAttributes).build());
}
List<MetadataFailure> failures = ImmutableList.<MetadataFailure>builder().addAll(output.getFailures()).addAll(input.getFailures()).build();
return failure(ComponentMetadataDescriptor.builder(component).build(), failures);
}
Aggregations