<?xml version="1.0"?>

<!--  $Header: opsm/cv/cvdata/prereq.xsd /st_has_11.2.0/2 2011/06/12 13:26:35 nvira Exp $ -->

<!--
 Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. 

   NAME
     prereq.xsd - CVU prereq schema

   DESCRIPTION
     XML schema for CVU prereq xmls

   NOTES
     <other useful comments, qualifications, etc.>

   MODIFIED   (MM/DD/YY)
    nvira       06/09/11 - Backport nvira_bug-12543900 from main
    nvira       05/16/11 - Backport nvira_bug-12378265 from main
    nvira       05/26/11 - add section for RAC home patches
    nvira       04/12/11 - add check oracle patches
    nvira       05/10/10 - add range to condition
    nvira       02/11/10 - XbranchMerge msingal_bug-8653583 from main
    ptare       01/18/10 - Bug#8655778 Add Property EQ
    ptare       10/20/09 - updated for ENV_VAR_LIST element
    nvira       05/03/09 - update Architecture element to allow multiple
                           architectures
    nvira       04/24/09 - add attribute for package architecture
    nvira       03/11/09 - update xsd for run level
    nvira       02/02/09 - add min max attributes to swap space
    nvira       10/12/08 - add ospatch tag
    nvira       02/29/08 - Creation

-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.w3.org/2001/XMLSchema http://www.w3.org/2001/XMLSchema.xsd"
  elementFormDefault="qualified">
  <xs:element name="HOST">
    <xs:complexType>
      <xs:all>
        <xs:element name="SYSTEM" type="SYSTEM_TYPE"
          minOccurs="0" maxOccurs="1" />
        <xs:element name="CERTIFIED_SYSTEMS" type="CERTIFIED_SYSTEMS_TYPE"
          minOccurs="1" maxOccurs="1" />
        <xs:element name="REFERENCE_DEVICES" minOccurs="0" maxOccurs="1" >
          <xs:complexType>
            <xs:sequence>
              <!--
              CVU does not care about the contents of  this element. Hence the content 'any'
               -->
              <xs:any minOccurs="0" maxOccurs="unbounded"
                processContents="lax" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="SCRIPTS" minOccurs="0" maxOccurs="1" >
          <xs:complexType>
            <xs:sequence>
              <!--
              CVU does not care about the contents of  this element. Hence the content 'any'
               -->
              <xs:any minOccurs="0" maxOccurs="unbounded"
                processContents="lax" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="USER_INPUTS" minOccurs="0" maxOccurs="1" >
          <xs:complexType>
            <xs:sequence>
              <!--
              CVU does not care about the contents of  this element. Hence the content 'any'
               -->
              <xs:any minOccurs="0" maxOccurs="unbounded"
                processContents="lax" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="DIRS" minOccurs="0" maxOccurs="1" >
          <xs:complexType>
            <xs:sequence>
              <!--
              CVU does not care about the contents of  this element. Hence the content 'any'
               -->
              <xs:any minOccurs="0" maxOccurs="unbounded"
                processContents="lax" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="NETWORK" minOccurs="0" maxOccurs="1" >
          <xs:complexType>
            <xs:sequence>
              <!--
              CVU does not care about the contents of  this element. Hence the content 'any'
               -->
              <xs:any minOccurs="0" maxOccurs="unbounded"
                processContents="lax" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="ORACLE_HOME" minOccurs="0" maxOccurs="1" >
          <xs:complexType>
            <xs:sequence>
              <!--
              CVU does not care about the contents of  this element. Hence the content 'any'
               -->
              <xs:any minOccurs="0" maxOccurs="unbounded"
                processContents="lax" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:all>
      <xs:attribute name="PLATID" type="xs:string"  use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:complexType name="SYSTEM_TYPE">
    <xs:all>
      <xs:element name="MEMORY" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:all>
            <xs:element name="PHYSICAL_MEMORY" minOccurs="1"
              maxOccurs="1">
              <xs:complexType>
                <xs:attribute name="VALUE" type="NonNegativeDouble"  use="required"/>
                <xs:attribute name="UNIT" type="STORAGE_UNITS_TYPE"
                  use="required" />
                <xs:attribute name="SEVERITY" type="SEVERITY_TYPE"
                  use="optional" />
              </xs:complexType>
            </xs:element>
            <xs:element name="AVAILABLE_MEMORY" minOccurs="0"
              maxOccurs="1">
              <xs:complexType>
                <xs:attribute name="VALUE" type="NonNegativeDouble" use="required"/>
                <xs:attribute name="UNIT" type="STORAGE_UNITS_TYPE"
                  use="required" />
                <xs:attribute name="SEVERITY" type="SEVERITY_TYPE"
                  use="optional" />
              </xs:complexType>
            </xs:element>
            <xs:element name="SWAP_SIZE" type="SWAP_SIZE_TYPE"
              minOccurs="0" maxOccurs="1" />
          </xs:all>
        </xs:complexType>
      </xs:element>
      <xs:element name="SPACE" type="SPACE_TYPE" minOccurs="0"
        maxOccurs="1" />
      <xs:element name="USERS_GROUPS" type="USERS_GROUPS_TYPE"
        minOccurs="0" maxOccurs="1" />
      <xs:element name="RUNLEVEL" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
		    <xs:element name="LIST" minOccurs="0" maxOccurs="1">
		        <xs:complexType>
		          <xs:sequence>
		            <xs:element name="VALUE" minOccurs="1" maxOccurs="unbounded" type="xs:nonNegativeInteger"/> 
		          </xs:sequence>
		        </xs:complexType>
		    </xs:element>
		  </xs:sequence>
          <xs:attribute name="CURRENT" use="optional">
            <xs:simpleType>
              <xs:restriction base="xs:integer">
                <xs:minInclusive value="0" />
                <xs:maxInclusive value="9" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
          <xs:attribute name="DEFAULT" use="optional">
            <xs:simpleType>
              <xs:restriction base="xs:integer">
                <xs:minInclusive value="0" />
                <xs:maxInclusive value="9" />
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
          <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
        </xs:complexType>
      </xs:element>
      <xs:element name="SHELL_LIMIT_CHECKS" minOccurs="0"
        maxOccurs="1">
        <xs:complexType>
          <xs:group ref="SHELL_LIMITS_GROUP" />
        </xs:complexType>
      </xs:element>
      <xs:element name="PROCESS_CHECKS" minOccurs="0"
        maxOccurs="1">
        <xs:complexType>
            <!--
            Use group reference to allow nesting of CHOICE, CONDITION & PROCESS_CHECK tags
             -->
          <xs:group ref="PROCESSCHECKS_GROUP" minOccurs="0"
            maxOccurs="unbounded" />
        </xs:complexType>
      </xs:element>
      <xs:element name="ORACLE_PATCH_CHECKS" minOccurs="0" maxOccurs="1">
        <xs:complexType>
        <xs:sequence>
          <xs:element name="SOURCE_HOME_PATCHES" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:group ref="ORACLE_PATCH_GROUP" minOccurs="0" maxOccurs="unbounded" />
            </xs:complexType>
          </xs:element>
          <xs:element name="DESTINATION_HOME_PATCHES" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:group ref="ORACLE_PATCH_GROUP" minOccurs="0" maxOccurs="unbounded" />
            </xs:complexType>
          </xs:element>
          <xs:element name="RAC_HOME_PATCHES" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:group ref="ORACLE_PATCH_GROUP" minOccurs="0" maxOccurs="unbounded" />
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:all>
  </xs:complexType>
  <xs:complexType name="CERTIFIED_SYSTEMS_TYPE">
    <xs:sequence>
      <xs:element name="OPERATING_SYSTEM" type="OPERATING_SYSTEM_TYPE"
        minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="SPACE_TYPE">
    <xs:sequence>
      <xs:element name="LOC" minOccurs="1" maxOccurs="unbounded">
        <xs:complexType>
          <!--
          NOTE: Either VAR or VALUE must be specified. It is not possible to mandate to mandate one attribute over the other in the grammar.
          The either or is enforced while constructing the task list in Java.
           -->
          <xs:attribute name="VAR" type="xs:string" use="optional" />
          <xs:attribute name="VALUE" type="xs:string" use="optional" />
          <xs:attribute name="SIZE" type="NonNegativeDouble" use="required"/>
          <xs:attribute name="UNIT" type="STORAGE_UNITS_TYPE"
            use="required" />
          <xs:attribute name="TEMP" type="xs:boolean" use="optional" />
        	<xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="STORAGE_UNITS_TYPE">
    <xs:restriction base="xs:string">
      <xs:enumeration value="B" />
      <xs:enumeration value="KB" />
      <xs:enumeration value="MB" />
      <xs:enumeration value="GB" />
      <xs:enumeration value="TB" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="RANGE_OPERATOR_TYPE">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ATLEAST" />
      <xs:enumeration value="ATMOST" />
      <xs:enumeration value="GREATER_THAN" />
      <xs:enumeration value="LESS_THAN" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="SEVERITY_TYPE">
    <xs:restriction base="xs:string">
      <xs:enumeration value="CRITICAL" />
      <xs:enumeration value="IGNORABLE" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="NonNegativeDouble">
    <xs:restriction base="xs:double">
      <xs:minInclusive value="0.0" />
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="USERS_GROUPS_TYPE">
    <xs:group ref="USERS_GROUPS_XSDGROUP" minOccurs="0" maxOccurs="unbounded" />
  </xs:complexType>
  <xs:group name="USERS_GROUPS_XSDGROUP">
    <xs:choice>
      <xs:element name="USER" type="USER_TYPE" />
      <xs:element name="GROUP" type="GROUP_TYPE" />
      <xs:element name="CONDITION">
        <xs:complexType>
          <xs:group ref="USERS_GROUPS_XSDGROUP" minOccurs="0"
            maxOccurs="unbounded" />
          <xs:attribute name="VAR" type="xs:string" />
          <xs:attribute name="TYPE" type="xs:string"
            use="optional" />
          <xs:attribute name="EQ" type="xs:string"
            use="optional" />
          <xs:attribute name="ATLEAST" type="xs:string"
            use="optional" />
          <xs:attribute name="ATMOST" type="xs:string"
            use="optional" />
          <xs:attribute name="GREATER_THAN" type="xs:string"
            use="optional" />
          <xs:attribute name="LESS_THAN" type="xs:string"
            use="optional" />
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:group>

  <xs:complexType name="USER_TYPE">
     <xs:sequence>
       <xs:element name="GROUP" minOccurs="0" maxOccurs="unbounded" type="GROUP_TYPE" />
     </xs:sequence>
       <!--
       NOTE: Either VAR or VALUE must be specified. It is not possible to mandate to mandate one attribute over the other in the grammar.
       The either or is enforced while constructing the task list in Java.
        -->
     <xs:attribute name="VAR" type="xs:string" use="optional" />
     <xs:attribute name="VALUE" type="xs:string" use="optional" />
     <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
  </xs:complexType>
  <xs:complexType name="GROUP_TYPE">
    <!--
    NOTE: Either VAR or VALUE must be specified. It is not possible to mandate to mandate one attribute over the other in the grammar.
    The either or is enforced while constructing the task list in Java.
     -->
    <xs:attribute name="VAR" type="xs:string"
      use="optional" />
    <xs:attribute name="VALUE" type="xs:string"
      use="optional" />
    <xs:attribute name="ACTIVE" type="xs:boolean"
      use="optional" />
    <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
  </xs:complexType>
  <!--
  NOTE: Swap size can be specified interms of multiple of Physical Memory or as an absolute value.
  Thus either of the following are valid expressions for Swap size:

            <SWAP_SIZE>
            <STEPS>
               <STEP NAME="PHYSICAL_MEMORY" ATLEAST="0" ATMOST="256" UNIT="MB" MULTIPLE="3"/>
               <STEP NAME="PHYSICAL_MEMORY" GREATER_THAN="256" ATMOST="512" UNIT="MB" MULTIPLE="2"/>
               <STEP NAME="PHYSICAL_MEMORY" GREATER_THAN="512" ATMOST="2048" UNIT="MB" MULTIPLE="1.5"/>
               <STEP NAME="PHYSICAL_MEMORY" GREATER_THAN="2048" ATMOST="8192" UNIT="MB" MULTIPLE="1"/>
               <STEP NAME="PHYSICAL_MEMORY" GREATER_THAN="8192" UNIT="MB" MULTIPLE="0.75"/>
            </STEPS>
          </SWAP_SIZE>

  OR

            <SWAP_SIZE  VALUE="20" UNIT="MB"/>

   It is not possible to enforce either or definition of swap size in the grammar. Hence, the definition combines the two form in a single declaration.
   The either or is enforced while constructing the task list in Java.
   -->
  <xs:complexType name="SWAP_SIZE_TYPE">
    <xs:all>
      <xs:element name="STEPS" minOccurs="0" maxOccurs="1" type="STEPS_TYPE">
      </xs:element>
    </xs:all>
    <xs:attribute name="VALUE" use="optional">
      <xs:simpleType>
        <xs:restriction base="xs:decimal">
          <xs:minInclusive value="0" />
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="UNIT" type="STORAGE_UNITS_TYPE" />
	  <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
  </xs:complexType>
  <xs:complexType name="STEPS_TYPE">
        <xs:sequence>
            <xs:element name="MIN" minOccurs="0" maxOccurs="1">
              <xs:complexType>
                <xs:attribute name="VALUE" type="NonNegativeDouble" use="required" />
                <xs:attribute name="UNIT" type="STORAGE_UNITS_TYPE" use="required" />
              </xs:complexType>
            </xs:element>
            <xs:element name="MAX" minOccurs="0" maxOccurs="1">
              <xs:complexType>
                <xs:attribute name="VALUE" type="NonNegativeDouble" use="required" />
                <xs:attribute name="UNIT" type="STORAGE_UNITS_TYPE" use="required" />
              </xs:complexType>
            </xs:element>
            <xs:element name="STEP" minOccurs="1" maxOccurs="unbounded">
              <xs:complexType>
                <xs:attribute name="NAME" use="required">
                  <xs:simpleType>
                    <xs:restriction base="xs:string">
                      <!--
                        NOTE: In future swap size could be expressed as multiple of attributes other than PHYSICAL_MEMORY.
                        But currently we only support PHYSICAL_MEMORY.
                      -->
                      <xs:enumeration value="PHYSICAL_MEMORY" />
                    </xs:restriction>
                  </xs:simpleType>
                </xs:attribute>
                <!--
                  NOTE: When specifying the range at least one of the range operators are mandatory out of VALUE, ATLEAST,ATMOST, GREATER_THAN, LESS_THAN.
                  It is not possible to express this requirement in XSD. It will be enforced in Java.
                -->
                <xs:attribute name="ATLEAST" type="NonNegativeDouble" use="optional" />
                <xs:attribute name="ATMOST" type="NonNegativeDouble" use="optional" />
                <xs:attribute name="GREATER_THAN" type="NonNegativeDouble" use="optional" />
                <xs:attribute name="LESS_THAN" type="NonNegativeDouble" use="optional" />
                <xs:attribute name="UNIT" type="STORAGE_UNITS_TYPE" use="required" />
                <xs:attribute name="MULTIPLE" type="NonNegativeDouble" use="required" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
  </xs:complexType>
  <xs:complexType name="OPERATING_SYSTEM_TYPE">
    <xs:all>
      <xs:element name="VERSION" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:attribute name="VALUE" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
      <xs:element name="ARCHITECTURE" minOccurs="0"
        maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="LIST" minOccurs="0" maxOccurs="1">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="VALUE" minOccurs="1" maxOccurs="unbounded" type="xs:string"/> 
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="VALUE" type="xs:string" use="optional" />
        </xs:complexType>
      </xs:element>
      <xs:element name="OSPATCH_CHECKS" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:group ref="OSPATCH_GROUP" minOccurs="0" maxOccurs="unbounded" />
        </xs:complexType>
      </xs:element>
      <xs:element name="NAME" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:attribute name="VALUE" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
      <xs:element name="VENDOR" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:attribute name="VALUE" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
      <xs:element name="ENV_VAR_LIST" minOccurs="0" maxOccurs="1">
        <xs:complexType>
         <xs:sequence>
          <xs:element name="ENV_VAR" minOccurs="0"  maxOccurs="unbounded">
           <xs:complexType>
              <xs:attribute name="NAME" type="xs:string" use="required" />
              <xs:attribute name="MAX_LENGTH" type="xs:string" use="optional" />
              <xs:attribute name="SET" type="xs:boolean" use="optional" />
           </xs:complexType>
          </xs:element>
         </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="KERNEL_VER" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:attribute name="VALUE" type="xs:string" use="required" />
        </xs:complexType>
      </xs:element>
      <xs:element name="KERNEL" minOccurs="0" maxOccurs="1">
        <xs:complexType>
            <!--
            Use group reference to allow nesting of CHOICE, CONDITION & PROPERTY tags
             -->
          <xs:group ref="KERNEL_GROUP" minOccurs="0" maxOccurs="unbounded" />
        </xs:complexType>
      </xs:element>
      <xs:element name="PACKAGES" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:group ref="PACKAGE_GROUP" minOccurs="0"
            maxOccurs="unbounded" />
        </xs:complexType>
      </xs:element>
      <xs:element name="SYSTEM_FILES" minOccurs="0"
        maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
              <!--
              CVU does not care about the contents of  this element. Hence the content 'any'
               -->
            <xs:any minOccurs="0" maxOccurs="unbounded"
              processContents="lax" />
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:all>
    <xs:attribute name="RELEASE" type="xs:string" use="required" />
  </xs:complexType>
  <xs:group name="KERNEL_GROUP">
    <xs:choice>
      <xs:element name="PROPERTY">
	<xs:complexType>
		<xs:sequence>
			<xs:element name="STEPS" minOccurs="0" maxOccurs="1">
				<xs:complexType>
					<xs:sequence>
                                          <xs:element name="MIN" minOccurs="0" maxOccurs="1">
							<xs:complexType>
                                              <xs:attribute name="VALUE" type="NonNegativeDouble" use="required" />
                                              <xs:attribute name="UNIT" type="STORAGE_UNITS_TYPE" use="required" />
							</xs:complexType>
						</xs:element>                                          <xs:element name="MAX" minOccurs="0" maxOccurs="1">
                                            <xs:complexType>
                                              <xs:attribute name="VALUE" type="NonNegativeDouble" use="required" />
                                              <xs:attribute name="UNIT" type="STORAGE_UNITS_TYPE" use="required" />
                                            </xs:complexType>
                                          </xs:element>
						<xs:element name="STEP" minOccurs="1" maxOccurs="unbounded">
							<xs:complexType>
								<xs:attribute name="NAME" use="required">
									<xs:simpleType>
										<xs:restriction base="xs:string">
											<!--
												NOTE: In future swap size could be expressed as multiple of
												attributes other than PHYSICAL_MEMORY. But currently we only
												support PHYSICAL_MEMORY.
											-->
											<xs:enumeration value="PHYSICAL_MEMORY" />
										</xs:restriction>
									</xs:simpleType>
								</xs:attribute>
								<!--
									NOTE: When specifiying the range at least one of the range
									operators are manadatory out of VALUE, ATLEAST,ATMOST,
									GREATER_THAN, LESS_THAN. It is not possible to express this
									requirement in XSD. It will be enforced in Java.
								-->
								<xs:attribute name="ATLEAST" type="NonNegativeDouble"
									use="optional" />
								<xs:attribute name="ATMOST" type="NonNegativeDouble"
									use="optional" />
								<xs:attribute name="GREATER_THAN" type="NonNegativeDouble"
									use="optional" />
								<xs:attribute name="LESS_THAN" type="NonNegativeDouble"
									use="optional" />
								<xs:attribute name="UNIT" type="STORAGE_UNITS_TYPE"
									use="required" />
								<xs:attribute name="MULTIPLE" type="NonNegativeDouble"
									use="required" />
							</xs:complexType>
						</xs:element>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:sequence>

          <xs:attribute name="NAME" type="xs:string" use="required" />
          <xs:attribute name="NAME2" type="xs:string" use="optional" />
            <!--
            NOTE: When specifying the range at least one of the range operators are mandatory of VALUE, ATLEAST,ATMOST, GREATER_THAN, LESS_THAN.
            It is not possible to express this requirement in XSD. It will be enforced in Java.
             -->
          <xs:attribute name="VALUE" type="xs:string"
            use="optional" />
          <xs:attribute name="EQ" type="xs:string"
            use="optional" />
          <xs:attribute name="ATLEAST" type="xs:string"
            use="optional" />
          <xs:attribute name="ATMOST" type="xs:string"
            use="optional" />
          <xs:attribute name="GREATER_THAN" type="xs:string"
            use="optional" />
          <xs:attribute name="LESS_THAN" type="xs:string"
            use="optional" />
          <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
        </xs:complexType>
      </xs:element>
      <xs:element name="CHOICE">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="SELECTION" minOccurs="0"
              maxOccurs="unbounded">
              <xs:complexType>
                <xs:group ref="KERNEL_GROUP" minOccurs="0"
                  maxOccurs="unbounded" />
                <xs:attribute name="VALUE" type="xs:string" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="VAR" type="xs:string" />
        </xs:complexType>
      </xs:element>
      <xs:element name="CONDITION">
        <xs:complexType>
          <xs:group ref="PACKAGE_GROUP" minOccurs="0"
            maxOccurs="unbounded" />
          <xs:attribute name="VAR" type="xs:string" use="required" />
          <xs:attribute name="TYPE" type="xs:string"
            use="optional" />
          <xs:attribute name="EQ" type="xs:string"
            use="optional" />
          <xs:attribute name="ATLEAST" type="xs:string"
            use="optional" />
          <xs:attribute name="ATMOST" type="xs:string"
            use="optional" />
          <xs:attribute name="GREATER_THAN" type="xs:string"
            use="optional" />
          <xs:attribute name="LESS_THAN" type="xs:string"
            use="optional" />
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:group>

  <xs:group name="OSPATCH_GROUP">
    <xs:choice>
      <xs:element name="OSPATCH" minOccurs="1" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="VALUE" type="xs:string" use="required" />
          <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
        </xs:complexType>
      </xs:element>
      <xs:element name="CHOICE">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="SELECTION" minOccurs="0"
              maxOccurs="unbounded">
              <xs:complexType>
                <xs:group ref="OSPATCH_GROUP" minOccurs="0"
                  maxOccurs="unbounded" />
                <xs:attribute name="VALUE" type="xs:string" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="VAR" type="xs:string" />
        </xs:complexType>
      </xs:element>
      <xs:element name="CONDITION">
        <xs:complexType>
          <xs:group ref="OSPATCH_GROUP" minOccurs="0" maxOccurs="unbounded" />
          <xs:attribute name="VAR" type="xs:string" />
          <xs:attribute name="TYPE" type="xs:string"
            use="optional" />
          <xs:attribute name="EQ" type="xs:string"
            use="optional" />
          <xs:attribute name="ATLEAST" type="xs:string"
            use="optional" />
          <xs:attribute name="ATMOST" type="xs:string"
            use="optional" />
          <xs:attribute name="GREATER_THAN" type="xs:string"
            use="optional" />
          <xs:attribute name="LESS_THAN" type="xs:string"
            use="optional" />
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:group>

  <xs:group name="ORACLE_PATCH_GROUP">
    <xs:choice>
      <xs:element name="ORACLE_PATCH" minOccurs="1" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="VALUE" type="xs:string" use="required" />
          <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
        </xs:complexType>
      </xs:element>
      <xs:element name="CHOICE">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="SELECTION" minOccurs="0"
              maxOccurs="unbounded">
              <xs:complexType>
                <xs:group ref="ORACLE_PATCH_GROUP" minOccurs="0"
                  maxOccurs="unbounded" />
                <xs:attribute name="VALUE" type="xs:string" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="VAR" type="xs:string" />
        </xs:complexType>
      </xs:element>
      <xs:element name="CONDITION">
        <xs:complexType>
          <xs:group ref="ORACLE_PATCH_GROUP" minOccurs="0" maxOccurs="unbounded" />
          <xs:attribute name="VAR" type="xs:string" />
          <xs:attribute name="TYPE" type="xs:string"
            use="optional" />
          <xs:attribute name="EQ" type="xs:string"
            use="optional" />
          <xs:attribute name="ATLEAST" type="xs:string"
            use="optional" />
          <xs:attribute name="ATMOST" type="xs:string"
            use="optional" />
          <xs:attribute name="GREATER_THAN" type="xs:string"
            use="optional" />
          <xs:attribute name="LESS_THAN" type="xs:string"
            use="optional" />
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:group>

  <xs:group name="PACKAGE_GROUP">
    <xs:choice>
      <!--
      NOTE: Package value can be specified as a range or as an absolute value.
      Thus either of the following are valid expressions for PACKAGE:

            <PACKAGE NAME="glibc">
               <RANGE ATLEAST="2.2.4-31.7" ATMOST="2.2.4-37.9">
                  <EXCLUDE VALUE="2.2.4-31.8"/>
                  <EXCLUDE ATLEAST="2.2.4-32" ATMOST="2.2.4-33"/>
               </RANGE>
            </PACKAGE>

       OR

           <PACKAGE NAME="libaio" VALUE="0.3.96" />

       It is not possible to enforce either or definition of swap size in the grammar. Hence, the definition combines the two form in a single declaration.
       The either or is enforced while constructing the task list in Java.
       -->
      <xs:element name="PACKAGE">
        <xs:complexType>
          <xs:sequence>
            <!--
            NOTE: When specifying the range at least one of the range operators are mandatory out of VALUE, ATLEAST,ATMOST, GREATER_THAN, LESS_THAN.
            It is not possible to express this requirement in XSD. It will be enforced in Java.
             -->
            <xs:element name="RANGE" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="EXCLUDE" minOccurs="0"
                    maxOccurs="unbounded">
                    <xs:complexType>
                      <xs:attribute name="VALUE" type="xs:string"
                        use="optional" />
                      <xs:attribute name="ATLEAST" type="xs:string"
                        use="optional" />
                      <xs:attribute name="ATMOST" type="xs:string"
                        use="optional" />
                      <xs:attribute name="GREATER_THAN"
                        type="xs:string" use="optional" />
                      <xs:attribute name="LESS_THAN" type="xs:string"
                        use="optional" />
                    </xs:complexType>
                  </xs:element>
                </xs:sequence>
                <xs:attribute name="ATLEAST" type="xs:string"
                  use="optional" />
                <xs:attribute name="ATMOST" type="xs:string"
                  use="optional" />
                <xs:attribute name="GREATER_THAN" type="xs:string"
                  use="optional" />
                <xs:attribute name="LESS_THAN" type="xs:string"
                  use="optional" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <!--
            NOTE: Either NAME or VAR must be specified. It is not possible to mandate to mandate one attribute over the other in the grammar.
            The either or is enforced while constructing the task list in Java.
          -->
          <xs:attribute name="NAME" type="xs:string" use="optional" />
          <xs:attribute name="VAR" type="xs:string" use="optional" />
          <xs:attribute name="VALUE" type="xs:string" use="optional" />
          <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
          <xs:attribute name="ARCHITECTURE" type="xs:string" use="optional" />
        </xs:complexType>
      </xs:element>
      <xs:element name="CHOICE">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="SELECTION" minOccurs="0"
              maxOccurs="unbounded">
              <xs:complexType>
                <xs:group ref="PACKAGE_GROUP" minOccurs="0"
                  maxOccurs="unbounded" />
                <xs:attribute name="VALUE" type="xs:string" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="VAR" type="xs:string" />
        </xs:complexType>
      </xs:element>
      <xs:element name="CONDITION">
        <xs:complexType>
          <xs:group ref="PACKAGE_GROUP" minOccurs="0"
            maxOccurs="unbounded" />
          <xs:attribute name="VAR" type="xs:string" />
          <xs:attribute name="TYPE" type="xs:string"
            use="optional" />
          <xs:attribute name="EQ" type="xs:string"
            use="optional" />
          <xs:attribute name="ATLEAST" type="xs:string"
            use="optional" />
          <xs:attribute name="ATMOST" type="xs:string"
            use="optional" />
          <xs:attribute name="GREATER_THAN" type="xs:string"
            use="optional" />
          <xs:attribute name="LESS_THAN" type="xs:string"
            use="optional" />
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:group>
  <xs:group name="PROCESSCHECKS_GROUP">
    <xs:choice>
      <xs:element name="PROCESS">
        <xs:complexType>
          <xs:attribute name="NAME" type="xs:string" use="required" />
          <xs:attribute name="EXISTS" >
             <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <!--
                    FIXME: This should be defined as boolean, but the existing sample-prereq.xml defines value as TRUE which is not a valid boolean value.
                     -->
                    <xs:enumeration value="true" />
                    <xs:enumeration value="TRUE" />
                    <xs:enumeration value="false" />
                    <xs:enumeration value="FALSE" />
                  </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
          <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
        </xs:complexType>
      </xs:element>
      <xs:element name="CHOICE">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="SELECTION" minOccurs="0"
              maxOccurs="unbounded">
              <xs:complexType>
                <xs:group ref="PROCESSCHECKS_GROUP" minOccurs="0"
                  maxOccurs="unbounded" />
                <xs:attribute name="VALUE" type="xs:string" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="VAR" type="xs:string" />
        </xs:complexType>
      </xs:element>
      <xs:element name="CONDITION">
        <xs:complexType>
          <xs:group ref="PROCESSCHECKS_GROUP" minOccurs="0"
            maxOccurs="unbounded" />
          <xs:attribute name="VAR" type="xs:string" />
          <xs:attribute name="TYPE" type="xs:string"
            use="optional" />
          <xs:attribute name="EQ" type="xs:string"
            use="optional" />
          <xs:attribute name="ATLEAST" type="xs:string"
            use="optional" />
          <xs:attribute name="ATMOST" type="xs:string"
            use="optional" />
          <xs:attribute name="GREATER_THAN" type="xs:string"
            use="optional" />
          <xs:attribute name="LESS_THAN" type="xs:string"
            use="optional" />
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:group>
  <xs:group name="SHELL_LIMITS_GROUP">
    <xs:choice>
      <xs:element name="CHOICE">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="SELECTION" minOccurs="0"
              maxOccurs="unbounded">
              <xs:complexType>
                <xs:all>
                  <xs:element name="FILE_DESCRIPTORS"
                    minOccurs="0" maxOccurs="1">
                    <xs:complexType>
                      <xs:all>
                        <xs:element name="HARDLIMIT"
                          minOccurs="0" maxOccurs="1">
                          <xs:complexType>
                            <xs:attribute name="VALUE"
                              type="xs:positiveInteger" />
                            <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
                          </xs:complexType>
                        </xs:element>
                        <xs:element name="SOFTLIMIT"
                          minOccurs="0" maxOccurs="1">
                          <xs:complexType>
                            <xs:attribute name="VALUE"
                              type="xs:positiveInteger" />
                            <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
                          </xs:complexType>
                        </xs:element>
                      </xs:all>
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="MAXPROC" minOccurs="0"
                    maxOccurs="1">
                    <xs:complexType>
                      <xs:all>
                        <xs:element name="HARDLIMIT"
                          minOccurs="0" maxOccurs="1">
                          <xs:complexType>
                            <xs:attribute name="VALUE"
                              type="xs:positiveInteger" />
                            <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
                          </xs:complexType>
                        </xs:element>
                        <xs:element name="SOFTLIMIT"
                          minOccurs="0" maxOccurs="1">
                          <xs:complexType>
                            <xs:attribute name="VALUE"
                              type="xs:positiveInteger" />
                            <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
                          </xs:complexType>
                        </xs:element>
                        </xs:all>
                    </xs:complexType>
                  </xs:element>
                  <xs:element name="STACK" minOccurs="0"
                    maxOccurs="1">
                    <xs:complexType>
                      <xs:all>
                        <xs:element name="HARDLIMIT"
                          minOccurs="0" maxOccurs="1">
                          <xs:complexType>
                            <xs:attribute name="VALUE"
                              type="xs:positiveInteger" />
                            <xs:attribute name="UNIT" type="STORAGE_UNITS_TYPE"
                              use="required" />
                            <xs:attribute name="OPERATOR" type="RANGE_OPERATOR_TYPE"
                              use="required" />
                            <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
                          </xs:complexType>
                        </xs:element>
                        <xs:element name="SOFTLIMIT"
                          minOccurs="0" maxOccurs="1">
                          <xs:complexType>
                            <xs:attribute name="VALUE"
                              type="xs:positiveInteger" />
                            <xs:attribute name="UNIT" type="STORAGE_UNITS_TYPE"
                              use="required" />
                            <xs:attribute name="OPERATOR" type="RANGE_OPERATOR_TYPE"
                              use="required" />
                            <xs:attribute name="SEVERITY" type="SEVERITY_TYPE" use="optional" />
                          </xs:complexType>
                        </xs:element>
                        </xs:all>
                    </xs:complexType>
                  </xs:element>
                </xs:all>
                <xs:attribute name="VALUE" type="xs:string" />
              </xs:complexType>
            </xs:element>
          </xs:sequence>
          <xs:attribute name="VAR" type="xs:string" />
        </xs:complexType>
      </xs:element>
    </xs:choice>
  </xs:group>
</xs:schema>
