Search in sources :

Example 1 with PluginClassLoader

use of com.intellij.ide.plugins.cl.PluginClassLoader in project intellij-community by JetBrains.

the class GuiTestRunner method loadClassesWithNewPluginClassLoader.

private void loadClassesWithNewPluginClassLoader() throws Exception {
    //ensure that IDEA has been initialized.
    IdeTestApplication.getInstance();
    ParentPlugin testParentPluginAnnotation = getTestClass().getAnnotation(ParentPlugin.class);
    assertNotNull(testParentPluginAnnotation);
    String dependentPluginId = testParentPluginAnnotation.pluginId();
    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    String classPath = getTestClass().getJavaClass().getCanonicalName().replace(".", "/").concat(".class");
    URL resource = classLoader.getResource(classPath);
    assertNotNull(resource);
    String pathToTestClass = resource.getPath();
    String containingFolderPath = pathToTestClass.substring(0, pathToTestClass.length() - classPath.length());
    URL urlToTestClass = (new File(containingFolderPath)).toURI().toURL();
    IdeaPluginDescriptor parentPluginDescriptor = PluginManager.getPlugin(PluginId.getId(dependentPluginId));
    assertNotNull(parentPluginDescriptor);
    ClassLoader parentPluginClassLoader = parentPluginDescriptor.getPluginClassLoader();
    ClassLoader[] classLoaders = { parentPluginClassLoader };
    String testPluginId = dependentPluginId + ".guitest";
    PluginClassLoader testPluginClassLoader = new PluginClassLoader(Collections.singletonList(urlToTestClass), classLoaders, PluginId.getId(testPluginId), null, null);
    Thread.currentThread().setContextClassLoader(testPluginClassLoader);
    Class<?> testClass = getTestClass().getJavaClass();
    myTestClass = new TestClass(testPluginClassLoader.loadClass(testClass.getName()));
}
Also used : PluginClassLoader(com.intellij.ide.plugins.cl.PluginClassLoader) TestClass(org.junit.runners.model.TestClass) IdeaPluginDescriptor(com.intellij.ide.plugins.IdeaPluginDescriptor) File(java.io.File) URL(java.net.URL) PluginClassLoader(com.intellij.ide.plugins.cl.PluginClassLoader)

Example 2 with PluginClassLoader

use of com.intellij.ide.plugins.cl.PluginClassLoader in project intellij-community by JetBrains.

the class AdvancedEnhancer method getDefaultClassLoader.

protected ClassLoader getDefaultClassLoader() {
    int maxIndex = -1;
    ClassLoader bestLoader = null;
    ClassLoader nonPluginLoader = null;
    if (interfaces != null && interfaces.length > 0) {
        for (final Class anInterface : interfaces) {
            final ClassLoader loader = anInterface.getClassLoader();
            if (loader instanceof PluginClassLoader) {
                final int order = PluginManagerCore.getPluginLoadingOrder(((PluginClassLoader) loader).getPluginId());
                if (maxIndex < order) {
                    maxIndex = order;
                    bestLoader = loader;
                }
            } else if (nonPluginLoader == null) {
                nonPluginLoader = loader;
            }
        }
    }
    ClassLoader superLoader = null;
    if (superclass != null) {
        superLoader = superclass.getClassLoader();
        if (superLoader instanceof PluginClassLoader && maxIndex < PluginManagerCore.getPluginLoadingOrder(((PluginClassLoader) superLoader).getPluginId())) {
            return superLoader;
        }
    }
    if (bestLoader != null)
        return bestLoader;
    return superLoader == null ? nonPluginLoader : superLoader;
}
Also used : PluginClassLoader(com.intellij.ide.plugins.cl.PluginClassLoader) PluginClassLoader(com.intellij.ide.plugins.cl.PluginClassLoader)

Example 3 with PluginClassLoader

use of com.intellij.ide.plugins.cl.PluginClassLoader in project intellij-community by JetBrains.

the class IdeErrorsDialog method diagnosePluginDetection.

@NotNull
private static String diagnosePluginDetection(String className, PluginId id) {
    String msg = "Detected plugin " + id + " by class " + className;
    IdeaPluginDescriptor descriptor = PluginManager.getPlugin(id);
    if (descriptor != null) {
        msg += "; ideaLoader=" + descriptor.getUseIdeaClassLoader();
        ClassLoader loader = descriptor.getPluginClassLoader();
        msg += "; loader=" + loader;
        if (loader instanceof PluginClassLoader) {
            msg += "; loaded class: " + ((PluginClassLoader) loader).hasLoadedClass(className);
        }
    }
    return msg;
}
Also used : PluginClassLoader(com.intellij.ide.plugins.cl.PluginClassLoader) IdeaPluginDescriptor(com.intellij.ide.plugins.IdeaPluginDescriptor) PluginClassLoader(com.intellij.ide.plugins.cl.PluginClassLoader) NotNull(org.jetbrains.annotations.NotNull)

Example 4 with PluginClassLoader

use of com.intellij.ide.plugins.cl.PluginClassLoader in project intellij-community by JetBrains.

the class FileTemplatesLoader method loadDefaultTemplates.

private void loadDefaultTemplates() {
    final Set<URL> processedUrls = new HashSet<>();
    for (PluginDescriptor plugin : PluginManagerCore.getPlugins()) {
        if (plugin instanceof IdeaPluginDescriptorImpl && ((IdeaPluginDescriptorImpl) plugin).isEnabled()) {
            final ClassLoader loader = plugin.getPluginClassLoader();
            if (loader instanceof PluginClassLoader && ((PluginClassLoader) loader).getUrls().isEmpty()) {
                // development mode, when IDEA_CORE's loader contains all the classpath
                continue;
            }
            try {
                final Enumeration<URL> systemResources = loader.getResources(DEFAULT_TEMPLATES_ROOT);
                if (systemResources.hasMoreElements()) {
                    while (systemResources.hasMoreElements()) {
                        final URL url = systemResources.nextElement();
                        if (processedUrls.contains(url)) {
                            continue;
                        }
                        processedUrls.add(url);
                        loadDefaultsFromRoot(url);
                    }
                }
            } catch (IOException e) {
                LOG.error(e);
            }
        }
    }
}
Also used : PluginDescriptor(com.intellij.openapi.extensions.PluginDescriptor) PluginClassLoader(com.intellij.ide.plugins.cl.PluginClassLoader) UrlClassLoader(com.intellij.util.lang.UrlClassLoader) IOException(java.io.IOException) URL(java.net.URL) IdeaPluginDescriptorImpl(com.intellij.ide.plugins.IdeaPluginDescriptorImpl) PluginClassLoader(com.intellij.ide.plugins.cl.PluginClassLoader)

Example 5 with PluginClassLoader

use of com.intellij.ide.plugins.cl.PluginClassLoader in project intellij-community by JetBrains.

the class PluginManagerCore method createPluginClassLoader.

@Nullable
private static ClassLoader createPluginClassLoader(@NotNull File[] classPath, @NotNull ClassLoader[] parentLoaders, @NotNull IdeaPluginDescriptor pluginDescriptor) {
    if (pluginDescriptor.getUseIdeaClassLoader()) {
        try {
            final ClassLoader loader = PluginManagerCore.class.getClassLoader();
            final Method addUrlMethod = getAddUrlMethod(loader);
            for (File aClassPath : classPath) {
                final File file = aClassPath.getCanonicalFile();
                addUrlMethod.invoke(loader, file.toURI().toURL());
            }
            return loader;
        } catch (IOException e) {
            getLogger().warn(e);
        } catch (IllegalAccessException e) {
            getLogger().warn(e);
        } catch (InvocationTargetException e) {
            getLogger().warn(e);
        }
    }
    PluginId pluginId = pluginDescriptor.getPluginId();
    File pluginRoot = pluginDescriptor.getPath();
    if (isUnitTestMode())
        return null;
    try {
        final List<URL> urls = new ArrayList<>(classPath.length);
        for (File aClassPath : classPath) {
            // it is critical not to have "." and ".." in classpath elements
            final File file = aClassPath.getCanonicalFile();
            urls.add(file.toURI().toURL());
        }
        return new PluginClassLoader(urls, parentLoaders, pluginId, pluginDescriptor.getVersion(), pluginRoot);
    } catch (MalformedURLException e) {
        getLogger().warn(e);
    } catch (IOException e) {
        getLogger().warn(e);
    }
    return null;
}
Also used : MalformedURLException(java.net.MalformedURLException) UrlClassLoader(com.intellij.util.lang.UrlClassLoader) URLClassLoader(java.net.URLClassLoader) PluginClassLoader(com.intellij.ide.plugins.cl.PluginClassLoader) Method(java.lang.reflect.Method) ZipFile(java.util.zip.ZipFile) InvocationTargetException(java.lang.reflect.InvocationTargetException) URL(java.net.URL) PluginClassLoader(com.intellij.ide.plugins.cl.PluginClassLoader) Nullable(org.jetbrains.annotations.Nullable)

Aggregations

PluginClassLoader (com.intellij.ide.plugins.cl.PluginClassLoader)6 UrlClassLoader (com.intellij.util.lang.UrlClassLoader)3 URL (java.net.URL)3 IdeaPluginDescriptor (com.intellij.ide.plugins.IdeaPluginDescriptor)2 URLClassLoader (java.net.URLClassLoader)2 ZipFile (java.util.zip.ZipFile)2 IdeaPluginDescriptorImpl (com.intellij.ide.plugins.IdeaPluginDescriptorImpl)1 PluginDescriptor (com.intellij.openapi.extensions.PluginDescriptor)1 THashMap (gnu.trove.THashMap)1 File (java.io.File)1 IOException (java.io.IOException)1 InvocationTargetException (java.lang.reflect.InvocationTargetException)1 Method (java.lang.reflect.Method)1 MalformedURLException (java.net.MalformedURLException)1 NotNull (org.jetbrains.annotations.NotNull)1 Nullable (org.jetbrains.annotations.Nullable)1 TestClass (org.junit.runners.model.TestClass)1