<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="attributeType" nillable="true" type="xs:anyType"/>

  <xs:element name="entityType" type="jaxbEntityType"/>

  <xs:element name="messageType" type="jaxbMessageType"/>

  <xs:complexType name="jaxbMessageType">
    <xs:complexContent>
      <xs:extension base="jaxbEntityType">
        <xs:sequence/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="jaxbEntityType">
    <xs:sequence>
      <xs:element name="typeCode" type="xs:string"/>
      <xs:element name="typeDescription" type="xs:string"/>
      <xs:element name="entityManagerName" type="xs:string"/>
      <xs:element name="attributes" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="attribute" type="defaultJAXBAttributeType" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="defaultJAXBAttributeType">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="names">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="entry" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:sequence>
                  <xs:element name="key" minOccurs="0" type="xs:string"/>
                  <xs:element name="value" minOccurs="0" type="xs:string"/>
                </xs:sequence>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="description" type="xs:string" minOccurs="0"/>
      <xs:element name="type" type="xs:string"/>
      <xs:element name="roles" minOccurs="0">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="role" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="searchable" type="xs:boolean" minOccurs="0"/>
      <xs:element name="indexable" type="xs:boolean" minOccurs="0"/>
      <xs:element name="validationRules" type="xs:anyType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="arrayList">
    <xs:complexContent>
      <xs:extension base="abstractList">
        <xs:sequence/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="abstractList" abstract="true">
    <xs:complexContent>
      <xs:extension base="abstractCollection">
        <xs:sequence/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="abstractCollection" abstract="true">
    <xs:sequence/>
  </xs:complexType>

  <xs:complexType name="baseAttributeValidationRules">
    <xs:sequence>
      <xs:element name="ognlValidationRule" type="ognlValidationRule" minOccurs="0"/>
      <xs:element name="required" type="xs:boolean"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="ognlValidationRule">
    <xs:sequence>
      <xs:element name="errorMessage" type="xs:string" minOccurs="0"/>
      <xs:element name="errorMessageKey" type="xs:string" minOccurs="0"/>
      <xs:element name="evalExpressionOnValuedAttribute" type="xs:boolean"/>
      <xs:element name="expression" type="xs:string" minOccurs="0"/>
      <xs:element name="helpMessage" type="xs:string" minOccurs="0"/>
      <xs:element name="helpMessageKey" type="xs:string" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="dateAttributeValidationRules">
    <xs:complexContent>
      <xs:extension base="abstractAttributeValidationRules">
        <xs:sequence/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="abstractAttributeValidationRules" abstract="true">
    <xs:complexContent>
      <xs:extension base="baseAttributeValidationRules">
        <xs:sequence>
          <xs:element name="rangeEnd" type="xs:anyType" minOccurs="0"/>
          <xs:element name="rangeEndAttribute" type="xs:string" minOccurs="0"/>
          <xs:element name="rangeStart" type="xs:anyType" minOccurs="0"/>
          <xs:element name="rangeStartAttribute" type="xs:string" minOccurs="0"/>
          <xs:element name="value" type="xs:anyType" minOccurs="0"/>
          <xs:element name="valueAttribute" type="xs:string" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="numberAttributeValidationRules">
    <xs:complexContent>
      <xs:extension base="abstractAttributeValidationRules">
        <xs:sequence/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="textAttributeValidationRules">
    <xs:complexContent>
      <xs:extension base="abstractAttributeValidationRules">
        <xs:sequence>
          <xs:element name="maxLength" type="xs:int" minOccurs="0"/>
          <xs:element name="minLength" type="xs:int" minOccurs="0"/>
          <xs:element name="regexp" type="xs:string" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="jaxbListAttributeType">
    <xs:complexContent>
      <xs:extension base="defaultJAXBAttributeType">
        <xs:sequence>
          <xs:element name="nestedType" type="defaultJAXBAttributeType" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="jaxbCompositeAttributeType">
    <xs:complexContent>
      <xs:extension base="defaultJAXBAttributeType">
        <xs:sequence>
          <xs:element name="compositeElementTypes" minOccurs="0">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="compositeElementType" type="xs:anyType" maxOccurs="unbounded"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="jaxbEnumeratorAttributeType">
    <xs:complexContent>
      <xs:extension base="defaultJAXBAttributeType">
        <xs:sequence>
          <xs:element name="customSeparator" type="xs:string" minOccurs="0"/>
          <xs:element name="extractorBeanName" type="xs:string" minOccurs="0"/>
          <xs:element name="staticItems" type="xs:string" minOccurs="0"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
</xs:schema>

