Application Schema
 

<?xml version="1.0" encoding="UTF-8"?>

<xsd:schema 
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
	xmlns:gesd="http://bldapps.cs.unc.edu/gesd" 
	targetNamespace="http://bldapps.cs.unc.edu/gesd"
	elementFormDefault="qualified"
    attributeFormDefault="unqualified">>


	<!--  Encompassing Element -->

	<xsd:element name="designDocument">
	
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="gesd:metaData" minOccurs="0" maxOccurs="1" />
				<xsd:element ref="gesd:useCases" minOccurs="0" maxOccurs="1" />
				<xsd:element ref="gesd:userTypes" minOccurs="0" maxOccurs="1" />
				<xsd:element ref="gesd:dataTypes" minOccurs="0" maxOccurs="1" />
				<xsd:element ref="gesd:interactions" minOccurs="0" maxOccurs="1" />
				<xsd:element ref="gesd:relations" minOccurs="0" maxOccurs="1" />
			</xsd:sequence>
		</xsd:complexType>
		
		<xsd:key name="UserTypeKey">
			<xsd:selector xpath="gesd:userTypes/gesd:userType" />
			<xsd:field xpath="@id" />
		</xsd:key>
		<xsd:keyref name="UserTypeRef" refer="gesd:UserTypeKey">
			<xsd:selector xpath="gesd:interactions/gesd:interaction/gesd:userRef" />
			<xsd:field xpath="@id" />
		</xsd:keyref>
		
		<xsd:key name="DataTypeKey">
			<xsd:selector xpath="gesd:dataTypes/gesd:dataType" />
			<xsd:field xpath="@id" />
		</xsd:key>
		<xsd:keyref name="DataTypeRef" refer="gesd:DataTypeKey">
			<xsd:selector xpath="gesd:interactions/gesd:interaction/gesd:dataRef" />
			<xsd:field xpath="@id" />
		</xsd:keyref>
		
		<xsd:key name="ActionKey">
			<xsd:selector xpath="gesd:dataTypes/gesd:dataType/gesd:actions/gesd:action" />
			<xsd:field xpath="@id" />
		</xsd:key>
		<xsd:keyref name="ActionRef" refer="gesd:ActionKey">
			<xsd:selector xpath="gesd:interactions/gesd:interaction/gesd:actionRefs/gesd:userAction" />
			<xsd:field xpath="@id" />
		</xsd:keyref>
		
		<xsd:key name="RelationKey">
			<xsd:selector xpath="gesd:dataTypes/gesd:dataType" />
			<xsd:field xpath="@id" />
		</xsd:key>
		<xsd:keyref name="RelationRef" refer="gesd:RelationKey">
			<xsd:selector xpath="gesd:relations/gesd:relation/gesd:relationComponent/gesd:dataRef" />
			<xsd:field xpath="@id" />
		</xsd:keyref>

	</xsd:element>


	<!--  Top-Level Elements -->


	<!--  MetaData Element -->

	<xsd:element name="metaData">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1" />
				<xsd:element name="owner" type="xsd:string" minOccurs="1" maxOccurs="1" />
				<xsd:element name="projectId" type="xsd:string" minOccurs="1" maxOccurs="1" />
				<xsd:element name="acronym" type="xsd:string" minOccurs="0" maxOccurs="1" />
			</xsd:sequence>
			<xsd:attribute name="id" type="xsd:string" use="required" />
		</xsd:complexType>
	</xsd:element>


	<!--  UseCases Elements -->

	<xsd:element name="useCases">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="gesd:useCase" minOccurs="1" maxOccurs="unbounded" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="useCase">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="task" type="xsd:string" minOccurs="1" maxOccurs="1" />
				<xsd:element name="user" type="xsd:string" minOccurs="1" maxOccurs="1" />
				<xsd:element ref="gesd:steps" minOccurs="1" maxOccurs="unbounded" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="steps">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="gesd:step" minOccurs="1" maxOccurs="unbounded" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
	
	<xsd:element name="step">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="index" type="xsd:string" minOccurs="1" maxOccurs="1" />
				<xsd:element name="description" type="xsd:string" minOccurs="1" maxOccurs="1" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

	

	<!--  UserType Elements -->

	<xsd:element name="userTypes">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="gesd:userType" minOccurs="1" maxOccurs="unbounded" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="userType">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="name" type="xsd:string" minOccurs="0" maxOccurs="1" />
			</xsd:sequence>
			<xsd:attribute name="id" type="xsd:string" use="required" />
		</xsd:complexType>
	</xsd:element>


	<!--  DataType Elements -->

	<xsd:element name="dataTypes">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="gesd:dataType" minOccurs="1" maxOccurs="unbounded" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="dataType">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="name" type="xsd:string" minOccurs="0" maxOccurs="1" />
				<xsd:element name="properties" type="gesd:Properties" minOccurs="0" maxOccurs="unbounded" />
				<xsd:element ref="gesd:actions" minOccurs="0" maxOccurs="unbounded" />
			</xsd:sequence>
			<xsd:attribute name="id" type="xsd:string" use="required" />
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="actions">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="gesd:action" minOccurs="1" maxOccurs="unbounded" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="action">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1" />
				<xsd:element name="label" type="xsd:string" minOccurs="0" maxOccurs="1" />
			</xsd:sequence>
			<xsd:attribute name="id" type="xsd:string" use="required" />
		</xsd:complexType>
	</xsd:element>


	<!--  Interaction Elements -->

	<xsd:element name="interactions">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="gesd:interaction" minOccurs="0" maxOccurs="unbounded" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="interaction">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="gesd:userRef" minOccurs="1" maxOccurs="1" />
				<xsd:element ref="gesd:dataRef" minOccurs="1" maxOccurs="1" />
				<xsd:element ref="gesd:actionRefs" minOccurs="1" maxOccurs="1" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
	
	<xsd:element name="userRef">
		<xsd:complexType>
			<xsd:attribute name="id" type="xsd:string" use="required" />
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="dataRef">
		<xsd:complexType>
			<xsd:attribute name="id" type="xsd:string" use="required" />
		</xsd:complexType>
	</xsd:element>
	
	<xsd:element name="actionRefs">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="gesd:userAction" minOccurs="0" maxOccurs="unbounded" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="userAction">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="constraint" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
			</xsd:sequence>
			<xsd:attribute name="id" type="xsd:string" use="required" />
		</xsd:complexType>
	</xsd:element>


	<!--  Interaction Elements -->

	<xsd:element name="relations">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element ref="gesd:relation" minOccurs="0" maxOccurs="unbounded" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="relation">
		<xsd:complexType>
			<xsd:sequence>
				<xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1" />
				<xsd:element ref="gesd:relationComponent" minOccurs="2" maxOccurs="2" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
		
	<xsd:element name="relationComponent">
		<xsd:complexType>
		<xsd:sequence>
			<xsd:element ref="gesd:dataRef" minOccurs="1" maxOccurs="1" />
			<xsd:element name="virtualProperty" type="gesd:VirtualProperty" minOccurs="1" maxOccurs="1" />
			<xsd:element name="multiplicity" type="xsd:string" minOccurs="1" maxOccurs="1" />
			</xsd:sequence>
		</xsd:complexType>
	</xsd:element>
	

	<!--  Components Types -->



	<xsd:complexType name="Properties">
		<xsd:sequence>
			<xsd:element name="property" type="gesd:Property" minOccurs="0" maxOccurs="unbounded" />
		</xsd:sequence>
	</xsd:complexType>

	<xsd:complexType name="Property">
		<xsd:sequence>
			<xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1" />
			<xsd:element name="type" type="xsd:string" minOccurs="1" maxOccurs="1" />
		</xsd:sequence>
	</xsd:complexType>


	<xsd:complexType name="VirtualProperty">
		<xsd:sequence>
			<xsd:element name="name" type="xsd:string" minOccurs="1" maxOccurs="1" />
			<xsd:element name="type" type="xsd:string" minOccurs="1" maxOccurs="1" />
		</xsd:sequence>
	</xsd:complexType>


</xsd:schema>