Bug 40975 - Problem loading a persistent class in a plugin
Summary: Problem loading a persistent class in a plugin
Status: RESOLVED DUPLICATE of bug 8907
Alias: None
Product: Platform
Classification: Eclipse Project
Component: Resources (show other bugs)
Version: 2.1.1   Edit
Hardware: PC Windows XP
: P3 normal with 1 vote (vote)
Target Milestone: ---   Edit
Assignee: Platform-Resources-Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks:
 
Reported: 2003-07-30 16:06 EDT by Vladimir CLA
Modified: 2004-06-08 10:37 EDT (History)
1 user (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Vladimir CLA 2003-07-30 16:06:38 EDT
While using an objectdb (jdo-compliant) persistence layer as an Eclipse 
plugin, I am running into a problem loading some classes. Below is 
communication with the objectdb, which includes information about this issue. 
Please let me know if I may supply additional information. 

Thanks.

-----Original Message-----
From: support@objectdb.com 
Sent: Wednesday, July 30, 2003 2:38 PM
To: Vladimir Gusev
Subject: Re: ObjectDB Support Request - odbfe - 0.97


It is clear to me now that this is an Eclipse plugin bug - obviously it is 
Eclipse job to initialize the context class loader. I checked again and 
ObjectDB implements the JDO specification on this issue very precisely. You 
can report this bug to Eclipse team if you like, and meanwhile keep setting 
the context class loader by yourself BEFORE the first use of ObjectDB (not 
just before makePersistent).
 
Ilan
----- Original Message ----- 
From: Vladimir Gusev 
To: support@objectdb.com 
Sent: Wednesday, July 30, 2003 8:14 PM
Subject: RE: ObjectDB Support Request - odbfe - 0.97


Ilan,

 

Either of these solutions worked. Thanks a lot.

 

Vladimir

 

-----Original Message-----
From: support@objectdb.com 
Sent: Wednesday, July 30, 2003 11:47 AM
To: Vladimir Gusev
Subject: Re: ObjectDB Support Request - odbfe - 0.97

 

The stack trace is very useful and I can see now where the exception is 
thrown. From some unknown reason, com.graphlogic.pc.PersistanceClass is not 
found by the thread's context class loader (as expected by the JDO 
specification) - maybe the thread's context class loader is not initialized 
well by Eclipse plugin runner.

 

Please try the following workaround, before calling makePersistent:

 

    Thread.currentThread().setContextClassLoader
(PersistanceClass.class.getClassLoader());

 

Or maybe:

 

    Thread.currentThread().setContextClassLoader(getClass().getClassLoader());

 

Please tell me what you found.

 

Ilan

 

----- Original Message ----- 

From: Vladimir Gusev 

To: support@objectdb.com 

Sent: Wednesday, July 30, 2003 6:05 PM

Subject: RE: ObjectDB Support Request - odbfe - 0.97

 

Here is the output on my console (the first line is printed while getting 
persistence manager) – the rest on executing “pm.makePersistent(process);” line

 

Vladimir

 

Database 'c:\GLJDO.odb' is ready now...

java.lang.ClassNotFoundException: com.graphlogic.pc.PersistanceClass

      at java.net.URLClassLoader$1.run(Unknown Source)

      at java.security.AccessController.doPrivileged(Native Method)

      at java.net.URLClassLoader.findClass(Unknown Source)

      at java.lang.ClassLoader.loadClass(Unknown Source)

      at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

      at java.lang.ClassLoader.loadClass(Unknown Source)

      at java.lang.ClassLoader.loadClassInternal(Unknown Source)

      at java.lang.Class.forName0(Native Method)

      at java.lang.Class.forName(Unknown Source)

      at com.objectdb.core.type.TypeManager.loadPersistentClass
(TypeManager.java:227)

      at com.objectdb.core.type.PersistentTypeInfo.getTypeClass
(PersistentTypeInfo.java:564)

      at com.objectdb.core.type.PersistentTypeInfo.<init>
(PersistentTypeInfo.java:290)

      at com.objectdb.core.type.TypeManager.getTypeInfo(TypeManager.java:308)

      at com.objectdb.core.type.PersistentTypeInfo.readVersion
(PersistentTypeInfo.java:667)

      at com.objectdb.core.type.PersistentTypeInfo.<init>
(PersistentTypeInfo.java:286)

      at com.objectdb.core.type.TypeManager.loadUserVersion
(TypeManager.java:489)

      at com.objectdb.core.type.TypeManager.getTypeInfo(TypeManager.java:400)

      at com.objectdb.core.type.TypeManager.getTypeInfoByObj
(TypeManager.java:339)

      at com.objectdb.core.object.ObjectManager.startManaging
(ObjectManager.java:858)

      at com.objectdb.core.object.ObjectManager.makePersistent
(ObjectManager.java:493)

      at com.objectdb.jdo.PMImpl.doOperation(PMImpl.java:690)

      at com.objectdb.jdo.PMImpl.doSimpleOperation(PMImpl.java:603)

      at com.objectdb.jdo.PMImpl.makePersistent(PMImpl.java:274)

      at 
com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.addSamplePro
cessPersistanceObject(MovingBoxView.java:324)

      at 
com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.getInitalInp
ut(MovingBoxView.java:342)

      at 
com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.createPartCo
ntrol(MovingBoxView.java:104)

      at org.eclipse.ui.internal.PartPane$4.run(PartPane.java:141)

      at org.eclipse.core.internal.runtime.InternalPlatform.run
(InternalPlatform.java:1006)

      at org.eclipse.core.runtime.Platform.run(Platform.java:413)

      at org.eclipse.ui.internal.PartPane.createChildControl(PartPane.java:137)

      at org.eclipse.ui.internal.ViewPane.createChildControl(ViewPane.java:211)

      at org.eclipse.ui.internal.PartPane.createControl(PartPane.java:186)

      at org.eclipse.ui.internal.ViewPane.createControl(ViewPane.java:190)

      at org.eclipse.ui.internal.PartTabFolder.createPartTab
(PartTabFolder.java:252)

      at org.eclipse.ui.internal.PartTabFolder.createControl
(PartTabFolder.java:224)

      at org.eclipse.ui.internal.PartSashContainer.createControl
(PartSashContainer.java:192)

      at org.eclipse.ui.internal.PerspectivePresentation.activate
(PerspectivePresentation.java:96)

      at org.eclipse.ui.internal.Perspective.onActivate(Perspective.java:725)

      at org.eclipse.ui.internal.WorkbenchPage.onActivate
(WorkbenchPage.java:1799)

      at org.eclipse.ui.internal.WorkbenchWindow$7.run
(WorkbenchWindow.java:1496)

      at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)

      at org.eclipse.ui.internal.WorkbenchWindow.setActivePage
(WorkbenchWindow.java:1483)

      at org.eclipse.ui.internal.WorkbenchWindow.restoreState
(WorkbenchWindow.java:1363)

      at org.eclipse.ui.internal.Workbench.restoreState(Workbench.java:1263)

      at org.eclipse.ui.internal.Workbench.access$10(Workbench.java:1223)

      at org.eclipse.ui.internal.Workbench$12.run(Workbench.java:1141)

      at org.eclipse.core.internal.runtime.InternalPlatform.run
(InternalPlatform.java:1006)

      at org.eclipse.core.runtime.Platform.run(Platform.java:413)

      at org.eclipse.ui.internal.Workbench.openPreviousWorkbenchState
(Workbench.java:1093)

      at org.eclipse.ui.internal.Workbench.init(Workbench.java:870)

      at org.eclipse.ui.internal.Workbench.run(Workbench.java:1373)

      at org.eclipse.core.internal.boot.InternalBootLoader.run
(InternalBootLoader.java:858)

      at org.eclipse.core.boot.BootLoader.run(BootLoader.java:461)

      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

      at java.lang.reflect.Method.invoke(Unknown Source)

      at org.eclipse.core.launcher.Main.basicRun(Main.java:291)

      at org.eclipse.core.launcher.Main.run(Main.java:747)

      at org.eclipse.core.launcher.Main.main(Main.java:583)

java.lang.ClassNotFoundException: com.graphlogic.pc.PersistanceClass

      at java.net.URLClassLoader$1.run(Unknown Source)

      at java.security.AccessController.doPrivileged(Native Method)

      at java.net.URLClassLoader.findClass(Unknown Source)

      at java.lang.ClassLoader.loadClass(Unknown Source)

      at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)

      at java.lang.ClassLoader.loadClass(Unknown Source)

      at java.lang.ClassLoader.loadClassInternal(Unknown Source)

      at java.lang.Class.forName0(Native Method)

      at java.lang.Class.forName(Unknown Source)

      at com.objectdb.core.type.TypeManager.loadPersistentClass
(TypeManager.java:227)

      at com.objectdb.core.type.PersistentTypeInfo.getTypeClass
(PersistentTypeInfo.java:564)

      at com.objectdb.core.type.PersistentTypeInfo.checkUpToDate
(PersistentTypeInfo.java:321)

      at com.objectdb.core.type.PersistentTypeInfo.<init>
(PersistentTypeInfo.java:294)

      at com.objectdb.core.type.TypeManager.getTypeInfo(TypeManager.java:308)

      at com.objectdb.core.type.PersistentTypeInfo.readVersion
(PersistentTypeInfo.java:667)

      at com.objectdb.core.type.PersistentTypeInfo.<init>
(PersistentTypeInfo.java:286)

      at com.objectdb.core.type.TypeManager.loadUserVersion
(TypeManager.java:489)

      at com.objectdb.core.type.TypeManager.getTypeInfo(TypeManager.java:400)

      at com.objectdb.core.type.TypeManager.getTypeInfoByObj
(TypeManager.java:339)

      at com.objectdb.core.object.ObjectManager.startManaging
(ObjectManager.java:858)

      at com.objectdb.core.object.ObjectManager.makePersistent
(ObjectManager.java:493)

      at com.objectdb.jdo.PMImpl.doOperation(PMImpl.java:690)

      at com.objectdb.jdo.PMImpl.doSimpleOperation(PMImpl.java:603)

      at com.objectdb.jdo.PMImpl.makePersistent(PMImpl.java:274)

      at 
com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.addSamplePro
cessPersistanceObject(MovingBoxView.java:324)

      at 
com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.getInitalInp
ut(MovingBoxView.java:342)

      at 
com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.createPartCo
ntrol(MovingBoxView.java:104)

      at org.eclipse.ui.internal.PartPane$4.run(PartPane.java:141)

      at org.eclipse.core.internal.runtime.InternalPlatform.run
(InternalPlatform.java:1006)

      at org.eclipse.core.runtime.Platform.run(Platform.java:413)

      at org.eclipse.ui.internal.PartPane.createChildControl(PartPane.java:137)

      at org.eclipse.ui.internal.ViewPane.createChildControl(ViewPane.java:211)

      at org.eclipse.ui.internal.PartPane.createControl(PartPane.java:186)

      at org.eclipse.ui.internal.ViewPane.createControl(ViewPane.java:190)

      at org.eclipse.ui.internal.PartTabFolder.createPartTab
(PartTabFolder.java:252)

      at org.eclipse.ui.internal.PartTabFolder.createControl
(PartTabFolder.java:224)

      at org.eclipse.ui.internal.PartSashContainer.createControl
(PartSashContainer.java:192)

      at org.eclipse.ui.internal.PerspectivePresentation.activate
(PerspectivePresentation.java:96)

      at org.eclipse.ui.internal.Perspective.onActivate(Perspective.java:725)

      at org.eclipse.ui.internal.WorkbenchPage.onActivate
(WorkbenchPage.java:1799)

      at org.eclipse.ui.internal.WorkbenchWindow$7.run
(WorkbenchWindow.java:1496)

      at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)

      at org.eclipse.ui.internal.WorkbenchWindow.setActivePage
(WorkbenchWindow.java:1483)

      at org.eclipse.ui.internal.WorkbenchWindow.restoreState
(WorkbenchWindow.java:1363)

      at org.eclipse.ui.internal.Workbench.restoreState(Workbench.java:1263)

      at org.eclipse.ui.internal.Workbench.access$10(Workbench.java:1223)

      at org.eclipse.ui.internal.Workbench$12.run(Workbench.java:1141)

      at org.eclipse.core.internal.runtime.InternalPlatform.run
(InternalPlatform.java:1006)

      at org.eclipse.core.runtime.Platform.run(Platform.java:413)

      at org.eclipse.ui.internal.Workbench.openPreviousWorkbenchState
(Workbench.java:1093)

      at org.eclipse.ui.internal.Workbench.init(Workbench.java:870)

      at org.eclipse.ui.internal.Workbench.run(Workbench.java:1373)

      at org.eclipse.core.internal.boot.InternalBootLoader.run
(InternalBootLoader.java:858)

      at org.eclipse.core.boot.BootLoader.run(BootLoader.java:461)

      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

      at java.lang.reflect.Method.invoke(Unknown Source)

      at org.eclipse.core.launcher.Main.basicRun(Main.java:291)

      at org.eclipse.core.launcher.Main.run(Main.java:747)

      at org.eclipse.core.launcher.Main.main(Main.java:583)

java.lang.NullPointerException

      at javax.jdo.spi.JDOImplHelper.getMeta(Unknown Source)

      at javax.jdo.spi.JDOImplHelper.newInstance(Unknown Source)

      at com.objectdb.core.type.PersistentTypeInfo.<init>
(PersistentTypeInfo.java:296)

      at com.objectdb.core.type.TypeManager.getTypeInfo(TypeManager.java:308)

      at com.objectdb.core.type.PersistentTypeInfo.readVersion
(PersistentTypeInfo.java:667)

      at com.objectdb.core.type.PersistentTypeInfo.<init>
(PersistentTypeInfo.java:286)

      at com.objectdb.core.type.TypeManager.loadUserVersion
(TypeManager.java:489)

      at com.objectdb.core.type.TypeManager.getTypeInfo(TypeManager.java:400)

      at com.objectdb.core.type.TypeManager.getTypeInfoByObj
(TypeManager.java:339)

      at com.objectdb.core.object.ObjectManager.startManaging
(ObjectManager.java:858)

      at com.objectdb.core.object.ObjectManager.makePersistent
(ObjectManager.java:493)

      at com.objectdb.jdo.PMImpl.doOperation(PMImpl.java:690)

      at com.objectdb.jdo.PMImpl.doSimpleOperation(PMImpl.java:603)

      at com.objectdb.jdo.PMImpl.makePersistent(PMImpl.java:274)

      at 
com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.addSamplePro
cessPersistanceObject(MovingBoxView.java:324)

      at 
com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.getInitalInp
ut(MovingBoxView.java:342)

      at 
com.graphlogic.eclipse.views.navigator.treeviewer.ui.MovingBoxView.createPartCo
ntrol(MovingBoxView.java:104)

      at org.eclipse.ui.internal.PartPane$4.run(PartPane.java:141)

      at org.eclipse.core.internal.runtime.InternalPlatform.run
(InternalPlatform.java:1006)

      at org.eclipse.core.runtime.Platform.run(Platform.java:413)

      at org.eclipse.ui.internal.PartPane.createChildControl(PartPane.java:137)

      at org.eclipse.ui.internal.ViewPane.createChildControl(ViewPane.java:211)

      at org.eclipse.ui.internal.PartPane.createControl(PartPane.java:186)

      at org.eclipse.ui.internal.ViewPane.createControl(ViewPane.java:190)

      at org.eclipse.ui.internal.PartTabFolder.createPartTab
(PartTabFolder.java:252)

      at org.eclipse.ui.internal.PartTabFolder.createControl
(PartTabFolder.java:224)

      at org.eclipse.ui.internal.PartSashContainer.createControl
(PartSashContainer.java:192)

      at org.eclipse.ui.internal.PerspectivePresentation.activate
(PerspectivePresentation.java:96)

      at org.eclipse.ui.internal.Perspective.onActivate(Perspective.java:725)

      at org.eclipse.ui.internal.WorkbenchPage.onActivate
(WorkbenchPage.java:1799)

      at org.eclipse.ui.internal.WorkbenchWindow$7.run
(WorkbenchWindow.java:1496)

      at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:69)

      at org.eclipse.ui.internal.WorkbenchWindow.setActivePage
(WorkbenchWindow.java:1483)

      at org.eclipse.ui.internal.WorkbenchWindow.restoreState
(WorkbenchWindow.java:1363)

      at org.eclipse.ui.internal.Workbench.restoreState(Workbench.java:1263)

      at org.eclipse.ui.internal.Workbench.access$10(Workbench.java:1223)

      at org.eclipse.ui.internal.Workbench$12.run(Workbench.java:1141)

      at org.eclipse.core.internal.runtime.InternalPlatform.run
(InternalPlatform.java:1006)

      at org.eclipse.core.runtime.Platform.run(Platform.java:413)

      at org.eclipse.ui.internal.Workbench.openPreviousWorkbenchState
(Workbench.java:1093)

      at org.eclipse.ui.internal.Workbench.init(Workbench.java:870)

      at org.eclipse.ui.internal.Workbench.run(Workbench.java:1373)

      at org.eclipse.core.internal.boot.InternalBootLoader.run
(InternalBootLoader.java:858)

      at org.eclipse.core.boot.BootLoader.run(BootLoader.java:461)

      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)

      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)

      at java.lang.reflect.Method.invoke(Unknown Source)

      at org.eclipse.core.launcher.Main.basicRun(Main.java:291)

      at org.eclipse.core.launcher.Main.run(Main.java:747)

      at org.eclipse.core.launcher.Main.main(Main.java:583)
Comment 1 Ilan Kirsh CLA 2003-07-31 10:22:42 EDT
It seems to me that the solution is very simple.
Probably one of the Eclipse methods which are mentioned in the stack trace 
bellow should initialize the context class loader using:
  Thread.currentThread().setContextClassLoader(...);
Otherwise, no JDO implementation will work from a plugin directly (unless using 
the workaround mentioned bellow).

Setting the context class loader is also done in other environments in which a 
new thread is assigned to do some user work (with a user private classpath), 
like in web servers and in application servers.

Ilan Kirsh
ObjectDB Software
http://www.objectdb.com
Comment 2 Rafael Chaves CLA 2003-07-31 13:59:52 EDT
This is a known issue in Eclipse, and unfortunately your workaround is the way
to go. For details see: bug 8907, bug 37441 and bug 30588.

*** This bug has been marked as a duplicate of 8907 ***
Comment 3 Balaji Kandan CLA 2004-06-08 10:37:09 EDT
Thread.setContextLoader() solution works only if all the persistent capable 
classes are present in the same plugin. You can do a set contextloader  to 
point the correct plugin classloader while loading each of the classes, 
however if u have inheritance with super-class in one plugin and subclass in 
another plugin, chances are that you will never get this work. This is 
primarily because the persistent-capable subclass uses the persistent-capable 
superclass to load itself. Solution for this problem has to be provided by jdo 
vendors, and the workaround wud be to use interface instead of a concrete 
super-class.

Balaji Kandan
w: http://www.orangescape.com