Dear Wiki user, You have subscribed to a wiki page or wiki category on "Ws Wiki" for change notification.
The following page has been changed by KelvinGoodson: http://wiki.apache.org/ws/Tuscany/Java/SDO/ThinkingAloud/OpenContent ------------------------------------------------------------------------------ - = Musings on the way Open Content works in SDO = + To fit in with recent page rearrangements, this information has moved [wiki:Tuscany/TuscanyJava/SDO/ThinkingAloud/OpenContent here] - Document in progress ... state is very raw - - A semi-public place to keep and share information on the way open content is spec'ed/implemented and the issues I have with it. - - '''Disclaimer''' -- this info is a point in time snapshot of my understanding, it may be inaccurate. Feel free to point out my misconceptions. - - == Basic Stuff == - - A suitable schema for playing with open content ... - - {{{ - <?xml version="1.0" encoding="UTF-8"?> - <xsd:schema xmlns:simple="http://www.example.com/open" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/open"> - - <xsd:element name="openStockQuote" type="simple:OpenQuote"/> - - <xsd:element name="company"> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="name" type="xsd:string"/> - </xsd:sequence> - </xsd:complexType> - </xsd:element> - - <xsd:element name="note" type="xsd:string"/> - - <xsd:complexType name="OpenQuote"> - <xsd:sequence> - <xsd:element name="symbol" type="xsd:string"/> - <xsd:any namespace="##any"/> - </xsd:sequence> - </xsd:complexType> - - </xsd:schema> - }}} - - To be able to set a value into a wildcard (<xsd:any>), you have to be able to get hold of a Property that is associated with a global element, the schema above demonstrates one way to create such a beast. In the code you can find the Property that is generated from the element "simple" with ... - - {{{ - Property pc = XSDHelper.INSTANCE.getGlobalProperty("http://www.example.com/open", "note", true); - }}} - - so then you might think you should able to do ... - - {{{ - OpenQuote oq = OpenFactory.INSTANCE.createOpenQuote(); - Property pc = XSDHelper.INSTANCE.getGlobalProperty("http://www.example.com/open", "note", true); - ((DataObject)oq).set(pc, "TBA"); - }}} - - ('''Note:''' in the future it will be possible to do '''dob.set("<property>", value);''' to set into a wildcard (although I'm not sure at the moment how the namespace is selected in the property argument.)) - - But the thing is that the cardinality of association between the OpenQuote instance and the instance of the Property that's being attached by virtue of the xsd:any wildcard is defined by the ''global element'' (not the xsd:any), i.e. in this case the "note" element, and there's no way in schema to constrain the maxOccurs attribute of a global element. The upshot of that is that if you want to add a single Property value as open content, where the Property is derived from an XML Schema global element, you must wrap the value in a Collection... - - {{{ - OpenQuote oq = OpenFactory.INSTANCE.createOpenQuote(); - oq.setSymbol("ww"); - - DataObject doq = (DataObject)oq; - - boolean isElement = true; - Property pc = XSDHelper.INSTANCE.getGlobalProperty("http://www.example.com/open", "note", isElement); - - List lnote = new ArrayList(); - lnote.add(new String("TBA")); - - doq.set(pc, lnote); - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - XMLHelper.INSTANCE.save(doq, "http://www.example.com/open", "openStockQuote", baos); - - System.out.println(baos.toString()); - }}} - - which gives ... - - {{{ - <?xml version="1.0" encoding="ASCII"?> - <open:openStockQuote xmlns:open="http://www.example.com/open"> - <symbol>ww</symbol> - <open:note>TBA</open:note> - </open:openStockQuote> - }}} - - There is a way programmatically to create Property instances with maxOccurs=1 ... - {{{ - OpenQuote oq = OpenFactory.INSTANCE.createOpenQuote(); - Type globalType = SDOUtil.createType(TypeHelper.INSTANCE, "some-namespace", null, false); - Property p = SDOUtil.createProperty(globalType, "newProp", TypeHelper.INSTANCE.getType("commonj.sdo", "String")); - ((DataObject)oq).set(p, "newValue"); - }}} - - but if your environment constrains you to creating you metadata from XSD then currently there's no way to achieve this coding style. It has been mooted that a new SDO annotation could be added so that the generated code for the Property could ascribe the 0..1 cardinality behaviour. - - So now I need to understand what semantics are placed on the maxOccurs=1 of the xsd:any -- any suggestions most welcome [EMAIL PROTECTED] - - [[Anchor(multiprop)]] - == Open content with maxOccurs > 1 == - - This section being reworked in the light of my newly gained understanding above - - Considering the schema ... - - {{{ - <?xml version="1.0" encoding="UTF-8"?> - <xsd:schema xmlns:simple="http://www.example.com/open" xmlns:xsd="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/open"> - - <xsd:element name="openStockQuote2" type="simple:OpenQuote2"/> - - <xsd:element name="note" type="xsd:string"/> - <xsd:element name="count" type="xsd:int"/> - - <xsd:complexType name="OpenQuote2"> - <xsd:sequence> - <xsd:element name="symbol" type="xsd:string"/> - <xsd:any maxOccurs="unbounded" namespace="##any"/> - </xsd:sequence> - </xsd:complexType> - - </xsd:schema> - }}} - - - The following document .... - - {{{ - <?xml version="1.0" encoding="ASCII"?> - <open:openStockQuote2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:open="http://www.example.com/open" xsi:type="open:OpenQuote2"> - <symbol>ww</symbol> - <open:note>TBA</open:note> - <open:count>1</open:count> - </open:openStockQuote2> - }}} - - is created by the following code ... - {{{ - OpenQuote2 oq = OpenFactory.INSTANCE.createOpenQuote2(); - oq.setSymbol("ww"); - - DataObject doq = (DataObject)oq; - - boolean isElement = true; - Property pc = XSDHelper.INSTANCE.getGlobalProperty("http://www.example.com/open", "note", isElement); - - List lnote = new ArrayList(); - lnote.add(new String("TBA")); - - - doq.set(pc, lnote); - - pc = XSDHelper.INSTANCE.getGlobalProperty("http://www.example.com/open", "count", isElement); - - List lcount = new ArrayList(); - lcount.add(new Integer(1)); - - doq.set(pc, lcount); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - - XMLHelper.INSTANCE.save(doq, "http://www.example.com/open", "openStockQuote2", baos); - - System.out.println(baos.toString()); - }}} - --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
