<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns="http://www.alshayeb.com/DPDL" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.alshayeb.com/DPDL" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xs:element name="DesignPattern">
		<xs:annotation>
			<xs:documentation>Comment describing your root element</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element name="StructuralAttributes">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="Classes">
								<xs:complexType>
									<xs:sequence maxOccurs="unbounded">
										<xs:element name="SubGroup">
											<xs:complexType>
												<xs:sequence maxOccurs="unbounded">
													<xs:element name="Class">
														<xs:complexType>
															<xs:attribute name="className" type="xs:Name" use="required"/>
															<xs:attribute name="classModifier" type="Modifier"/>
															<xs:attribute name="isDerived" type="YesNo"/>
															<xs:attribute name="parentId" type="xs:Name" use="optional"/>
															<xs:attribute name="isAbstract" type="YesNo"/>
															<xs:attribute name="isVirtual" type="YesNo" use="optional"/>
															<xs:attribute name="isStatic" type="YesNo" use="optional"/>
															<xs:attribute name="isFinal" type="YesNo" use="optional"/>
															<xs:attribute name="isParent" type="YesNo"/>
															<xs:attribute name="isFriend" type="YesNo"/>
															<xs:attribute name="friendId"/>
															<xs:attribute name="hasConstructor" type="YesNo"/>
														</xs:complexType>
													</xs:element>
												</xs:sequence>
												<xs:attribute name="groupID" type="xs:Name"/>
												<xs:attribute name="noOfClasses" type="xs:string"/>
											</xs:complexType>
										</xs:element>
									</xs:sequence>
								</xs:complexType>
							</xs:element>
							<xs:element name="Operations">
								<xs:complexType>
									<xs:sequence maxOccurs="unbounded">
										<xs:element name="SubGroupOp">
											<xs:complexType>
												<xs:sequence maxOccurs="unbounded">
													<xs:element name="Function">
														<xs:complexType>
															<xs:attribute name="functionName" type="xs:Name" use="required"/>
															<xs:attribute name="functionModifier" type="Modifier" use="required"/>
															<xs:attribute name="containingClassId" type="xs:Name" use="required"/>
															<xs:attribute name="inputVariablesIds" type="xs:string"/>
															<xs:attribute name="inputVariablesType" type="xs:string"/>
															<xs:attribute name="functionType" type="OpTypes"/>
															<xs:attribute name="returnType" type="xs:string" use="required"/>
															<xs:attribute name="isVirtual" type="YesNo" use="optional"/>
															<xs:attribute name="isAbstract" type="YesNo"/>
															<xs:attribute name="isFinal"/>
															<xs:attribute name="isStatic" type="YesNo"/>
															<xs:attribute name="isFriend" type="YesNo"/>
															<xs:attribute name="isOverRide" type="YesNo"/>
														</xs:complexType>
													</xs:element>
												</xs:sequence>
												<xs:attribute name="groupID" type="xs:Name"/>
												<xs:attribute name="noOfOperations" type="xs:string"/>
												<xs:attribute name="forEach"/>
												<xs:attribute name="inGroupID"/>
												<xs:attribute name="inEach"/>
											</xs:complexType>
										</xs:element>
									</xs:sequence>
								</xs:complexType>
							</xs:element>
							<xs:element name="Objects">
								<xs:complexType>
									<xs:sequence maxOccurs="unbounded">
										<xs:element name="SubgroupOb">
											<xs:complexType>
												<xs:sequence maxOccurs="unbounded">
													<xs:element name="Object">
														<xs:complexType>
															<xs:attribute name="objectName" type="xs:Name" use="required"/>
															<xs:attribute name="containingClass" type="xs:Name" use="required"/>
															<xs:attribute name="objectClass" type="xs:Name" use="required"/>
															<xs:attribute name="objectModifier" type="Modifier"/>
															<xs:attribute name="isList" type="YesNo"/>
															<xs:attribute name="ListType" type="xs:string"/>
														</xs:complexType>
													</xs:element>
												</xs:sequence>
												<xs:attribute name="groupID" type="xs:Name"/>
												<xs:attribute name="noOfObjects" type="xs:integer"/>
												<xs:attribute name="forEach"/>
												<xs:attribute name="inGroupID"/>
												<xs:attribute name="inEach"/>
											</xs:complexType>
										</xs:element>
									</xs:sequence>
								</xs:complexType>
							</xs:element>
							<xs:element name="RelationShips">
								<xs:complexType>
									<xs:sequence maxOccurs="unbounded">
										<xs:element name="SubgroupR">
											<xs:complexType>
												<xs:sequence>
													<xs:element name="Relation">
														<xs:complexType>
															<xs:attribute name="relationId"/>
															<xs:attribute name="relationName" type="RelationshipTypes" use="required"/>
															<xs:attribute name="initiatingClass" use="required"/>
															<xs:attribute name="endClass" use="required"/>
														</xs:complexType>
													</xs:element>
												</xs:sequence>
												<xs:attribute name="groupID" type="xs:Name"/>
												<xs:attribute name="noOfRelations" type="xs:string"/>
												<xs:attribute name="forEach"/>
												<xs:attribute name="inGroupID"/>
												<xs:attribute name="changingClass"/>
											</xs:complexType>
										</xs:element>
									</xs:sequence>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="BehavioralAttributes">
					<xs:complexType>
						<xs:sequence>
							<xs:choice minOccurs="0" maxOccurs="unbounded">
								<xs:element ref="SetObject"/>
								<xs:element ref="call"/>
								<xs:element ref="create"/>
								<xs:element ref="loop"/>
								<xs:element ref="condition"/>
							</xs:choice>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
			<xs:attribute name="PatternName" type="xs:string" use="required"/>
			<xs:attribute name="OriginalOwner"/>
			<xs:attribute name="AuthorName"/>
			<xs:attribute name="PatternVersion"/>
			<xs:attribute name="Intent" type="xs:string"/>
			<xs:attribute name="Motivation" type="xs:string"/>
			<xs:attribute name="Applicability" type="xs:string"/>
			<xs:attribute name="KnownUses" type="xs:string"/>
			<xs:attribute name="RelatedPattern" type="xs:string"/>
			<xs:attribute name="Consequences" type="xs:string"/>
			<xs:attribute name="Language"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="create">
		<xs:complexType>
			<xs:choice minOccurs="0" maxOccurs="unbounded">
				<xs:element ref="SetObject"/>
				<xs:element ref="call"/>
				<xs:element ref="create"/>
				<xs:element ref="loop"/>
				<xs:element ref="condition"/>
			</xs:choice>
			<xs:attribute name="ObjectId" type="xs:NCName" use="required"/>
			<xs:attribute name="createType" type="xs:NCName" use="required"/>
			<xs:attribute name="Collection" type="xs:NCName" use="required"/>
			<xs:attribute name="callingClass" type="xs:NCName" use="required"/>
			<xs:attribute name="objectClass" type="xs:NCName" use="required"/>
			<xs:attribute name="returns" type="xs:NCName" use="required"/>
			<xs:attribute name="variableType"/>
			<xs:attribute name="variables"/>
			<xs:attribute name="ForEach"/>
			<xs:attribute name="inEach"/>
			<xs:attribute name="inGroupId"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="call">
		<xs:complexType>
			<xs:choice minOccurs="0" maxOccurs="unbounded">
				<xs:element ref="SetObject"/>
				<xs:element ref="call"/>
				<xs:element ref="create"/>
				<xs:element ref="loop"/>
				<xs:element ref="condition"/>
			</xs:choice>
			<xs:attribute name="CallFrom" type="xs:NCName" use="required"/>
			<xs:attribute name="Calledfunction" type="xs:NCName"/>
			<xs:attribute name="Callerfunction" type="xs:NCName"/>
			<xs:attribute name="calledClass" type="xs:NCName" use="required"/>
			<xs:attribute name="calledThrough" type="xs:NCName"/>
			<xs:attribute name="callingClass" type="xs:NCName" use="required"/>
			<xs:attribute name="returns" type="xs:NCName" use="required"/>
			<xs:attribute name="variableType" use="required"/>
			<xs:attribute name="variables" use="required"/>
			<xs:attribute name="ForEach"/>
			<xs:attribute name="inEach"/>
			<xs:attribute name="inGroupId"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="loop">
		<xs:complexType>
			<xs:choice minOccurs="0" maxOccurs="unbounded">
				<xs:element ref="SetObject"/>
				<xs:element ref="call"/>
				<xs:element ref="create"/>
				<xs:element ref="loop"/>
				<xs:element ref="condition"/>
			</xs:choice>
			<xs:attribute name="Class" type="xs:NCName" use="required"/>
			<xs:attribute name="Function" type="xs:NCName" use="required"/>
			<xs:attribute name="exitCondition" use="optional"/>
			<xs:attribute name="numberOfIteration" type="xs:string"/>
			<xs:attribute name="ForEach"/>
			<xs:attribute name="inEach"/>
			<xs:attribute name="inGroupId"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="SetObject">
		<xs:complexType>
			<xs:choice minOccurs="0" maxOccurs="unbounded">
				<xs:element ref="SetObject"/>
				<xs:element ref="call"/>
				<xs:element ref="create"/>
				<xs:element ref="loop"/>
				<xs:element ref="condition"/>
			</xs:choice>
			<xs:attribute name="ObjectId" type="xs:NCName" use="required"/>
			<xs:attribute name="CallingClass" type="xs:NCName" use="required"/>
			<xs:attribute name="ObjectClass" type="xs:NCName" use="required"/>
			<xs:attribute name="SetTo" type="xs:NCName" use="required"/>
			<xs:attribute name="SetType"/>
			<xs:attribute name="ForEach"/>
			<xs:attribute name="inEach"/>
			<xs:attribute name="inGroupId"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="condition">
		<xs:complexType>
			<xs:choice minOccurs="0" maxOccurs="unbounded">
				<xs:element ref="SetObject"/>
				<xs:element ref="call"/>
				<xs:element ref="create"/>
				<xs:element ref="loop"/>
				<xs:element ref="condition"/>
			</xs:choice>
			<xs:attribute name="ConditionType" type="ConditionType" use="required"/>
			<xs:attribute name="CallingClass" type="xs:NCName" use="required"/>
			<xs:attribute name="functionName" type="xs:NCName" use="required"/>
			<xs:attribute name="conditionText" type="xs:string" use="required"/>
			<xs:attribute name="ForEach"/>
			<xs:attribute name="inEach"/>
			<xs:attribute name="inGroupId"/>
		</xs:complexType>
	</xs:element>
	<xs:element name="altCondition">
		<xs:complexType>
			<xs:choice minOccurs="0" maxOccurs="unbounded">
				<xs:element ref="SetObject"/>
				<xs:element ref="call"/>
				<xs:element ref="create"/>
				<xs:element ref="loop"/>
				<xs:element ref="condition"/>
				<xs:element ref="altCondition"/>
			</xs:choice>
			<xs:attribute name="CallingClass" type="xs:NCName" use="required"/>
			<xs:attribute name="functionName" type="xs:NCName" use="required"/>
			<xs:attribute name="conditionText" type="xs:string" use="required"/>
		</xs:complexType>
	</xs:element>
	<xs:simpleType name="Modifier">
		<xs:restriction base="xs:string">
			<xs:enumeration value="private"/>
			<xs:enumeration value="public"/>
			<xs:enumeration value="protected"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="ConditionType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Normal"/>
			<xs:enumeration value="Alternate"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="OpTypes">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Method"/>
			<xs:enumeration value="Constructor"/>
			<xs:enumeration value="Destructor"/>
			<xs:enumeration value="Event"/>
			<xs:enumeration value="GetProperty"/>
			<xs:enumeration value="SetProperty"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="RelationshipTypes">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Association"/>
			<xs:enumeration value="Generalization"/>
			<xs:enumeration value="Aggregation"/>
			<xs:enumeration value="Composition"/>
			<xs:enumeration value="Dependency"/>
			<xs:enumeration value="Realization"/>
			<xs:enumeration value="Nesting"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="YesNo">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Yes"/>
			<xs:enumeration value="No"/>
		</xs:restriction>
	</xs:simpleType>
</xs:schema>
