I think that should work, so my only guess is that maybe the SCA component and runtime are not using the same classLoader and/or HelperContext (scope). Maybe someone with more SCA knowledge can help.
Frank. "Millies, Sebastian" <[email protected]> wrote on 10/07/2010 03:38:35 AM: > [image removed] > > SDO instance creation and deserialization error > > Millies, Sebastian > > to: > > user > > 10/07/2010 03:39 AM > > Please respond to user > > Frank, thank you for that explanation. I?m opening a new thread now, > because the subject > matter of this conversation has changed somewhat. > > I tried your example, and it did not work as expected. In > particular, I created a > data object for a type which has a statically generated class, but > unexpectedly > got back an instance of DynamicDataObjectImpl. > > Here are the details: > > I created the types using XSD2JavaGenerator from this XSD: > <?xml version="1.0" encoding="UTF-8"?> > <schema xmlns="http://www.w3.org/2001/XMLSchema" > targetNamespace="http://psp.softwareag.com/catalogBaseType" > xmlns:catalogBaseType="http://psp.softwareag.com/catalogBaseType"> > > <complexType name="CatalogBaseType"> > <attribute name="id" type="string"></attribute> > <attribute name="catalogID" type="string"></attribute> > <attribute name="fileName" type="string"></attribute> > <attribute name="catalogName" type="string"></attribute> > <attribute name="catalogStatus" type="string"></attribute> > <attribute name="supplierID" type="string"></attribute> > <attribute name="eclassVersion" type="string"></attribute> > </complexType> > > <element name="catalogBaseType" type="catalogBaseType:CatalogBaseType"></ > element> > </schema> > > The classes get generated in package com.softwareag.psp.catalog.base.type > . I generated no interfaces ( I > ran XSD2JavaGenerator with the following options: -noInterfaces - > noNotification -noUnsettable ?prefix). > I have called the generated factory CatalogBaseTypeFactory. > > Then in my coding (SCA service implementation) I do the following: > a) statically register the factory with the default context > static { > helperContext = HelperProvider.getDefaultContext(); > CatalogBaseTypeFactory.INSTANCE.register( helperContext ); > } > b) create a data object from the targetNamespace of the XSD and > the type name > DataObject obj = helperContext.getDataFactory().create( > "http://psp.softwareag.com/catalogBaseType", "CatalogBaseType"); > > Unexpectedly the following holds: assertTrue(obj instanceof > DynamicDataObjectImpl); > Where I would have expected an instance of CatalogBaseType. > > When I call the service that returns this SDO using a Java RMI > client, I also get an exception when trying to > deserialize the dynamic data object: > org.eclipse.emf.ecore.resource.Resource$IOWrappedException: Package > with uri 'http://psp.softwareag.com/catalogBaseType' not found. ( > http:///temp.xml, 5, 24) > which is caused by an underlying > org.eclipse.emf.ecore.xmi.PackageNotFoundException. > (see also my previous post with subject ?SDO deserialization error?) > > I guess that this exception and the fact that the wrong type of SDO > got created may be related. > I am using Tuscany 1.6, Java 1.6.0 and Eclipse Helios. > > Can anyone spot where I went wrong? > > -- Sebastian > > From: Frank Budinsky [mailto:[email protected]] > Sent: Wednesday, October 06, 2010 9:55 PM > To: [email protected] > Subject: Re: FW: [SDO] Samples for notification feature / register ? > > You don't need to know anything about the static Java class. All you > need to know is the type name. You can then get the type and create > the instance like this: > > Type type = scope.getTypeHelper().getType("http://blablaURI", "blablaType"); > DataObject obj = scope.getDataFactory().create(type); > > Alternatively, you can just call the other convenient create() method: > > DataObject obj = scope.getDataFactory().create("http://blablaURI", > "blablaType"); > > If there is no static Java class then the returned obj will be an > instance of DynamicDataObjectImp: > > assertTrue(obj instanceof DynamicDataObjectImpl); > > If there is a static implementation class, then it will be used: > > assertTrue(obj instanceof BlaBlaImpl); > > Frank. > > "Millies, Sebastian" <[email protected]> wrote on 10/ > 06/2010 12:57:19 PM: > > > [image removed] > > > > FW: [SDO] Samples for notification feature / register ? > > > > Millies, Sebastian > > > > to: > > > > user > > > > 10/06/2010 01:03 PM > > > > Please respond to user > > > > I think what I do not understand is just how to use the ?ordinary? > > factory to create instances of static data objects without static > > knowledge of the generated classes. > > > > I think my confusion stems from the call scope.getDataFactory(type). > > This calls the ?ordinary? factory, but in order to supply the > > type argument, I?d need something like > > GeneratedFactory.INSTANCE.getBlablaType(), which > > would obviously presuppose static knowledge of the generated > > Java classes. > > > > -- Sebastian > > > > > > From: Frank Budinsky [mailto:[email protected]] > > Sent: Wednesday, October 06, 2010 2:31 PM > > To: [email protected] > > Subject: Re: FW: [SDO] Samples for notification feature / register ? > > > > I'm not sure I really understand what you're asking. > > > > There are 2 factories in the picture. The generated Factory that > > only knows how to create instances of the static SDO types, and the > > "ordinary" SDO DataFactory, that can be used to create instances of > > any type (static or dynamic). The second one is used in code that > > doesn't have static knowledge of the generated Java classes (for > > example, the loader). > > > > Frank. > > > > "Millies, Sebastian" ---10/05/2010 01:54:26 PM---Hello Frank,
