I tried modifying the API manifest by hand to add
Eclipse-BuddyPolicy: dependent
and
Eclipse-BuddyPolicy: global
Either of those buddy policies will get past the class loader problem
(although I believe this is specific to eclipse and won't work for
OSGi in general), but when HelperProvider is initializing, you get
the following exception:
java.lang.ExceptionInInitializerError
at org.apache.tuscany.sdo.impl.AttributeImpl.<clinit>
(AttributeImpl.java:126)
at org.apache.tuscany.sdo.impl.SDOFactoryImpl.createAttribute
(SDOFactoryImpl.java:239)
at org.apache.tuscany.sdo.impl.ClassImpl.<clinit>(ClassImpl.java:68)
at org.apache.tuscany.sdo.impl.SDOFactoryImpl
$SDOEcoreFactory.createEClass(SDOFactoryImpl.java:76)
at org.apache.tuscany.sdo.impl.SDOPackageImpl.createEClass
(SDOPackageImpl.java:622)
at org.apache.tuscany.sdo.impl.SDOPackageImpl.createPackageContents
(SDOPackageImpl.java:550)
at org.apache.tuscany.sdo.impl.SDOPackageImpl.init
(SDOPackageImpl.java:259)
at org.apache.tuscany.sdo.SDOPackage.<clinit>(SDOPackage.java:76)
at sun.misc.Unsafe.ensureClassInitialized(Native Method)
at sun.reflect.UnsafeFieldAccessorFactory.newFieldAccessor
(UnsafeFieldAccessorFactory.java:25)
at sun.reflect.ReflectionFactory.newFieldAccessor
(ReflectionFactory.java:122)
at java.lang.reflect.Field.acquireFieldAccessor(Field.java:917)
at java.lang.reflect.Field.getFieldAccessor(Field.java:898)
at java.lang.reflect.Field.get(Field.java:357)
at org.apache.tuscany.sdo.util.SDOUtil.registerStaticTypes
(SDOUtil.java:196)
at org.apache.tuscany.sdo.model.impl.ModelFactoryImpl.init
(ModelFactoryImpl.java:731)
at org.apache.tuscany.sdo.model.ModelFactory.<clinit>
(ModelFactory.java:41)
at org.apache.tuscany.sdo.helper.TypeHelperImpl.getBuiltInModels
(TypeHelperImpl.java:61)
at org.apache.tuscany.sdo.helper.TypeHelperImpl.<init>
(TypeHelperImpl.java:79)
at org.apache.tuscany.sdo.helper.HelperContextImpl.<init>
(HelperContextImpl.java:46)
at
org.apache.tuscany.sdo.helper.HelperProviderImpl.createDefaultHelpers
(HelperProviderImpl.java:38)
at org.apache.tuscany.sdo.rtlib.helper.HelperProviderBase.<init>
(HelperProviderBase.java:78)
at org.apache.tuscany.sdo.helper.HelperProviderImpl.<init>
(HelperProviderImpl.java:31)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance
(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance
(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
at java.lang.Class.newInstance0(Class.java:350)
at java.lang.Class.newInstance(Class.java:303)
at commonj.sdo.impl.HelperProvider.loadImplementation
(HelperProvider.java:157)
at commonj.sdo.impl.HelperProvider.getInstance(HelperProvider.java:126)
at commonj.sdo.impl.HelperProvider.<clinit>(HelperProvider.java:69)
at commonj.sdo.helper.XSDHelper.<clinit>(XSDHelper.java:195)
at notification.sdo.Application.start(Application.java:23)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run
(EclipseAppHandle.java:153)
at
org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplicat
ion(EclipseAppLauncher.java:106)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start
(EclipseAppLauncher.java:76)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run
(EclipseStarter.java:363)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run
(EclipseStarter.java:176)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke
(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke
(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:497)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:436)
at org.eclipse.equinox.launcher.Main.run(Main.java:1162)
at org.eclipse.equinox.launcher.Main.main(Main.java:1137)
Caused by: java.lang.NullPointerException
at org.apache.tuscany.sdo.impl.AttributeImpl.eStaticClass
(AttributeImpl.java:73)
at org.eclipse.emf.ecore.impl.EObjectImpl.eClass(EObjectImpl.java:224)
at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eDynamicInverseAdd
(BasicEObjectImpl.java:1413)
at org.eclipse.emf.ecore.impl.EStructuralFeatureImpl.eInverseAdd
(EStructuralFeatureImpl.java:514)
at org.eclipse.emf.ecore.impl.BasicEObjectImpl.eInverseAdd
(BasicEObjectImpl.java:1389)
at org.eclipse.emf.ecore.util.EcoreEList.inverseAdd(EcoreEList.java:282)
at org.eclipse.emf.common.notify.impl.NotifyingListImpl.addUnique
(NotifyingListImpl.java:318)
at org.eclipse.emf.common.util.BasicEList.add(BasicEList.java:626)
at org.eclipse.emf.ecore.impl.EPackageImpl.createEAttribute
(EPackageImpl.java:745)
at org.apache.tuscany.sdo.impl.FactoryBase.createDocumentRoot
(FactoryBase.java:301)
at org.apache.tuscany.sdo.impl.FactoryBase.initXSD(FactoryBase.java:156)
at
org.apache.tuscany.sdo.model.internal.impl.InternalFactoryImpl.createXSD
MetaData(InternalFactoryImpl.java:211)
at
org.apache.tuscany.sdo.model.internal.impl.InternalFactoryImpl.initializ
eMetaData(InternalFactoryImpl.java:206)
at org.apache.tuscany.sdo.model.internal.impl.InternalFactoryImpl.init
(InternalFactoryImpl.java:172)
at org.apache.tuscany.sdo.model.internal.InternalFactory.<clinit>
(InternalFactory.java:41)
... 47 more
On May 16, 2007, at 1:50 PM, Bryan Hunt wrote:
Now that I have the SDO jars recognized as OSGi bundles, I'm trying
to run a simple test that I had working with the standalone jars.
When I execute:
XSDHelper.INSTANCE.define(schema, null);
I end up with a NullPointerException. I've tracked down root
cause ...
The static initializer of the HelperProvider executes this code:
provider = getInstance(HelperProvider.class.getClassLoader());
which ends up calling:
HelperProvider provider = loadImplementation(cl, implName);
implName is null so
if (implName == null) {
implName = getImplementationName(cl);
}
ends up calling
implName = getImplementationName(cl);
which ends up calling:
InputStream is = cl.getResourceAsStream(SERVICE_RESOURCE_NAME);
where SERVICE_RESORUCE_NAME = "META-INF/services/
commonj.sdo.impl.HelperProvider"
getResourceAsStream() return null because META-INF/services does
not exist in the API bundle. It exists in the IMPL bundle and
since you are using the class loader from the API bundle, it won't
work.
You can set
-
Dcommonj.sdo.impl.HelperProvider=org.apache.tuscany.sdo.helper.HelperP
roviderImpl
to get around the above problem, but as soon as
return (HelperProvider) cl.loadClass(implName).newInstance();
executes, you get a CalssNotFoundException. Again, this is because
you are trying to load a class outside the bundle with the wrong
class loader.
My current conclusion is that SDO is completely broken.
Bryan