/* * 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.deployment.model.internal.application; import static org.mule.runtime.api.util.Preconditions.checkArgument; import static org.mule.runtime.module.artifact.classloader.ParentFirstLookupStrategy.PARENT_FIRST; import org.mule.runtime.deployment.model.api.application.ApplicationDescriptor; import org.mule.runtime.deployment.model.api.plugin.ArtifactPluginDescriptor; import org.mule.runtime.deployment.model.internal.nativelib.NativeLibraryFinder; import org.mule.runtime.deployment.model.internal.nativelib.NativeLibraryFinderFactory; import org.mule.runtime.module.artifact.classloader.ArtifactClassLoader; import org.mule.runtime.module.artifact.classloader.ClassLoaderLookupPolicy; import org.mule.runtime.module.artifact.classloader.DeployableArtifactClassLoaderFactory; import org.mule.runtime.module.artifact.classloader.LookupStrategy; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Creates {@link MuleApplicationClassLoader} instances based on the application descriptor. */ public class MuleApplicationClassLoaderFactory implements DeployableArtifactClassLoaderFactory<ApplicationDescriptor> { private final NativeLibraryFinderFactory nativeLibraryFinderFactory; /** * Creates a new factory * * @param nativeLibraryFinderFactory creates {@link NativeLibraryFinder} for the created applications. Non null */ public MuleApplicationClassLoaderFactory(NativeLibraryFinderFactory nativeLibraryFinderFactory) { checkArgument(nativeLibraryFinderFactory != null, "nativeLibraryFinderFactory cannot be null"); this.nativeLibraryFinderFactory = nativeLibraryFinderFactory; } @Override public ArtifactClassLoader create(String artifactId, ArtifactClassLoader parent, ApplicationDescriptor descriptor, List<ArtifactClassLoader> artifactPluginClassLoaders) { final ClassLoaderLookupPolicy classLoaderLookupPolicy = getApplicationClassLoaderLookupPolicy(parent, descriptor); return new MuleApplicationClassLoader(artifactId, descriptor, parent.getClassLoader(), nativeLibraryFinderFactory.create(descriptor.getName()), Arrays.asList(descriptor.getClassLoaderModel().getUrls()), classLoaderLookupPolicy, artifactPluginClassLoaders); } private ClassLoaderLookupPolicy getApplicationClassLoaderLookupPolicy(ArtifactClassLoader parent, ApplicationDescriptor descriptor) { final Map<String, LookupStrategy> pluginsLookupStrategies = new HashMap<>(); for (ArtifactPluginDescriptor artifactPluginDescriptor : descriptor.getPlugins()) { artifactPluginDescriptor.getClassLoaderModel().getExportedPackages() .forEach(p -> pluginsLookupStrategies.put(p, PARENT_FIRST)); } return parent.getClassLoaderLookupPolicy().extend(pluginsLookupStrategies); } }