Miro, You are right. Bidirectional references are broken in Tuscany. They seem to have been broken when we switched over to the new (noEMF) codegen patterns. I guess nobody uses them much and we don't have a test case. Can you please open a JIRA bug report to track this?
I understand your point about wanting a static (non SDO dependent) way to navigate to the container. I think this is something that we should try to change in the next version of SDO. Maybe something like this: <xsd:element name="lines" type="impl:SoL" sdojava:getContainer="getOrder" minOccurs="0" maxOccurs="unbounded" /> Maybe for now in Tuscany, we could just always generate a static method for getContainer equal to "get" + <container type name>. For example, we would generate: SoH getSoH() { return (SoH)getContainer(); } in class SoLImpl. This wouldn't be standard SDO, but a generator is allowed to generate additional implementation-specific methods and still be considered compliant. Frank "Miro Kandic \(mkandic\)" <[EMAIL PROTECTED]> wrote on 09/17/2007 01:09:38 PM: > Frank, > > actually XSD2JavaGenerator does not work in the case of any > association type that is navigable from both sides. > I have intentionally, just to test generator, made Customer-SoH > association navigable from both sides and generated code again > cannot be compiled. > > Regarding your comments on bidirectional references and > containments, I know I can get container using dynamic SDO API but I > don't want to see in a code that implements business logic any code > that is related to protocols or data implementation technologies. > Packing data to SOAP envelop or sendig data over IIOP is job of > stubs and scaletons and main stream priogrammer should not ever cast > object to classes related to those techologies. Based on the same > principales, business programmer should not be avere that object > he/she is dealing with is actually instance of some Hybernate proxy > or SDO DataObject and should not ever cast those objects to > mentioned classes unless he/she develops some tools or similar > generic software. > And I do not want to use any dynamic API if I don't have to, so I > prefer to have typed Java API and SDO specification explicitally > lists that support as one of the major requirements. So SDO should > support static API defined by XSD schema. > I think Java business programmer should be familiar with UML class > diagrams that define domain and should get only corresponding POJOs > to deal with. Code dealing with data transport or object > distribution or data persistance, where BTW one technology is "cool" > today and next day another one, should be hidden in adapters, > skeletons and stubs. > > Next is complete XSD built automatically from attached UML. > > <?xml version="1.0" encoding="UTF-8"?> > <!-- > Attention: Generated code! Do not modify by hand! > Generated by: XmlSchema.vsl in andromda-xmlschema-cartridge. > --> > <xsd:schema > targetNamespace="http://www.cisco.com/odns/soa" > xmlns:xsd="http://www.w3.org/2001/XMLSchema" > xmlns:sdo="commonj.sdo" xmlns:sdoxml="commonj.sdo/xml" > xmlns:impl="http://www.cisco.com/odns/soa" > elementFormDefault="qualified"> > > <xsd:import namespace="commonj.sdo/xml" schemaLocation="sdoXML.xsd"/> > > <xsd:complexType name="Address"> > <xsd:sequence> > <xsd:element name="street" type="xsd:string" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="city" type="xsd:string" minOccurs="1" > maxOccurs="1"/> > </xsd:sequence> > <xsd:attribute name="xmlId" type="xsd:ID"/> > </xsd:complexType> > > <xsd:complexType name="Customer"> > <xsd:sequence> > <xsd:element name="orders" type="xsd:IDREF" sdoxml: > propertyType="impl:SoH" > sdoxml:oppositeProperty="customer" minOccurs="0" > maxOccurs="unbounded" /> > <xsd:element name="name" type="xsd:string" minOccurs="1" > maxOccurs="1"/> > <xsd:element name="created" type="xsd:date" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="lastUpdated" type="xsd:dateTime" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="modifiedBy" type="xsd:string" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="id" type="xsd:long" minOccurs="1" > maxOccurs="1"/> > </xsd:sequence> > <xsd:attribute name="xmlId" type="xsd:ID"/> > </xsd:complexType> > > <xsd:complexType name="Part"> > <xsd:sequence> > <xsd:element name="uom" type="xsd:string" minOccurs="1" > maxOccurs="1"/> > <xsd:element name="aggState" type="xsd:string" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="id" type="xsd:long" minOccurs="1" > maxOccurs="1"/> > </xsd:sequence> > <xsd:attribute name="xmlId" type="xsd:ID"/> > </xsd:complexType> > > <xsd:complexType name="Product"> > <xsd:complexContent> > <xsd:extension base="impl:Part"> > <xsd:sequence> > <xsd:element name="description" type="xsd:string" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="modifiedBy" type="xsd:string" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="lastUpdated" type="xsd:dateTime" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="created" type="xsd:date" > minOccurs="1" maxOccurs="1"/> > </xsd:sequence> > </xsd:extension> > </xsd:complexContent> > </xsd:complexType> > > <xsd:complexType name="SoH"> > <xsd:sequence> > <xsd:element name="customer" type="xsd:IDREF" sdoxml: > propertyType="impl:Customer" > sdoxml:oppositeProperty="orders" minOccurs="1" > maxOccurs="1" /> > <xsd:element name="lines" type="impl:SoL" minOccurs="0" > maxOccurs="unbounded" /> > <xsd:element name="number" type="xsd:string" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="receivedDate" type="xsd:date" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="modifiedBy" type="xsd:string" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="lastUpdated" type="xsd:dateTime" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="created" type="xsd:date" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="id" type="xsd:long" minOccurs="1" > maxOccurs="1"/> > </xsd:sequence> > <xsd:attribute name="xmlId" type="xsd:ID"/> > </xsd:complexType> > > <xsd:complexType name="SoL"> > <xsd:sequence> > <xsd:element name="product" type="xsd:IDREF" sdoxml: > propertyType="impl:Product" > sdoxml:oppositeProperty="soLs" minOccurs="1" maxOccurs="1" /> > <xsd:element name="soLineSch" type="impl:SoLSch" > minOccurs="0" maxOccurs="unbounded" /> > <xsd:element name="quantity" type="xsd:double" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="requestedDate" type="xsd:date" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="modifiedBy" type="xsd:string" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="lastUpdated" type="xsd:dateTime" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="created" type="xsd:date" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="id" type="xsd:long" minOccurs="1" > maxOccurs="1"/> > </xsd:sequence> > <xsd:attribute name="xmlId" type="xsd:ID"/> > </xsd:complexType> > > <xsd:complexType name="SoLSch"> > <xsd:sequence> > <xsd:element name="requestedDate" type="xsd:date" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="quantity" type="xsd:double" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="modifiedBy" type="xsd:string" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="lastUpdated" type="xsd:dateTime" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="created" type="xsd:date" > minOccurs="1" maxOccurs="1"/> > <xsd:element name="id" type="xsd:long" minOccurs="1" > maxOccurs="1"/> > </xsd:sequence> > <xsd:attribute name="xmlId" type="xsd:ID"/> > </xsd:complexType> > > <xsd:element name="DataGraphRootEl" type="impl:DataGraphRoot"/> > <xsd:complexType name="DataGraphRoot"> > <xsd:sequence> > <xsd:element name="customer" type="impl:Customer" > minOccurs="0" maxOccurs="unbounded" /> > <xsd:element name="product" type="impl:Product" > minOccurs="0" maxOccurs="unbounded" /> > <xsd:element name="part" type="impl:Part" minOccurs="0" > maxOccurs="unbounded" /> > <xsd:element name="soH" type="impl:SoH" minOccurs="0" > maxOccurs="unbounded" /> > </xsd:sequence> > </xsd:complexType> > > </xsd:schema> > > > > Miro > > > > > -----Original Message----- > From: Frank Budinsky [mailto:[EMAIL PROTECTED] > Sent: Mon 9/17/2007 7:49 AM > To: tuscany-user@ws.apache.org > Subject: Re: XSD2JavaGenerator and non-containment references > > Miro, > > Both sides of a relationship defined with sdoXML:oppositeProperty need to > be non-containment references. All containment references are implicitly > bidirectional (the reverse is the elements container), so you wouldn't > really want to use an IDREF element anyway - it's just duplicate > information. > > To get the SoH from an SoL, you can call: > > SoH soh = (SoH)sol.getContainer(); > > You could manually add a getOrder() (convenience) method in the generated > class like this: > > SoH getOrder() { return (SoH)getContainer(): } > > EMF has a way to generate this kind of method for you, but there's no > support for this in SDO. > > Frank. > > "Miro Kandic \(mkandic\)" <[EMAIL PROTECTED]> wrote on 09/14/2007 08:40:40 > PM: > > > I am having a problem with new XSD2JavaGenerator (M2 was OK) and it > > generates code that cannot be compiled in case when container > > element has non-containment reference to the container. > > Entire xsd file is attched. > > In this case I want to use static API and I want to get sales order > > header (SoH) from its lines (SoL) using the same Java code (getter) > > as in case when I use corresponding POJO's. > > It works fine if property is non-containment reference to no > > container class (SoL references product or SoH references Customer). > > > > I am a new in this community and I do not know if this is considered > > as a bug who and how should open it. Please, advise. > > > > <xsd:complexType name="SoH"> > > <xsd:sequence> > > <xsd:element name="customer" type="xsd:IDREF" sdoxml: > > propertyType="impl:Customer" sdoxml:oppositeProperty="soHs" > > minOccurs="1" maxOccurs="1" /> > > <xsd:element name="lines" type="impl:SoL" minOccurs="0" > > maxOccurs="unbounded" /> > > <xsd:element name="number" type="xsd:string" > > minOccurs="1" maxOccurs="1"/> > > <xsd:element name="receivedDate" type="xsd:date" > > minOccurs="1" maxOccurs="1"/> > > <xsd:element name="modifiedBy" type="xsd:string" > > minOccurs="1" maxOccurs="1"/> > > <xsd:element name="lastUpdated" type="xsd:dateTime" > > minOccurs="1" maxOccurs="1"/> > > <xsd:element name="created" type="xsd:date" > > minOccurs="1" maxOccurs="1"/> > > <xsd:element name="id" type="xsd:long" minOccurs="1" > > maxOccurs="1"/> > > </xsd:sequence> > > <xsd:attribute name="xmlId" type="xsd:ID"/> > > </xsd:complexType> > > > > <xsd:complexType name="SoL"> > > <xsd:sequence> > > <xsd:element name="order" type="xsd:IDREF" sdoxml: > > propertyType="impl:SoH" sdoxml:oppositeProperty="lines" > > minOccurs="1" maxOccurs="1" /> > > <xsd:element name="product" type="xsd:IDREF" sdoxml: > > propertyType="impl:Product" sdoxml:oppositeProperty="soLs" > > minOccurs="1" maxOccurs="1" /> > > <xsd:element name="soLineSch" type="impl:SoLSch" > > minOccurs="0" maxOccurs="unbounded" /> > > <xsd:element name="quantity" type="xsd:double" > > minOccurs="1" maxOccurs="1"/> > > <xsd:element name="requestedDate" type="xsd:date" > > minOccurs="1" maxOccurs="1"/> > > <xsd:element name="modifiedBy" type="xsd:string" > > minOccurs="1" maxOccurs="1"/> > > <xsd:element name="lastUpdated" type="xsd:dateTime" > > minOccurs="1" maxOccurs="1"/> > > <xsd:element name="created" type="xsd:date" > > minOccurs="1" maxOccurs="1"/> > > <xsd:element name="id" type="xsd:long" minOccurs="1" > > maxOccurs="1"/> > > </xsd:sequence> > > <xsd:attribute name="xmlId" type="xsd:ID"/> > > </xsd:complexType> > > > > Regards, > > Miro > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]