Search in sources :

Example 6 with CombineClassLoader

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);
}
Also used : CombineClassLoader(co.cask.cdap.common.lang.CombineClassLoader) ProgramClassLoader(co.cask.cdap.internal.app.runtime.ProgramClassLoader) ProgramClassLoader(co.cask.cdap.internal.app.runtime.ProgramClassLoader) DirectoryClassLoader(co.cask.cdap.common.lang.DirectoryClassLoader) PackageFilterClassLoader(co.cask.cdap.common.lang.PackageFilterClassLoader) CombineClassLoader(co.cask.cdap.common.lang.CombineClassLoader) Manifest(java.util.jar.Manifest) PackageFilterClassLoader(co.cask.cdap.common.lang.PackageFilterClassLoader)

Example 7 with CombineClassLoader

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);
    }
}
Also used : CombineClassLoader(co.cask.cdap.common.lang.CombineClassLoader) ArrayList(java.util.ArrayList) FilterClassLoader(co.cask.cdap.common.lang.FilterClassLoader) CombineClassLoader(co.cask.cdap.common.lang.CombineClassLoader) IOException(java.io.IOException) Plugin(co.cask.cdap.api.plugin.Plugin)

Aggregations

CombineClassLoader (co.cask.cdap.common.lang.CombineClassLoader)7 IOException (java.io.IOException)3 ArrayList (java.util.ArrayList)3 HttpContentProducer (co.cask.cdap.api.service.http.HttpContentProducer)2 HttpServiceContext (co.cask.cdap.api.service.http.HttpServiceContext)2 FilterClassLoader (co.cask.cdap.common.lang.FilterClassLoader)2 File (java.io.File)2 Cancellable (org.apache.twill.common.Cancellable)2 ApplicationSpecification (co.cask.cdap.api.app.ApplicationSpecification)1 MetricsContext (co.cask.cdap.api.metrics.MetricsContext)1 Plugin (co.cask.cdap.api.plugin.Plugin)1 DefaultAppConfigurer (co.cask.cdap.app.DefaultAppConfigurer)1 ProgramDescriptor (co.cask.cdap.app.program.ProgramDescriptor)1 ProgramController (co.cask.cdap.app.runtime.ProgramController)1 ProgramOptions (co.cask.cdap.app.runtime.ProgramOptions)1 InvalidArtifactException (co.cask.cdap.common.InvalidArtifactException)1 MainClassLoader (co.cask.cdap.common.app.MainClassLoader)1 CConfiguration (co.cask.cdap.common.conf.CConfiguration)1 CaseInsensitiveEnumTypeAdapterFactory (co.cask.cdap.common.io.CaseInsensitiveEnumTypeAdapterFactory)1 DirectoryClassLoader (co.cask.cdap.common.lang.DirectoryClassLoader)1