[ 
https://issues.apache.org/jira/browse/TUSCANY-1293?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12503417
 ] 

Bryan Hunt commented on TUSCANY-1293:
-------------------------------------

The fundamental issue is the use of class loaders.  This project (and others 
like it - Hibernate) assume that there is a single class loader and that all 
necessary classes can be found using this class loader.  This is fine until you 
want to use the technology with OSGi.  OSGi mandates one class loader per 
bundle.  When a class is loaded from a bundle, any classes the loaded class is 
dependent on must come from it's bundle, or a bundle that has been explicitly 
declared as a dependency it's MANIFEST.MF.  When you package something like SDO 
or hibernate as a bundle, there is no way to declare those dependencies.  

Eclipse has a "workaround" for this problem called the buddy policy.  There are 
various types of buddy policies that I won't discuss as you can find a much 
better explination by a simple google search on "eclipse buddy policy".  While 
this works for Eclipse, I don't believe it's part of the OSGi specification and 
won't work with other OSGi implementations.

For the sort term, you might consider removing the ability to build Eclipse 
plug-ins (OSGi bundles) from your pom.  For the long term, you might consider 
re-architecting the class loader to be compatible with OSGi.


> SDO does not work with OSGi
> ---------------------------
>
>                 Key: TUSCANY-1293
>                 URL: https://issues.apache.org/jira/browse/TUSCANY-1293
>             Project: Tuscany
>          Issue Type: Bug
>          Components: Java SDO Implementation
>    Affects Versions: Java-SDO-beta1
>         Environment: OS X Eclipse 3.3 M7
>            Reporter: Bryan Hunt
>            Priority: Blocker
>             Fix For: Java-SDO-Next
>
>
> 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.HelperProviderImpl
> 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.
>  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.runApplication(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.createXSDMetaData(InternalFactoryImpl.java:211)
> at 
> org.apache.tuscany.sdo.model.internal.impl.InternalFactoryImpl.initializeMetaData(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

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to