/* * 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.artifact.classloader.exception; import static com.google.common.collect.ImmutableList.copyOf; import static java.lang.String.format; import static java.lang.System.lineSeparator; import static java.util.stream.Collectors.toList; import org.mule.runtime.module.artifact.classloader.LookupStrategy; import java.util.List; /** * Extends {@link ClassNotFoundException}, composing the individual exceptions of each place where the class was looked for and * wasn't found. */ public class CompositeClassNotFoundException extends ClassNotFoundException { private static final long serialVersionUID = -6941980241656380059L; private final String className; private final LookupStrategy lookupStrategy; private final List<ClassNotFoundException> exceptions; /** * Builds the exception. * * @param className the name of the class that was trying to be loaded. * @param lookupStrategy the lookupStrategy that was used to load the class. * @param exceptions the exceptions thrown by each individual classloader that was used for the loading. */ public CompositeClassNotFoundException(String className, LookupStrategy lookupStrategy, List<ClassNotFoundException> exceptions) { super(format("Cannot load class '%s': %s", className, exceptions.stream().map((e) -> lineSeparator() + "\t" + e.getMessage()).collect(toList())), exceptions.get(0)); this.className = className; this.lookupStrategy = lookupStrategy; this.exceptions = copyOf(exceptions); } /** * @return the name of the class that was trying to be loaded */ public String getClassName() { return className; } /** * @return the lookupStrategy that was used to load the class. */ public LookupStrategy getLookupStrategy() { return lookupStrategy; } /** * @return the exceptions thrown by each individual classloader that was used for the loading. */ public List<ClassNotFoundException> getExceptions() { return exceptions; } }