A further couple of comments. One is that I think you are hitting the nasty "when is a singleton not a singleton" problem [1], and this may be a time when the Tuscany specific CrossScopeCopyHelper may be of interest (I haven't used it but I know it plays a part in this multiple classloader scenarios)
Kelvin. [1] http://www.javaworld.com/jw-01-2001/jw-0112-singleton.html 2009/11/26 Malisetti, Ramanjaneyulu <[email protected]>: > Now I understood the problem. It is happening in scenario like if we load > two XSDs from different classes with same URI but different types in them, > XSDHelper is keeping only types from first XSD. Here, two different classes > mean their class loaders are different. If we load same two XSDs from > single class then there is no issue. is this the expected behavior? > > Regards > > Raman > > _____________________________________________ > From: Malisetti, Ramanjaneyulu > Sent: Wednesday, 25 November 2009 5:39 PM > > To: '[email protected]' > Subject: RE: SDO UnmarshalException > > Hi Kelvin, > > << File: SDO-Marshall-Exception.zip >> > > After so many trails I found the problem. The issue is where we are loading > Schemas and XML files with XMLHelpter.INSTANCE object. For example, if we > write one facade class to encapsulate all calls to SDO Api, it is leading to > issues like, “Feature not Found” while loading XML resource after loading > XSDs or ClassCastException: The feature 'xxxx's type 'DataObject' does not > permit a value of type 'xxx'. This is kind of issues can be avoided if we > call XMLHelpter.INSTANCE.define/load in our implementation. > > Here I attached sample source which is slightly complex example. I have > taken this scenario to replicate marshall error. However, I got symptoms of > the issue before I reach to RMI. So, you can see the issue from very > begining of the running Test from sdo.rmi.sample.hello RemoteDescriptor. To > illustrate the issue w.r.t attached sample… > > - sdo.rmi.sampl.impl.util.BeanXmlHelper.java is a façade class which > encapsulate SDO APIs > > - I load XSDs and XML with help of BeanXmlHelper in > sdo.rmi.sample.hello.HelloDescriptor and sdo.rmi.sampl.impl.XMLDescriptor > > - I use HelloDescriptor in HelloConnector. > > What is the right way of loading XSDs and XMLs so that I can have dynamic > types in my code and can use them without in issues across different > classloaders? > > I don’t have much exp in using SDO APIs, please bear me if these questions > are very basic. I appreciate your help. > > Thanks in advance.. > > Regards > > Raman > > _____________________________________________ > From: Malisetti, Ramanjaneyulu > Sent: Monday, 23 November 2009 4:29 PM > To: '[email protected]' > Subject: RE: SDO UnmarshalException > > Thanks Kelvin for quick response. I am trying to reproduce with sample > program so that I can share that with you. Apparently, no luck. It means > there is something we are doing differently. I have been trying to identify > that.. > > I’ll post progress. > > Regards > > Raman > > to be sure about this, I'd need to be able to recreate the problem > > with a bit of test code, and I've not played with SDO using RMI calls, > > but the SDO metadata associated with the namespace URI must be > > available when the XML document is parsed. This would be made > > available when either the XSDHelper is used to load a schema or > > generated SDO classes are registered with the environment, and it is > > going to need to be available in the jvm that the xml parsing is > > happening. > > Kelvin. > > _____________________________________________ > From: Malisetti, Ramanjaneyulu > Sent: Friday, 20 November 2009 5:21 PM > To: '[email protected]' > Subject: SDO UnmarshalException > > Hi, > > We have a class called Descriptor that loads XML and XSD files to > build SDO objects, this we are doing in its constructor. We have another > class called Container that contains Descriptor class. If we make > Container class object as Remotable (Exported as RMI object) and call a > method on remotable object on RMI client side to get descriptor, it is > throwing the following exception . The below “not found URI” is there in > XML file. We are not getting what is the problem. Could you helps us here > what is going wrong? BTW, we ensured all required interfaces as Remote so > that there is nothing wrong on RMI side. > > java.rmi.UnmarshalException: error unmarshalling return; nested exception > is: > > org.eclipse.emf.ecore.resource.Resource$IOWrappedException: Package > with uri 'http://www.abc.com/connex' not found. (http:///temp.xml, 3, 106) > > at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:173) > > at > java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(RemoteObjectInvocationHandler.java:178) > > at > java.rmi.server.RemoteObjectInvocationHandler.invoke(RemoteObjectInvocationHandler.java:132) > > at $Proxy8.getDescriptor(Unknown Source) > > at > com.abc.connector.impl.infrastructure.rmi.RemoteRMIConnectorProxy.getDescriptor(RemoteRMIConnectorProxy.java:66) > > at > com.abc.connector.impl.infrastructure.rmi.test.TestRMIConnector.setUpBeforeClass(TestRMIConnector.java:79) > > 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:597) > > at > org.junit.internal.runners.BeforeAndAfterRunner.invokeMethod(BeforeAndAfterRunner.java:74) > > at > org.junit.internal.runners.BeforeAndAfterRunner.runBefores(BeforeAndAfterRunner.java:50) > > at > org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:33) > > at > org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52) > > at > org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45) > > at > org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) > > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) > > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) > > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) > > at > org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) > > Caused by: org.eclipse.emf.ecore.resource.Resource$IOWrappedException: > Package with uri 'http://www.abc.com/connex' not found. (http:///temp.xml, > 3, 106) > > at > org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl.handleErrors(XMLLoadImpl.java:83) > > at > org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl.load(XMLLoadImpl.java:278) > > at > org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.doLoad(XMLResourceImpl.java:666) > > at > org.apache.tuscany.sdo.util.resource.SDOXMLResourceImpl.doLoad(SDOXMLResourceImpl.java:589) > > at > org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl.load(XMLResourceImpl.java:634) > > at > org.apache.tuscany.sdo.helper.XMLDocumentImpl.load(XMLDocumentImpl.java:266) > > at > org.apache.tuscany.sdo.helper.XMLDocumentImpl.load(XMLDocumentImpl.java:239) > > at > org.apache.tuscany.sdo.helper.XMLHelperImpl.load(XMLHelperImpl.java:97) > > at > org.apache.tuscany.sdo.helper.XMLHelperImpl.load(XMLHelperImpl.java:79) > > at > org.apache.tuscany.sdo.spi.HelperProviderBase$ResolvableImpl.readDataObject(HelperProviderBase.java:229) > > at > org.apache.tuscany.sdo.spi.HelperProviderBase$ResolvableImpl.readExternal(HelperProviderBase.java:161) > > at > commonj.sdo.impl.ExternalizableDelegator.readExternal(ExternalizableDelegator.java:83) > > at > java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1792) > > at > java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1751) > > at > java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) > > at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) > > at > org.apache.tuscany.sdo.spi.HelperProviderBase$ResolvableImpl.readDataObject(HelperProviderBase.java:238) > > at > org.apache.tuscany.sdo.spi.HelperProviderBase$ResolvableImpl.readExternal(HelperProviderBase.java:161) > > at > commonj.sdo.impl.ExternalizableDelegator.readExternal(ExternalizableDelegator.java:83) > > at > java.io.ObjectInputStream.readExternalData(ObjectInputStream.java:1792) > > at > java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1751) > > at > java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) > > at > java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947) > > at > java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871) > > at > java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) > > at > java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) > > at > java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947) > > at > java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1871) > > at > java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753) > > at > java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329) > > at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) > > at sun.rmi.server.UnicastRef.unmarshalValue(UnicastRef.java:306) > > at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:155) > > ... 19 more > > Caused by: org.eclipse.emf.ecore.xmi.PackageNotFoundException: Package with > uri 'http://www.abc.com/connex' not found. (http:///temp.xml, 3, 106) > > at > org.eclipse.emf.ecore.xmi.impl.XMLHandler.getPackageForURI(XMLHandler.java:2350) > > at > org.eclipse.emf.ecore.xmi.impl.XMLHandler.getFactoryForPrefix(XMLHandler.java:2188) > > at > org.eclipse.emf.ecore.xmi.impl.XMLHandler.createObjectFromTypeName(XMLHandler.java:1828) > > at > org.eclipse.emf.ecore.xmi.impl.XMLHandler.createObject(XMLHandler.java:1787) > > at > org.eclipse.emf.ecore.xmi.impl.XMLHandler.handleFeature(XMLHandler.java:1569) > > at > org.eclipse.emf.ecore.xmi.impl.XMLHandler.createDocumentRoot(XMLHandler.java:1237) > > at > org.eclipse.emf.ecore.xmi.impl.XMLHandler.createObjectByType(XMLHandler.java:1165) > > at > org.eclipse.emf.ecore.xmi.impl.XMLHandler.createTopObject(XMLHandler.java:1247) > > at > org.eclipse.emf.ecore.xmi.impl.XMLHandler.processElement(XMLHandler.java:883) > > at > org.eclipse.emf.ecore.xmi.impl.XMLHandler.startElement(XMLHandler.java:866) > > at > org.eclipse.emf.ecore.xmi.impl.XMLHandler.startElement(XMLHandler.java:627) > > at > org.apache.tuscany.sdo.util.resource.SDOXMLResourceImpl$SDOXMLLoadImpl$XmlHandler.startElement(SDOXMLResourceImpl.java:405) > > at > com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(AbstractSAXParser.java:501) > > at > com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:400) > > at > com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(XMLNSDocumentScannerImpl.java:626) > > at > com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:3088) > > at > com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:914) > > at > com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:647) > > at > com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:140) > > at > com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:508) > > at > com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:807) > > at > com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737) > > at > com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107) > > at > com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205) > > at > com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522) > > at javax.xml.parsers.SAXParser.parse(SAXParser.java:395) > > at > org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl.load(XMLLoadImpl.java:268) > > ... 50 more > > Regards > > Raman
