use of org.mule.runtime.api.util.Pair in project mule by mulesoft.
the class MessagingExceptionResolver method resolve.
/**
* Resolves a new {@link MessagingException} with the real cause of the problem based on the content of an Incoming
* {@link MessagingException} with a chain of causes inside it and the current event that the exception is carrying.
* <p>
* This method will pick the FIRST cause exception that has a mule or extension KNOWN error as the real cause, if there is not
* an exception in the causes that match with an Known error type then this method will try to find the error that the current
* {@link Event} is carrying.
* <p>
* When there are multiple exceptions that contains the same root error type, then this method will wrap the one that has
* highest position in the causes list
*
* @return a {@link MessagingException} with the proper {@link Error} associated to it's {@link CoreEvent}
*/
public MessagingException resolve(final MessagingException me, MuleContext context) {
ErrorTypeLocator locator = ((PrivilegedMuleContext) context).getErrorTypeLocator();
Optional<Pair<Throwable, ErrorType>> rootCause = findRoot(component, me, locator);
if (!rootCause.isPresent()) {
return updateCurrent(me, component, context);
}
Throwable root = rootCause.get().getFirst();
ErrorType rootErrorType = rootCause.get().getSecond();
Component failingComponent = getFailingProcessor(me, root).orElse(component);
ErrorType errorType = getErrorMappings(component).stream().filter(m -> m.match(rootErrorType)).findFirst().map(ErrorMapping::getTarget).orElse(rootErrorType);
Error error = ErrorBuilder.builder(getMessagingExceptionCause(root)).errorType(errorType).build();
CoreEvent event = CoreEvent.builder(me.getEvent()).error(error).build();
MessagingException result;
if (root instanceof MessagingException) {
((MessagingException) root).setProcessedEvent(event);
result = ((MessagingException) root);
} else {
result = me instanceof FlowExecutionException ? new FlowExecutionException(event, root, failingComponent) : new MessagingException(event, root, failingComponent);
}
if (me.getInfo().containsKey(INFO_ALREADY_LOGGED_KEY)) {
result.addInfo(INFO_ALREADY_LOGGED_KEY, me.getInfo().get(INFO_ALREADY_LOGGED_KEY));
}
return enrich(result, failingComponent, event, context);
}
use of org.mule.runtime.api.util.Pair in project mule by mulesoft.
the class MessagingExceptionResolver method findRoot.
private Optional<Pair<Throwable, ErrorType>> findRoot(Component obj, MessagingException me, ErrorTypeLocator locator) {
List<Pair<Throwable, ErrorType>> errors = collectErrors(obj, me, locator);
if (errors.isEmpty()) {
return collectCritical(obj, me, locator).stream().findFirst();
}
// We look if there is a more specific error in the chain that matches with the root error (is child or has the same error)
SingleErrorTypeMatcher matcher = new SingleErrorTypeMatcher(errors.get(0).getSecond());
Reference<Pair<Throwable, ErrorType>> result = new Reference<>();
errors.forEach(p -> {
if (matcher.match(p.getSecond())) {
result.set(p);
}
});
return Optional.ofNullable(result.get());
}
use of org.mule.runtime.api.util.Pair in project mule by mulesoft.
the class MessagingExceptionResolver method collectCritical.
private List<Pair<Throwable, ErrorType>> collectCritical(Component obj, MessagingException me, ErrorTypeLocator locator) {
List<Pair<Throwable, ErrorType>> errors = new LinkedList<>();
getExceptionsAsList(me).forEach(e -> {
ErrorType type = errorTypeFromException(obj, locator, e);
if (isCriticalMuleError(type)) {
errors.add(new Pair<>(e, type));
}
});
return errors;
}
use of org.mule.runtime.api.util.Pair in project mule by mulesoft.
the class ExtensionModelDiscoverer method discoverPluginsExtensionModels.
/**
* For each artifactPlugin discovers the {@link ExtensionModel}.
*
* @param loaderRepository {@link ExtensionModelLoaderRepository} with the available extension loaders.
* @param artifactPlugins {@link Pair} of {@link ArtifactPluginDescriptor} and {@link ArtifactClassLoader} for artifact plugins
* deployed inside the artifact. Non null.
* @param parentArtifactExtensions {@link Set} of {@link ExtensionModel} to also take into account when parsing extensions
* @return {@link Set} of {@link Pair} carrying the {@link ArtifactPluginDescriptor} and it's corresponding
* {@link ExtensionModel}.
*/
public Set<Pair<ArtifactPluginDescriptor, ExtensionModel>> discoverPluginsExtensionModels(ExtensionModelLoaderRepository loaderRepository, List<Pair<ArtifactPluginDescriptor, ArtifactClassLoader>> artifactPlugins, Set<ExtensionModel> parentArtifactExtensions) {
final Set<Pair<ArtifactPluginDescriptor, ExtensionModel>> descriptorsWithExtensions = new HashSet<>();
artifactPlugins.forEach(artifactPlugin -> {
Set<ExtensionModel> extensions = descriptorsWithExtensions.stream().map(Pair::getSecond).collect(toSet());
extensions.addAll(parentArtifactExtensions);
final ArtifactPluginDescriptor artifactPluginDescriptor = artifactPlugin.getFirst();
Optional<LoaderDescriber> loaderDescriber = artifactPluginDescriptor.getExtensionModelDescriptorProperty();
ClassLoader artifactClassloader = artifactPlugin.getSecond().getClassLoader();
String artifactName = artifactPluginDescriptor.getName();
ExtensionModel extension = loaderDescriber.map(describer -> discoverExtensionThroughJsonDescriber(loaderRepository, describer, extensions, artifactClassloader, artifactName)).orElse(null);
if (extension != null) {
descriptorsWithExtensions.add(new Pair<>(artifactPluginDescriptor, extension));
}
});
return descriptorsWithExtensions;
}
use of org.mule.runtime.api.util.Pair in project mule by mulesoft.
the class ArtifactExtensionManagerFactory method create.
protected ExtensionManager create(MuleContext muleContext, Set<ExtensionModel> parentArtifactExtensions) {
final ExtensionManager extensionManager = extensionManagerFactory.create(muleContext);
final Set<ExtensionModel> extensions = new HashSet<>();
extensionModelDiscoverer.discoverRuntimeExtensionModels().forEach(extensionManager::registerExtension);
extensions.addAll(extensionModelDiscoverer.discoverPluginsExtensionModels(extensionModelLoaderRepository, artifactPlugins, parentArtifactExtensions).stream().map(Pair::getSecond).collect(toSet()));
extensions.forEach(extensionManager::registerExtension);
return extensionManager;
}
Aggregations