use of co.cask.cdap.common.lang.CombineClassLoader in project cdap by caskdata.
the class PluginClassLoader method createParent.
static ClassLoader createParent(ClassLoader templateClassLoader) {
// Find the ProgramClassLoader from the template ClassLoader
ClassLoader programClassLoader = templateClassLoader;
while (programClassLoader != null && !(programClassLoader instanceof ProgramClassLoader)) {
programClassLoader = programClassLoader.getParent();
}
// This shouldn't happen
Preconditions.checkArgument(programClassLoader != null, "Cannot find ProgramClassLoader");
// Package filtered classloader of the template classloader, which only classes in "Export-Packages" are loadable.
Manifest manifest = ((ProgramClassLoader) programClassLoader).getManifest();
Set<String> exportPackages = ManifestFields.getExportPackages(manifest);
ClassLoader filteredTemplateClassLoader = new PackageFilterClassLoader(templateClassLoader, Predicates.in(exportPackages));
// followed by template export-packages, then by a plugin lib jars.
return new CombineClassLoader(programClassLoader.getParent(), filteredTemplateClassLoader);
}
use of co.cask.cdap.common.lang.CombineClassLoader in project cdap by caskdata.
the class PluginClassLoaders method createFilteredPluginsClassLoader.
/**
* Returns a {@link ClassLoader} that only allows loading of plugin classes and plugin exported classes.
* It should only be used in context when a single ClassLoader is needed to load all different kinds of user classes
* (e.g. in MapReduce/Spark).
*/
public static ClassLoader createFilteredPluginsClassLoader(Map<String, Plugin> plugins, @Nullable PluginInstantiator pluginInstantiator) {
if (plugins.isEmpty() || pluginInstantiator == null) {
return new CombineClassLoader(null);
}
try {
// Gather all explicitly used plugin class names. It is needed for external plugin case.
Multimap<Plugin, String> artifactPluginClasses = getArtifactPluginClasses(plugins);
List<ClassLoader> pluginClassLoaders = new ArrayList<>();
for (Plugin plugin : plugins.values()) {
ClassLoader pluginClassLoader = pluginInstantiator.getPluginClassLoader(plugin);
if (pluginClassLoader instanceof PluginClassLoader) {
// A ClassLoader to allow loading of all plugin classes used by the program.
Collection<String> pluginClasses = artifactPluginClasses.get(plugin);
if (!pluginClasses.isEmpty()) {
pluginClassLoaders.add(createClassFilteredClassLoader(pluginClasses, pluginClassLoader));
}
// A ClassLoader to allow all export package classes to be loadable.
pluginClassLoaders.add(((PluginClassLoader) pluginClassLoader).getExportPackagesClassLoader());
}
}
return new CombineClassLoader(null, pluginClassLoaders);
} catch (IOException e) {
throw Throwables.propagate(e);
}
}
Aggregations