fix classloading of UI Designer components?
authorDmitry Jemerov <yole@jetbrains.com>
Tue, 29 Jun 2010 16:16:07 +0000 (20:16 +0400)
committerDmitry Jemerov <yole@jetbrains.com>
Tue, 29 Jun 2010 16:24:07 +0000 (20:24 +0400)
plugins/ui-designer/src/com/intellij/uiDesigner/LoaderFactory.java
plugins/ui-designer/src/com/intellij/uiDesigner/radComponents/RadScrollPane.java

index 045fa053751a6bb060354e37c60974c51d1c6293..cf15bb7d9e151f01f343cca2cf8de3e67671094c 100644 (file)
@@ -91,7 +91,7 @@ public final class LoaderFactory {
 
     final String runClasspath = OrderEnumerator.orderEntries(module).recursively().getPathsList().getPathsString();
 
-    final ClassLoader classLoader = createClassLoader(runClasspath);
+    final ClassLoader classLoader = createClassLoader(runClasspath, module.getName());
 
     myModule2ClassLoader.put(module, classLoader);
 
@@ -100,13 +100,13 @@ public final class LoaderFactory {
 
   @NotNull public ClassLoader getProjectClassLoader() {
     if (myProjectClassLoader == null) {
-      final String runClasspath = OrderEnumerator.orderEntries(myProject).getPathsList().getPathsString();
-      myProjectClassLoader = createClassLoader(runClasspath);
+      final String runClasspath = OrderEnumerator.orderEntries(myProject).withoutSdk().getPathsList().getPathsString();
+      myProjectClassLoader = createClassLoader(runClasspath, "<project>");
     }
     return myProjectClassLoader;
   }
 
-  private static ClassLoader createClassLoader(final String runClasspath) {
+  private static ClassLoader createClassLoader(final String runClasspath, final String moduleName) {
     final ArrayList<URL> urls = new ArrayList<URL>();
     final VirtualFileManager manager = VirtualFileManager.getInstance();
     final JarFileSystemImpl fileSystem = (JarFileSystemImpl)JarFileSystem.getInstance();
@@ -131,7 +131,7 @@ public final class LoaderFactory {
     }
 
     final URL[] _urls = urls.toArray(new URL[urls.size()]);
-    return new DesignTimeClassLoader(Arrays.asList(_urls), null);
+    return new DesignTimeClassLoader(Arrays.asList(_urls), LoaderFactory.class.getClassLoader(), moduleName);
   }
 
   public void clearClassLoaderCache() {
@@ -152,8 +152,16 @@ public final class LoaderFactory {
   }
 
   private static class DesignTimeClassLoader extends UrlClassLoader {
-    public DesignTimeClassLoader(final List<URL> urls, final ClassLoader parent) {
+    private final String myModuleName;
+
+    public DesignTimeClassLoader(final List<URL> urls, final ClassLoader parent, final String moduleName) {
       super(urls, parent);
+      myModuleName = moduleName;
+    }
+
+    @Override
+    public String toString() {
+      return "DesignTimeClassLoader:" + myModuleName;
     }
   }
 }
index 1d04c09c951de61b1b8b8d8e4e7843e1264e69b6..fc92e40880e1380ee24c25a0d427f957f26ff76c 100644 (file)
@@ -15,8 +15,8 @@
  */
 package com.intellij.uiDesigner.radComponents;
 
+import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.module.Module;
-import com.intellij.ui.components.JBScrollPane;
 import com.intellij.uiDesigner.UIFormXmlConstants;
 import com.intellij.uiDesigner.XmlWriter;
 import com.intellij.uiDesigner.core.GridConstraints;
@@ -37,7 +37,8 @@ import java.awt.*;
  * @author Vladimir Kondratyev
  */
 public final class RadScrollPane extends RadContainer {
-  public static final Class COMPONENT_CLASS = JBScrollPane.class;
+  public static final Class COMPONENT_CLASS = JScrollPane.class;
+  private static final Logger LOG = Logger.getInstance("#com.intellij.uiDesigner.radComponents.RadScrollPane");
 
   public static class Factory extends RadComponentFactory {
     public RadComponent newInstance(Module module, Class aClass, String id) {
@@ -65,7 +66,7 @@ public final class RadScrollPane extends RadContainer {
   public void write(final XmlWriter writer) {
     writer.startElement(UIFormXmlConstants.ELEMENT_SCROLLPANE);
     try {
-      writeNoLayout(writer, JBScrollPane.class.getName());
+      writeNoLayout(writer, JScrollPane.class.getName());
     } finally {
       writer.endElement(); // scrollpane
     }
@@ -77,7 +78,7 @@ public final class RadScrollPane extends RadContainer {
 
   @Override
   protected void importSnapshotComponent(final SnapshotContext context, final JComponent component) {
-    JBScrollPane scrollPane = (JBScrollPane) component;
+    JScrollPane scrollPane = (JScrollPane) component;
     final Component view = scrollPane.getViewport().getView();
     if (view instanceof JComponent) {
       RadComponent childComponent = createSnapshotComponent(context, (JComponent) view);
@@ -106,14 +107,22 @@ public final class RadScrollPane extends RadContainer {
     }
 
     public void addComponentToContainer(final RadContainer container, final RadComponent component, final int index) {
-      final JBScrollPane scrollPane = (JBScrollPane)container.getDelegee();
-      final JComponent delegee = component.getDelegee();
-      delegee.setLocation(0,0);
-      scrollPane.setViewportView(delegee);
+      try {
+        final JScrollPane scrollPane = (JScrollPane)container.getDelegee();
+        final JComponent delegee = component.getDelegee();
+        delegee.setLocation(0,0);
+        scrollPane.setViewportView(delegee);
+      }
+      catch (ClassCastException e) {
+        LOG.info(e);
+        LOG.info("container classloader=" + container.getDelegee().getClass().getClassLoader());
+        LOG.info("component classloader=" + component.getDelegee().getClass().getClassLoader());
+        throw e;
+      }
     }
 
     @Override public void removeComponentFromContainer(final RadContainer container, final RadComponent component) {
-      final JBScrollPane scrollPane = (JBScrollPane)container.getDelegee();
+      final JScrollPane scrollPane = (JScrollPane)container.getDelegee();
       scrollPane.setViewportView(null);
     }
   }