<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="BusinessObject" type="BusinessObjectType"/>
  <xs:complexType name="MethodType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="DataSourceType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="EventType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name" use="required"/>
        <xs:attribute type="xs:string" name="eventHandler" use="required"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="EventsType">
    <xs:sequence>
      <xs:element type="EventType" name="Event" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="SimplePropertyType" mixed="true">
    <xs:sequence>
      <xs:element type="EventsType" name="Events" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="id" use="optional"/>
    <xs:attribute type="xs:string" name="name" use="optional"/>
    <xs:attribute type="xs:string" name="type" use="optional"/>
    <xs:attribute type="xs:string" name="storable" use="optional"/>
    <xs:attribute type="xs:string" name="blobTable" use="optional"/>
    <xs:attribute type="xs:string" name="blobPKeyField" use="optional"/>
    <xs:attribute type="xs:string" name="dataSourceProperty" use="optional"/>
  </xs:complexType>
  <xs:complexType name="MethodsType">
    <xs:sequence>
      <xs:element type="MethodType" name="Method" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ValidationType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="ValidationsType">
    <xs:sequence>
      <xs:element type="ValidationType" name="Validation" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ListObjectsType">
    <xs:sequence>
      <xs:element type="ListObjectType" name="ListObject" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ListObjectType" mixed="true">
    <xs:sequence>
      <xs:element type="EventsType" name="Events" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute type="xs:string" name="name" use="optional"/>
    <xs:attribute type="xs:string" name="objectClass" use="optional"/>
    <xs:attribute type="xs:string" name="dataSourceProperty" use="optional"/>
    <xs:attribute type="xs:string" name="listProperty" use="optional"/>
    <xs:attribute type="xs:string" name="loadMode"/>
  </xs:complexType>
  <xs:complexType name="NestedObjectType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name" use="optional"/>
        <xs:attribute type="xs:string" name="objectClass" use="optional"/>
        <xs:attribute type="xs:string" name="dataSourceProperty" use="optional"/>
        <xs:attribute type="xs:string" name="nestingProperty" use="optional"/>
        <xs:attribute type="xs:string" name="loadMode" use="optional"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="NestedObjectsType">
    <xs:sequence>
      <xs:element type="NestedObjectType" name="NestedObject" maxOccurs="unbounded" minOccurs="0" >
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ObjectLookupType">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute type="xs:string" name="name"/>
        <xs:attribute type="xs:string" name="objectClass"/>
        <xs:attribute type="xs:string" name="dataSourceProperty"/>
        <xs:attribute type="xs:string" name="lookupProperty"/>
        <xs:attribute type="xs:string" name="loadMode"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="ObjectLookupsType">
    <xs:sequence>
      <xs:element type="ObjectLookupType" name="ObjectLookup" minOccurs="0" maxOccurs="unbounded">

      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="BusinessObjectType">
    <xs:choice  maxOccurs="unbounded" minOccurs="0">
      <xs:element type="DataSourceType" name="DataSource"/>
      <xs:element type="SimplePropertiesType" name="SimpleProperties"/>
      <xs:element type="ListObjectsType" name="ListObjects"/>
      <xs:element type="ObjectLookupsType" name="ObjectLookups"/>
      <xs:element type="MethodsType" name="Methods"/>
      <xs:element type="ValidationsType" name="Validations"/>
      <xs:element type="NestedObjectsType" name="NestedObjects" />
    </xs:choice>
    <xs:attribute type="xs:string" name="name"/>
    <xs:attribute type="xs:string" name="baseClass"/>
    <xs:attribute type="xs:string" name="schemaVersion"/>
    <xs:attribute type="xs:string" name="generateLoadMethod"/>
    <xs:attribute type="xs:string" name="generateCreateMethod"/>
    <xs:attribute type="xs:string" name="OERReference"/>
    <xs:attribute type="xs:string" name="platformObject"/>
  </xs:complexType>
  <xs:complexType name="SimplePropertiesType">
    <xs:sequence>
      <xs:element type="SimplePropertyType" name="SimpleProperty" maxOccurs="unbounded" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>
