ISSUE-103

Cyclic References

State:
OPEN
Product:
Advanced
Raised by:
Jonathan Calladine
Opened on:
2007-03-08
Description:
As discussed on the last call we have recently had toolkit problems with a 
wsdl that exhibited a cyclic reference. Said COTS toolkit decides this must be 
a mistake and so refuses to generate code. This issue is to capture this as a 
possible set of advanced patterns.

The options we have are to make an assertion that cyclic references are not 
permitted or to detect them as advanced patterns.

Cyclic references can be optional or mandatory (ie an unbroken chain of 
minOccurs=1 to get you back to the start of the cycle). The toolkit in 
question actually detected an optional cyclic reference and still bailed 
out... although this is probably a bug I have split the patterns up along 
these lines just in case.

I have covered just the standard type reference in these 4 schema however if 
we decide to go further with this the same needs to be done for element 
reference and extension patterns. I have broken the optional and mandatory 
patterns into 2 again to reflect that that circular references can be indirect 
and perhaps spread across multiple schema.

I will do the same for the other possibilities of cyclic reference if we 
decide not to go down the assertion route.



1a) Optional Direct reference

<xs:element name="optionalCyclicReferenceDirect" 
type="ex:OptionalCyclicReferenceDirect"/>

<xs:complexType name="OptionalCyclicReferenceDirect"> 
<xs:sequence> 
<xs:element name="elementMinOccurs1item" type="xs:string" minOccurs="1"/> 
<xs:element name="optionalCyclicReferenceDirect" 
type="ex:OptionalCyclicReferenceDirect" minOccurs="0"/> 
</xs:sequence> 
</xs:complexType> 

1b) Optional IndirectReference
<xs:element name="optionalCyclicReferenceIndirect" 
type="ex:OptionalCyclicReferenceIndirect"/>

<xs:complexType name="OptionalCyclicReferenceIndirect"> 
<xs:sequence> 
<xs:element name="elementMinOccurs1item" type="xs:string" minOccurs="1"/> 
<xs:element name="optionalCyclicReferenceIndirect" 
type="ex:OptionalCyclicReferenceIndirect2" minOccurs="0"/> 
</xs:sequence> 
</xs:complexType> 


<xs:complexType name="OptionalCyclicReferenceIndirect2"> 
<xs:sequence> 
<xs:element name="elementMinOccurs1item" type="xs:string" minOccurs="1"/> 
<xs:element name="optionalCyclicReferenceIndirect" 
type="ex:OptionalCyclicReferenceIndirect" minOccurs="0"/> 
</xs:sequence> 
</xs:complexType> 



2a) Mandatory Direct reference

<xs:element name="mandatoryCyclicReferenceDirect" 
type="ex:MandatoryCyclicReferenceDirect"/>

<xs:complexType name="MandatoryCyclicReferenceDirect"> 
<xs:sequence> 
<xs:element name="elementMinOccurs1item" type="xs:string" minOccurs="1"/> 
<xs:element name="mandatoryCyclicReferenceDirect" 
type="ex:MandatoryCyclicReferenceDirect" minOccurs="1"/> 
</xs:sequence> 
</xs:complexType> 

2b) Mandatory IndirectReference
<xs:element name="mandatoryCyclicReferenceIndirect" 
type="ex:MandatoryCyclicReferenceIndirect"/>

<xs:complexType name="MandatoryCyclicReferenceIndirect"> 
<xs:sequence> 
<xs:element name="elementMinOccurs1item" type="xs:string" minOccurs="1"/> 
<xs:element name="mandatoryCyclicReferenceIndirect" 
type="ex:MandatoryCyclicReferenceIndirect2" minOccurs="1"/> 
</xs:sequence> 
</xs:complexType> 


<xs:complexType name="MandatoryCyclicReferenceIndirect2"> 
<xs:sequence> 
<xs:element name="elementMinOccurs1item" type="xs:string" minOccurs="1"/> 
<xs:element name="mandatoryCyclicReferenceIndirect" 
type="ex:MandatoryCyclicReferenceIndirect" minOccurs="1"/> 
</xs:sequence> 
</xs:complexType> 



Instance Document

The instance document for these would be

1a)

<optionalCyclicReferenceDirect>
	<elementMinOccurs1item>Data</elementMinOccurs1item>
	<optionalCyclicReferenceDirect>
		<elementMinOccurs1item>Data</elementMinOccurs1item>
		<optionalCyclicReferenceDirect>
			<elementMinOccurs1item>Data</elementMinOccurs1item>
		</optionalCyclicReferenceDirect>
	</optionalCyclicReferenceDirect>
</optionalCyclicReferenceDirect>

1b)
<optionalCyclicReferenceIndirect>
	<elementMinOccurs1item>Data</elementMinOccurs1item>
	<optionalCyclicReferenceIndirect>
		<elementMinOccurs1item>Data</elementMinOccurs1item>
		<optionalCyclicReferenceIndirect>
			<elementMinOccurs1item>Data</elementMinOccurs1item>
		</optionalCyclicReferenceIndirect>
	</optionalCyclicReferenceIndirect>
</optionalCyclicReferenceIndirect>


2a) N.B. This will not validate because of the minOccurs<0

<mandatoryCyclicReferenceDirect>
	<elementMinOccurs1item>Data</elementMinOccurs1item>
	<mandatoryCyclicReferenceDirect>
		<elementMinOccurs1item>Data</elementMinOccurs1item>
		<mandatoryCyclicReferenceDirect>
			<elementMinOccurs1item>Data</elementMinOccurs1item>
		</mandatoryCyclicReferenceDirect>
	</mandatoryCyclicReferenceDirect>
</mandatoryCyclicReferenceDirect>

2b) N.B. This will not validate because of the minOccurs<0
<mandatoryCyclicReferenceIndirect>
	<elementMinOccurs1item>Data</elementMinOccurs1item>
	<mandatoryCyclicReferenceIndirect>
		<elementMinOccurs1item>Data</elementMinOccurs1item>
		<mandatoryCyclicReferenceIndirect>
			<elementMinOccurs1item>Data</elementMinOccurs1item>
		</mandatoryCyclicReferenceIndirect>
	</mandatoryCyclicReferenceIndirect>
</mandatoryCyclicReferenceIndirect>

Jon Calladine
Matrix Engineering
OneIT Platform Design and Build
BT Exact
Related emails:
  1. ISSUE-103: Cyclic References (from dean+cgi@w3.org on 2007-03-08)
  2. Minutes from XML Schema Patterns for Databinding Telcon 20 March 2007 (from paul.downey@bt.com on 2007-03-20)

Related notes:

No additional notes.