<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:ns0="http://xmlmath.org/1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xs:import namespace="http://xmlmath.org/1.0" schemaLocation=".\XMLMath 1.0.xsd"/>
	<xs:element name="spmdl"> 
		<xs:complexType>
			<xs:sequence>
				<xs:element name="metric" maxOccurs="unbounded">
					<xs:complexType>
						<xs:all>
							<xs:element name="acronym" type="xs:string"/>
							<xs:element name="title" type="xs:string"/>
							<xs:element name="scale" minOccurs="0" maxOccurs="1"/>							
							<xs:element name="description" type="xs:string" minOccurs="0"/>
							<xs:element name="customProperties" minOccurs="0" maxOccurs="1">
								<xs:complexType>
									<xs:attribute name="attribute" type="xs:string" use="optional"/>
									<xs:attribute name="value" type="xs:string" use="required"/>
								</xs:complexType>
							</xs:element>
							<xs:element name="conversionRules" minOccurs="0">
								<xs:complexType>
									<xs:attribute name="sourcePlatform" type="xs:string"/>
									<xs:attribute name="targetPlatform" type="xs:string"/>
									<xs:attribute name="forumula"/>
								</xs:complexType>
							</xs:element>
							<xs:element name="authority" minOccurs="0">
								<xs:complexType>
									<xs:sequence>
										<xs:element name="authors" maxOccurs="unbounded">
											<xs:complexType>
												<xs:attribute name="name" type="xs:string"/>
												<xs:attribute name="date" type="xs:string"/>
											</xs:complexType>
										</xs:element>
										<xs:element name="yearPublished" type="xs:date"/>
										<xs:element name="sourceName" type="xs:string"/>
									</xs:sequence>
								</xs:complexType>
							</xs:element>
							<xs:element name="computation" type="computation" minOccurs="0"/>
							<xs:element name="reusedMetrics" minOccurs="0" maxOccurs="1">
								<xs:complexType>
									<xs:attribute name="metricName"/>
									<xs:attribute name="variableID"/>
								</xs:complexType>
							</xs:element>
							<xs:element name="visualization" type="visualizationRules" minOccurs="0"/>
						</xs:all>
						<xs:attribute name="metricClass" type="xs:string"/>
						<xs:attribute name="metricSuite" type="xs:string"/>
						<xs:attribute name="scope">
							<xs:simpleType>
								<xs:restriction base="xs:string">
									<xs:enumeration value="package"/>
									<xs:enumeration value="class"/>
									<xs:enumeration value="method"/>
									<xs:enumeration value="variable"/>
								</xs:restriction>
							</xs:simpleType>
						</xs:attribute>
					</xs:complexType>
				</xs:element>
				<xs:choice maxOccurs="unbounded">
					<xs:element name="intermediateVariable" type="computation"/>
				</xs:choice>
			</xs:sequence>
			<xs:attribute name="version" type="xs:decimal" use="required"/>
		</xs:complexType>
	</xs:element>
	<xs:complexType name="computation">
		<xs:all>
			<xs:element name="dmmQuery" minOccurs="0">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="description" type="xs:string"/>
						<xs:element name="unit" type="xs:string"/>
						<xs:element name="visitor" type="visitor" maxOccurs="unbounded"/>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
			<xs:element name="oclQuery" minOccurs="0">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="oclQueryVariable" minOccurs="0" maxOccurs="unbounded">
							<xs:complexType>
								<xs:sequence>
									<xs:element name="query" type="xs:string"/>
									<xs:element name="variableID" type="xs:string"/>
								</xs:sequence>
							</xs:complexType>
						</xs:element>
						<xs:element name="mainOclQuery" type="xs:string"/>
						<xs:element name="scope">
							<xs:simpleType>
								<xs:restriction base="xs:string">
									<xs:enumeration value="class"/>
									<xs:enumeration value="package"/>
									<xs:enumeration value="method"/>
									<xs:enumeration value="field"/>
								</xs:restriction>
							</xs:simpleType>
						</xs:element>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:all>
		<xs:attribute name="variableID" type="xs:string"/>
		<xs:attribute name="variableType">
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="double"/>
					<xs:enumeration value="long"/>
					<xs:enumeration value="list"/>
					<xs:enumeration value="set"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
	</xs:complexType>
	<xs:complexType name="visitor">
		<xs:all>
			<xs:element name="condition" minOccurs="0" maxOccurs="1">
				<xs:complexType>
					<xs:attribute name="expression" type="xs:string" use="required"/>
					<xs:attribute name="action" use="required">
						<xs:simpleType>
							<xs:restriction base="xs:string">
								<xs:enumeration value="skip"/>
								<xs:enumeration value="stop"/>
								<xs:enumeration value="continue"/>
							</xs:restriction>
						</xs:simpleType>
					</xs:attribute>
				</xs:complexType>
			</xs:element>
			<xs:element name="exception" minOccurs="0" maxOccurs="1">
				<xs:complexType>
					<xs:attribute name="expression" type="xs:string" use="required"/>
					<xs:attribute name="returnValue" type="xs:string" use="required"/>
				</xs:complexType>
			</xs:element>
			<xs:element name="aggregationAction">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="type" type="xs:string"/>
						<xs:element name="operator" type="xs:string"/>
						<xs:sequence/>
					</xs:sequence>
					<xs:attribute name="level">
						<xs:simpleType>
							<xs:restriction base="xs:string">
								<xs:enumeration value="package-leve"/>
								<xs:enumeration value="class-level"/>
								<xs:enumeration value="method-level"/>
							</xs:restriction>
						</xs:simpleType>
					</xs:attribute>
					<xs:attribute name="action">
						<xs:simpleType>
							<xs:restriction base="xs:string">
								<xs:enumeration value="sum"/>
								<xs:enumeration value="multiply"/>
								<xs:enumeration value="average"/>
							</xs:restriction>
						</xs:simpleType>
					</xs:attribute>
				</xs:complexType>
			</xs:element>
			<xs:element ref="ns0:expression" minOccurs="0" maxOccurs="1"/>
			<xs:element name="variable" minOccurs="0" maxOccurs="1">
				<xs:complexType>
					<xs:attribute name="name" type="xs:string"/>
					<xs:attribute name="type">
						<xs:simpleType>
							<xs:restriction base="xs:string">
								<xs:enumeration value="long"/>
								<xs:enumeration value="double"/>
								<xs:enumeration value="string"/>
								<xs:enumeration value="list"/>
								<xs:enumeration value="set"/>
							</xs:restriction>
						</xs:simpleType>
					</xs:attribute>
					<xs:attribute name="scope">
						<xs:simpleType>
							<xs:restriction base="xs:string">
								<xs:enumeration value="package"/>
								<xs:enumeration value="class"/>
								<xs:enumeration value="method"/>
								<xs:enumeration value="attribute"/>
							</xs:restriction>
						</xs:simpleType>
					</xs:attribute>
				</xs:complexType>
			</xs:element>
			<xs:element name="invalidationCriteria" minOccurs="0" maxOccurs="1">
				<xs:complexType>
					<xs:attribute name="affectedElement" use="required">
						<xs:simpleType>
							<xs:restriction base="xs:string">
								<xs:enumeration value="Method"/>
								<xs:enumeration value="Class"/>
								<xs:enumeration value="Package"/>
								<xs:enumeration value="Field"/>
								<xs:enumeration value="Attribute"/>
								<xs:enumeration value="Parameter"/>
							</xs:restriction>
						</xs:simpleType>
					</xs:attribute>
					<xs:attribute name="variableName" type="xs:string" use="required"/>
					<xs:attribute name="condition" type="xs:string" use="required"/>
					<xs:attribute name="scope" use="required">
						<xs:simpleType>
							<xs:restriction base="xs:string">
								<xs:enumeration value="Method"/>
								<xs:enumeration value="Class"/>
								<xs:enumeration value="Package"/>
								<xs:enumeration value="Field"/>
								<xs:enumeration value="Attribute"/>
								<xs:enumeration value="Parameter"/>
							</xs:restriction>
						</xs:simpleType>
					</xs:attribute>
				</xs:complexType>
			</xs:element>
		</xs:all>
		<xs:attribute name="scope">
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="Package"/>
					<xs:enumeration value="Class"/>
					<xs:enumeration value="Method "/>
					<xs:enumeration value="Field	"/>
					<xs:enumeration value="Value	"/>
					<xs:enumeration value="Variable"/>
					<xs:enumeration value="Type"/>
					<xs:enumeration value="EnumerationType	"/>
					<xs:enumeration value="StructuredType"/>
					<xs:enumeration value="FormalParameter"/>
					<xs:enumeration value="Routine	"/>
					<xs:enumeration value="ExecutableValue"/>
					<xs:enumeration value="CollectionType"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="variableName" type="xs:string"/>
	</xs:complexType>
	<xs:complexType name="visualizationRules">
		<xs:choice>
			<xs:element name="graph" minOccurs="0" maxOccurs="unbounded">
				<xs:complexType>
					<xs:choice>
						<xs:element name="dimentionalProperty" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
					</xs:choice>
					<xs:attribute name="graphType" type="xs:string"/>
				</xs:complexType>
			</xs:element>
			<xs:element name="table" minOccurs="0" maxOccurs="unbounded">
				<xs:complexType>
					<xs:attribute name="organizeBy"/>
				</xs:complexType>
			</xs:element>
		</xs:choice>
		<xs:attribute name="visualizationForm">
			<xs:simpleType>
				<xs:restriction base="xs:string">
					<xs:enumeration value="Package"/>
					<xs:enumeration value="Class"/>
					<xs:enumeration value="Method "/>
					<xs:enumeration value="Field "/>
					<xs:enumeration value="Value "/>
					<xs:enumeration value="Variable"/>
					<xs:enumeration value="Type"/>
					<xs:enumeration value="EnumerationType "/>
					<xs:enumeration value="StructuredType"/>
					<xs:enumeration value="FormalParameter"/>
					<xs:enumeration value="Routine "/>
					<xs:enumeration value="ExecutableValue"/>
					<xs:enumeration value="CollectionType"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
	</xs:complexType>
</xs:schema>
