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: [email protected]
> 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]