<?xml version="1.0" encoding="utf-8"?>
<xsd:schema elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:annotation>
        <xsd:documentation xml:lang="en">
            Configuration schema for Cruise. Copyright (c) 2009 ThoughtWorks, Inc.
            www.thoughtworks.com. All rights reserved.
        </xsd:documentation>
    </xsd:annotation>
    <xsd:element name="cruise">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element minOccurs="1" maxOccurs="1" name="server">
                    <xsd:complexType>
                        <xsd:all>
                            <xsd:element minOccurs="0" maxOccurs="1" name="license">
                                <xsd:complexType>
                                    <xsd:simpleContent>
                                        <xsd:extension base="xsd:string">
                                            <xsd:attribute name="user" type="xsd:string"/>
                                        </xsd:extension>
                                    </xsd:simpleContent>
                                </xsd:complexType>
                            </xsd:element>
                            <xsd:element minOccurs="0" maxOccurs="1" name="security" type="securityType"/>
                            <xsd:element minOccurs="0" maxOccurs="1" name="mailhost" type="mailHostType"/>
                        </xsd:all>
                        <xsd:attributeGroup ref="serverAttributeGroup"/>
                    </xsd:complexType>
                </xsd:element>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="pipelines" type="pipelinesType"/>
                <xsd:element minOccurs="0" name="agents" type="agentsType">
                    <xsd:unique name="uniqueUuid">
                        <xsd:selector xpath="agent"/>
                        <xsd:field xpath="@uuid"/>
                    </xsd:unique>
                </xsd:element>
                <xsd:element minOccurs="0" name="vmms" type="vmmsType"/>
            </xsd:sequence>
            <xsd:attribute name="schemaVersion" type="xsd:int" use="required" fixed="14"/>
        </xsd:complexType>
        <xsd:unique name="uniquePipeline">
            <xsd:selector xpath=".//pipeline"/>
            <xsd:field xpath="@name"/>
        </xsd:unique>
        <xsd:unique name="uniquePipelines">
            <xsd:selector xpath="pipelines"/>
            <xsd:field xpath="@group"/>
        </xsd:unique>
    </xsd:element>
    <xsd:complexType name="securityType">
        <xsd:all>
            <xsd:element minOccurs="0" maxOccurs="1" name="ldap" type="ldapType"/>
            <xsd:element minOccurs="0" maxOccurs="1" name="passwordFile" type="passwordfileType"/>
            <xsd:element minOccurs="0" maxOccurs="1" name="roles" type="rolesType">
                <xsd:unique name="uniqueRole">
                    <xsd:selector xpath="role"/>
                    <xsd:field xpath="@name"/>
                    <!-- Unique role name -->
                </xsd:unique>
            </xsd:element>
            <xsd:element minOccurs="0" maxOccurs="1" name="admins" type="adminType">
                <xsd:unique name="uniqueUserInAdmins">
                    <xsd:selector xpath="user"/>
                    <xsd:field xpath="."/>
                </xsd:unique>
                <xsd:unique name="uniqueRoleInAdmins">
                    <xsd:selector xpath="role"/>
                    <xsd:field xpath="."/>
                </xsd:unique>
            </xsd:element>
        </xsd:all>
        <xsd:attribute name="anonymous" type="xsd:boolean"/>
    </xsd:complexType>
    <xsd:complexType name="mailHostType">
        <xsd:attribute name="hostname" type="xsd:string" use="required"/>
        <xsd:attribute name="port" type="xsd:integer" use="required"/>
        <xsd:attribute name="username" type="xsd:string"/>
        <xsd:attribute name="password" type="xsd:string"/>
        <xsd:attribute name="tls" type="xsd:boolean" use="required"/>
        <xsd:attribute name="from" type="emailType" use="required"/>
        <xsd:attribute name="admin" type="emailType" use="required"/>
    </xsd:complexType>
    <xsd:simpleType name="emailType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value=".*@.*"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="rolesType">
        <xsd:sequence>
            <xsd:element minOccurs="1" maxOccurs="unbounded" name="role">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element minOccurs="0" maxOccurs="unbounded" name="user">
                            <xsd:simpleType>
                                <xsd:restriction base="xsd:string">
                                    <xsd:minLength value="1"/>
                                </xsd:restriction>
                            </xsd:simpleType>
                        </xsd:element>
                    </xsd:sequence>
                    <xsd:attribute name="name" type="nameType" use="required"/>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="adminType">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="user" type="xsd:string"/>
            <xsd:element name="role" type="xsd:string"/>
        </xsd:choice>
    </xsd:complexType>
    <xsd:complexType name="vmmsType">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="ec2" type="ec2Type"/>
        </xsd:choice>
    </xsd:complexType>
    <xsd:complexType name="ec2Type">
        <xsd:sequence>
            <xsd:element minOccurs="1" maxOccurs="unbounded" name="ami">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element minOccurs="0" name="resources" type="resourcesType"/>
                    </xsd:sequence>
                    <xsd:attribute name="imageId" type="xsd:string" use="required"/>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="accessKey" type="xsd:string" use="required"/>
        <xsd:attribute name="secretAccessKey" type="xsd:string" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="ldapType">
        <xsd:attribute name="uri" type="xsd:string" use="required"/>
        <xsd:attribute name="managerDn" type="xsd:string" use="required"/>
        <xsd:attribute name="managerPassword" type="xsd:string"/>
        <xsd:attribute name="searchBase" type="xsd:string" use="required"/>
        <xsd:attribute name="searchFilter" type="xsd:string" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="passwordfileType">
        <xsd:attribute name="path" type="xsd:string" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="pipelinesType">
        <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="1" name="authorization" type="authorizationType"/>
            <xsd:element maxOccurs="unbounded" name="pipeline">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element minOccurs="0" maxOccurs="1" name="trackingtool" type="trackingToolType"/>
                        <xsd:element minOccurs="0" maxOccurs="unbounded" name="dependencies" type="dependenciesType"/>
                        <xsd:element name="materials" type="materialsType">
                            <xsd:unique name="uniqueDependencyMaterial">
                                <xsd:selector xpath="pipeline"/>
                                <xsd:field xpath="@pipelineName"/>
                                <xsd:field xpath="@stageName"/>
                            </xsd:unique>
                        </xsd:element>
                        <xsd:element minOccurs="1" maxOccurs="unbounded" name="stage" type="stageType"/>
                    </xsd:sequence>
                    <xsd:attribute name="name" type="nameType" use="required"/>
                    <xsd:attribute name="labeltemplate" type="labelType"/>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="group" use="optional" default="defaultGroup" type="nameType"/>
    </xsd:complexType>
    <xsd:complexType name="stageType">
        <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="1" name="approval" type="approvalType"/>
            <xsd:element maxOccurs="unbounded" name="jobs" type="jobsType">
                <xsd:unique name="uniqueJob">
                    <xsd:selector xpath="job"/>
                    <xsd:field xpath="@name"/>
                </xsd:unique>
            </xsd:element>
        </xsd:sequence>
        <xsd:attribute name="name" type="nameType" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="approvalType">
        <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="1" name="authorization" type="authorizedUserListType"/>
        </xsd:sequence>
        <xsd:attribute name="type" use="required">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:enumeration value="success"/>
                    <xsd:enumeration value="manual"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
    </xsd:complexType>
    <xsd:complexType name="materialsType">
        <xsd:choice minOccurs="1" maxOccurs="unbounded">
            <xsd:element name="pipeline" type="pipelineType" />
            <xsd:element name="svn" type="svnType"/>
            <xsd:element name="hg">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="filter" type="filterType" minOccurs="0" maxOccurs="1"/>
                    </xsd:sequence>
                    <xsd:attribute name="url" type="xsd:string" use="required"/>
                    <xsd:attribute name="dest" type="filePathType" use="optional"/>
                </xsd:complexType>
            </xsd:element>
            <xsd:element name="p4" type="p4Type"/>
            <xsd:element name="git">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element name="filter" type="filterType" minOccurs="0" maxOccurs="1"/>
                    </xsd:sequence>
                    <xsd:attribute name="url" type="xsd:string" use="required"/>
                    <xsd:attribute name="dest" type="filePathType" use="optional"/>
                    <xsd:attribute name="branch" type="xsd:string" use="optional"/>
                </xsd:complexType>
            </xsd:element>
        </xsd:choice>
    </xsd:complexType>
    <xsd:complexType name="pipelineType">
        <xsd:attribute name="pipelineName" type="xsd:string" use="required"/>
        <xsd:attribute name="stageName" type="xsd:string" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="svnType">
        <xsd:sequence>
            <xsd:element name="filter" type="filterType" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
        <xsd:attribute name="url" type="xsd:string" use="required"/>
        <xsd:attribute name="username" type="xsd:string"/>
        <xsd:attribute name="password" type="xsd:string"/>
        <xsd:attribute name="checkexternals" type="xsd:boolean"/>
        <xsd:attribute name="dest" type="filePathType" use="optional"/>
    </xsd:complexType>
    <xsd:complexType name="p4Type">
        <xsd:sequence>
            <xsd:element name="view" minOccurs="1" maxOccurs="1"/>
            <xsd:element name="filter" type="filterType" minOccurs="0" maxOccurs="1"/>
        </xsd:sequence>
        <xsd:attribute name="port" type="p4PortType" use="required"/>
        <xsd:attribute name="username" type="xsd:string"/>
        <xsd:attribute name="password" type="xsd:string"/>
        <xsd:attribute name="useTickets" type="xsd:boolean" use="optional"/>
        <xsd:attribute name="dest" type="filePathType" use="optional"/>
    </xsd:complexType>
    <xsd:complexType name="jobsType">
        <xsd:sequence>
            <xsd:element maxOccurs="unbounded" name="job" type="jobType"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="jobType">
        <xsd:all>
            <xsd:element minOccurs="0" name="tasks" type="tasksType"/>
            <xsd:element minOccurs="0" name="artifacts" type="artifactsType"/>
            <xsd:element minOccurs="0" name="resources" type="resourcesType"/>
            <xsd:element minOccurs="0" name="tabs" type="tabsType">
                <xsd:unique name="uniqueTabsName">
                    <xsd:selector xpath="tab"/>
                    <xsd:field xpath="@name"/>
                </xsd:unique>
            </xsd:element>
            <xsd:element minOccurs="0" name="properties" type="propertiesType">
                <xsd:unique name="uniqueProperty">
                    <xsd:selector xpath="property"/>
                    <xsd:field xpath="@name"/>
                </xsd:unique>
            </xsd:element>
        </xsd:all>
        <xsd:attribute name="name" type="jobnameType" use="required"/>
    </xsd:complexType>
    <xsd:complexType name="resourcesType">
        <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="resource" type="xsd:string"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="tabsType">
        <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" ref="tab"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:attributeGroup name="taskAttributes">
        <xsd:attribute name="workingdir" type="filePathType" use="optional"/>
        <xsd:attribute name="buildfile" type="xsd:string" use="optional"/>
        <xsd:attribute name="target" type="xsd:string" use="optional"/>
    </xsd:attributeGroup>
    <xsd:complexType name="taskType" abstract="true">
        <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="runif" type="runIfType"/>
            <xsd:element minOccurs="0" maxOccurs="1" name="oncancel" type="onCancelType"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="antType">
        <xsd:complexContent mixed="false">
            <xsd:extension base="taskType">
                <xsd:attributeGroup ref="taskAttributes"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="nantType">
        <xsd:complexContent mixed="false">
            <xsd:extension base="taskType">
                <xsd:attributeGroup ref="taskAttributes"/>
                <xsd:attribute name="nantpath" type="xsd:string" use="optional"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="execType">
        <xsd:complexContent mixed="false">
            <xsd:extension base="taskType">
                <xsd:sequence minOccurs="0" maxOccurs="unbounded">
                    <xsd:element name="arg">
                        <xsd:complexType>
                            <xsd:attribute name="value" type="xsd:string"/>
                        </xsd:complexType>
                    </xsd:element>
                </xsd:sequence>
                <xsd:attributeGroup ref="execAttributes"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="rakeType">
        <xsd:complexContent mixed="false">
            <xsd:extension base="taskType">
                <xsd:attributeGroup ref="taskAttributes"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="fetchType">
        <xsd:complexContent mixed="false">
            <xsd:extension base="taskType">
                <xsd:attribute name="pipeline" type="xsd:string" use="optional"/>
                <xsd:attribute name="stage" type="xsd:string" use="required"/>
                <xsd:attribute name="job" type="xsd:string" use="required"/>
                <xsd:attribute name="srcdir" type="filePathType"/>
                <xsd:attribute name="srcfile" type="filePathType"/>
                <xsd:attribute name="dest" type="filePathType"/>
                <xsd:attributeGroup ref="taskAttributes"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:element abstract="true" name="task" type="taskType"/>
    <xsd:element name="ant" substitutionGroup="task" type="antType"/>
    <xsd:element name="nant" substitutionGroup="task" type="nantType"/>
    <xsd:element name="exec" substitutionGroup="task" type="execType"/>
    <xsd:element name="rake" substitutionGroup="task" type="rakeType"/>
    <xsd:element name="fetchartifact" substitutionGroup="task" type="fetchType"/>

    <xsd:complexType name="tasksType">
        <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" ref="task"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="artifactsType">
        <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" ref="artifactType"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="abstractArtifactType" abstract="true"/>
    <xsd:complexType name="logType">
        <xsd:complexContent mixed="false">
            <xsd:extension base="abstractArtifactType">
                <xsd:attributeGroup ref="genericArtifactAttributeGroup"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="testType">
        <xsd:complexContent mixed="false">
            <xsd:extension base="abstractArtifactType">
                <xsd:attributeGroup ref="genericArtifactAttributeGroup"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:complexType name="artifactType">
        <xsd:complexContent mixed="false">
            <xsd:extension base="abstractArtifactType">
                <xsd:attributeGroup ref="genericArtifactAttributeGroup"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <xsd:element abstract="true" name="artifactType" type="abstractArtifactType"/>
    <xsd:element name="test" substitutionGroup="artifactType" type="testType"/>
    <xsd:element name="artifact" substitutionGroup="artifactType" type="artifactType"/>
    <xsd:element name="log" substitutionGroup="artifactType" type="logType"/>
    <xsd:simpleType name="dirType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="\d{3}-[A-Z]{2}"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:attributeGroup name="genericArtifactAttributeGroup">
        <xsd:attribute name="src" type="xsd:string"/>
        <xsd:attribute name="dest" type="filePathType"/>
    </xsd:attributeGroup>
    <xsd:complexType name="agentsType">
        <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="agent">
                <xsd:complexType>
                    <xsd:sequence>
                        <xsd:element minOccurs="0" name="resources" type="resourcesType"/>
                    </xsd:sequence>
                    <xsd:attribute name="hostname" type="xsd:string" use="required"/>
                    <xsd:attribute name="ipaddress" type="ipaddressType" use="required"/>
                    <xsd:attribute name="uuid" type="xsd:string" use="required"/>
                    <xsd:attribute name="isDenied" type="xsd:boolean" use="optional"/>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:simpleType name="ipaddressType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="nameType">
        <xsd:restriction base="xsd:string">
            <xsd:maxLength value="255"/>
            <xsd:pattern value="[a-zA-Z0-9_\-]{1}[a-zA-Z0-9_\-.]*"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="propertyNameType">
        <xsd:restriction base="nameType">
            <xsd:maxLength value="255"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="middleLengthString">
        <xsd:restriction base="xsd:string">
            <xsd:maxLength value="512"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="p4PortType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="[^:^\s]+:\d+"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="nonEmptyString">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="[\s]*[\S][\s\S]*"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="labelType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="([a-zA-Z0-9_\-.!~*'()])*(\$\{COUNT\})+([a-zA-Z0-9_\-.!~*'()])*"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="jobnameType">
        <xsd:restriction base="xsd:string">
            <xsd:maxLength value="255"/>
            <xsd:pattern value="[a-zA-Z0-9_\-.]+"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:attributeGroup name="serverAttributeGroup">
        <xsd:attribute name="artifactsdir" type="xsd:string" default="logs"/>
    </xsd:attributeGroup>
    <xsd:attributeGroup name="execAttributes">
        <xsd:attribute name="command" type="commandType" use="required"/>
        <xsd:attribute name="args" type="xsd:string"/>
        <xsd:attribute name="workingdir" type="filePathType"/>
        <xsd:attribute name="timeout" type="xsd:positiveInteger"/>
    </xsd:attributeGroup>
    <xsd:simpleType name="commandType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value=".*[\S]+.*"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="dependsType">
        <xsd:attribute use="required" name="pipeline" type="xsd:string"/>
        <xsd:attribute use="required" name="stage" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="dependenciesType">
        <xsd:sequence>
            <xsd:element minOccurs="0" maxOccurs="unbounded" name="depends" type="dependsType"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:element name="tab">
        <xsd:complexType>
            <xsd:attribute name="name" use="required">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:maxLength value="15"/>
                        <xsd:pattern value="[a-zA-Z0-9_\-.]+"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:attribute>
            <xsd:attribute name="path" use="required">
                <xsd:simpleType>
                    <xsd:restriction base="xsd:string">
                        <xsd:pattern value="[\S]+"/>
                    </xsd:restriction>
                </xsd:simpleType>
            </xsd:attribute>
        </xsd:complexType>
    </xsd:element>
    <xsd:simpleType name="filePathType">
        <xsd:restriction base="xsd:string" xml:space="default">
            <xsd:pattern value="([^. ].+[^. ])|([^. ][^. ])|([^. ])"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:complexType name="propertiesType">
        <xsd:sequence>
            <xsd:element name="property" minOccurs="1" maxOccurs="unbounded" type="propertyType"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="propertyType">
        <xsd:attribute name="name" type="propertyNameType" use="required"/>
        <xsd:attribute name="src" type="middleLengthString"/>
        <xsd:attribute name="xpath" type="middleLengthString"/>
    </xsd:complexType>
    <xsd:complexType name="trackingToolType">
        <xsd:attribute name="link" type="xsd:string" use="required"/>
        <xsd:attribute name="regex" type="xsd:string" use="required"/>
    </xsd:complexType>
    <xsd:element name="filter" type="filterType"/>
    <xsd:complexType name="filterType">
        <xsd:sequence>
            <xsd:element name="ignore" minOccurs="1" maxOccurs="unbounded">
                <xsd:complexType>
                    <xsd:attribute name="pattern" type="xsd:string" use="required"/>
                </xsd:complexType>
            </xsd:element>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="runIfType">
        <xsd:attribute name="status" use="required">
            <xsd:simpleType>
                <xsd:restriction base="xsd:string">
                    <xsd:enumeration value="passed"/>
                    <xsd:enumeration value="failed"/>
                    <xsd:enumeration value="any"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
    </xsd:complexType>
    <xsd:complexType name="onCancelType">
        <xsd:sequence>
            <xsd:element ref="task" minOccurs="1" maxOccurs="1"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="authorizationType">
        <xsd:all>
            <xsd:element name="view" type="authorizedUserListType" minOccurs="0" maxOccurs="1">
                <xsd:unique name="uniqueUserInView">
                    <xsd:selector xpath="user"/>
                    <xsd:field xpath="."/>
                </xsd:unique>
                <xsd:unique name="uniqueRoleInView">
                    <xsd:selector xpath="role"/>
                    <xsd:field xpath="."/>
                </xsd:unique>
            </xsd:element>
            <xsd:element name="operate" type="authorizedUserListType" minOccurs="0" maxOccurs="1">
                <xsd:unique name="uniqueUserInOperate">
                    <xsd:selector xpath="user"/>
                    <xsd:field xpath="."/>
                </xsd:unique>
                <xsd:unique name="uniqueRoleInOperate">
                    <xsd:selector xpath="role"/>
                    <xsd:field xpath="."/>
                </xsd:unique>
            </xsd:element>
        </xsd:all>
    </xsd:complexType>
    <xsd:complexType name="authorizedUserListType">
        <xsd:choice minOccurs="1" maxOccurs="unbounded">
            <xsd:element name="user" type="xsd:string"/>
            <xsd:element name="role" type="xsd:string"/>
        </xsd:choice>
    </xsd:complexType>
</xsd:schema>

