XSD namespaces and locations

Usage example

<eh:config
    xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
    xmlns:eh='http://www.ehcache.org/v3'
    xmlns:jsr107='http://www.ehcache.org/v3/jsr107'
    xsi:schemaLocation="
        http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.2.xsd
        http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.2.xsd">
</eh:config>

Core

<xs:schema version="1.0" xmlns:ehcache="http://www.ehcache.org/v3" xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.0"
           elementFormDefault="qualified" targetNamespace="http://www.ehcache.org/v3">
  <xs:element name="config" type="ehcache:config-type"/>

  <xs:complexType name="config-type">
    <xs:sequence>
      <xs:element name="service" type="ehcache:service-type" minOccurs="0" maxOccurs="unbounded">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            Placeholder for services to be managed by the CacheManager and exposed to the Cache instances it manages.
            Those services will also be lifecycled by the CacheManager.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="default-serializers" type="ehcache:serializer-type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            This element represents Serializers.
            It is a collection of serializer tags that require a type and fully qualified class names of serializers
            that are to be registered
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="default-copiers" type="ehcache:copier-type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            This element represents Copiers.
            It is a collection of copier tags that require a type and fully qualified class names of copiers
            that are to be registered
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="persistence" type="ehcache:persistence-type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            Location where data needs be stored on disk
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="thread-pools" type="ehcache:thread-pools-type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            This element configures the sets of constrained threads used to run asynchronous tasks for the caches of this manager.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="event-dispatch" type="ehcache:thread-pool-reference-type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            The element configures the default thread pool used for cache event dispatch.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="write-behind" type="ehcache:thread-pool-reference-type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            The element configures the default thread pool used for write behind caches.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="heap-store" type="ehcache:sizeof-type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            The element defines the sizing limits for the default SizeOfEngine.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="disk-store" type="ehcache:thread-pool-reference-type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            The element configures the default thread pool used for writing to disk resources.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="cache" type="ehcache:cache-type">
          <xs:annotation>
            <xs:documentation xml:lang="en">
              A cache definition the CacheManager will manage
            </xs:documentation>
          </xs:annotation>
        </xs:element>
        <xs:element name="cache-template" type="ehcache:cache-template-type">
          <xs:annotation>
            <xs:documentation xml:lang="en">
              A cache template definition that can be reference in &lt;cache&gt; definitions using the 'uses-template'
              attribute.
            </xs:documentation>
          </xs:annotation>
        </xs:element>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="service-type">
    <xs:sequence>
      <xs:element ref="ehcache:service-creation-configuration" minOccurs="1" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="service-creation-configuration" abstract="true">
    <xs:annotation>
      <xs:appinfo>
        <jaxb:dom/>
      </xs:appinfo>
    </xs:annotation>
  </xs:element>

  <xs:complexType name="persistence-type">
    <xs:attribute name="directory" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:complexType name="serializer-type">
    <xs:sequence>
      <xs:element name="serializer" maxOccurs="unbounded" minOccurs="0">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="ehcache:fqcn-type">
              <xs:attribute type="xs:string" name="type" use="required"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
     </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="copier-type">
    <xs:sequence>
      <xs:element name="copier" maxOccurs="unbounded" minOccurs="0">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="ehcache:fqcn-type">
              <xs:attribute type="xs:string" name="type" use="required"/>
            </xs:extension>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="thread-pools-type">
    <xs:sequence>
      <xs:element name="thread-pool" maxOccurs="unbounded" minOccurs="1">
        <xs:complexType>
          <xs:attribute name="alias" use="required" type="xs:string"/>
          <xs:attribute name="default" use="optional" type="xs:boolean" default="false"/>
          <xs:attribute name="min-size" use="required" type="xs:nonNegativeInteger"/>
          <xs:attribute name="max-size" use="required" type="xs:positiveInteger"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="thread-pool-reference-type">
    <xs:attribute name="thread-pool" use="required" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="sizeof-type">
    <xs:sequence>
      <xs:element name="max-object-graph-size" minOccurs="0" maxOccurs="1" default="1000">
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:positiveInteger"/>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
      <xs:element name="max-object-size" minOccurs="0" maxOccurs="1" type="ehcache:memory-type" default="9223372036854775807"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="cache-type">
    <xs:complexContent>
      <xs:extension base="ehcache:base-cache-type">
        <xs:attribute name="alias" use="required" type="xs:string">
          <xs:annotation>
            <xs:documentation xml:lang="en">
              The alias used to access this Cache from the CacheManager
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="uses-template" use="optional" type="xs:IDREF">
          <xs:annotation>
            <xs:documentation xml:lang="en">
              The optional &lt;cache-template&gt; to use to source a default configuration from.
              References the cache template's 'name' attribute.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="cache-template-type">
    <xs:complexContent>
      <xs:extension base="ehcache:base-cache-type">
        <xs:attribute name="name" type="xs:ID" use="required">
          <xs:annotation>
            <xs:documentation xml:lang="en">
              The name of this &lt;cache-template&gt; definition.
              Used by cache element's 'uses-template' attribute.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="base-cache-type" abstract="true">
    <xs:sequence>
      <xs:element name="key-type" type="ehcache:cache-entry-type" minOccurs="0" maxOccurs="1" default="java.lang.Object">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            Defines the type for the keys &lt;K&gt; of the Cache&lt;K, V&gt;. Takes a fully qualified class name.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="value-type" type="ehcache:cache-entry-type" minOccurs="0" maxOccurs="1" default="java.lang.Object">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            Defines the type for the values &lt;V&gt; of the Cache&lt;K, V&gt;. Takes a fully qualified class name.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="expiry" type="ehcache:expiry-type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            Defines expiry for the Cache.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="eviction-advisor" type="ehcache:fqcn-type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            A fully qualified class name to a concrete type that implements
            org.ehcache.config.EvictionAdvisor and has a public default no argument constructor.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="loader-writer" type="ehcache:cache-loader-writer-type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            Configures the Cache as fronting a system of record that it'll be kept in sync with.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="listeners" type="ehcache:listeners-type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            Configures the listeners for the Cache.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:choice minOccurs="0" maxOccurs="1">
        <xs:element ref="ehcache:heap" minOccurs="1" maxOccurs="1">
          <xs:annotation>
            <xs:documentation xml:lang="en">
              Shortcut for configuring a heap Cache.
            </xs:documentation>
          </xs:annotation>
        </xs:element>
        <xs:element name="resources" type="ehcache:resources-type" minOccurs="1" maxOccurs="1">
          <xs:annotation>
            <xs:documentation xml:lang="en">
              Configures the Cache resources.
            </xs:documentation>
          </xs:annotation>
        </xs:element>
      </xs:choice>
      <xs:element name="heap-store-settings" type="ehcache:sizeof-type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            The element defines the sizing limits for the Cache's SizeOfEngine.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="disk-store-settings" type="ehcache:disk-store-settings-type" minOccurs="0" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            Configures advanced properties of the disk tier
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element ref="ehcache:service-configuration" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:element name="service-configuration" abstract="true">
    <xs:annotation>
      <xs:appinfo>
        <jaxb:dom/>
      </xs:appinfo>
    </xs:annotation>
  </xs:element>

  <xs:complexType name="listeners-type">
    <xs:sequence>
      <xs:element name="listener" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="class" type="ehcache:fqcn-type" minOccurs="1" maxOccurs="1">
              <xs:annotation>
                <xs:documentation xml:lang="en">
                  A fully qualified class name to a concrete type that implements
                  org.ehcache.spi.event.CacheEventListener and has a public
                  default no argument constructor.
                </xs:documentation>
              </xs:annotation>
            </xs:element>
            <xs:element name="event-firing-mode" type="ehcache:event-firing-type" minOccurs="1" maxOccurs="1">
              <xs:annotation>
                <xs:documentation xml:lang="en">
                  Indicates which EventFiring firing mode to use
                </xs:documentation>
              </xs:annotation>
            </xs:element>
            <xs:element name="event-ordering-mode" type="ehcache:event-ordering-type" minOccurs="1" maxOccurs="1">
              <xs:annotation>
                <xs:documentation xml:lang="en">
                  Indicates which EventOrdering ordering mode to use
                </xs:documentation>
              </xs:annotation>
            </xs:element>
            <xs:element name="events-to-fire-on" type="ehcache:event-type" minOccurs="1" maxOccurs="5">
              <xs:annotation>
                <xs:documentation xml:lang="en">
                  Indicates on which EventType an event has to be fired
                </xs:documentation>
              </xs:annotation>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="dispatcher-thread-pool" type="xs:string" use="optional"/>
    <xs:attribute name="dispatcher-concurrency" type="xs:positiveInteger" use="optional" default="8"/>
  </xs:complexType>

  <xs:complexType name="cache-loader-writer-type">
    <xs:sequence>
      <xs:element name="class" type="ehcache:fqcn-type" minOccurs="1" maxOccurs="1">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            A fully qualified class name to a concrete type that implements
            org.ehcache.spi.loaderwriter.CacheLoaderWriter and has a public
            default no argument constructor.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="write-behind" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:choice>
              <xs:element name="batching">
                <xs:complexType>
                  <xs:all minOccurs="1">
                    <xs:element name="max-write-delay" type="ehcache:time-type"/>
                  </xs:all>
                  <xs:attribute name="batch-size" type="xs:positiveInteger" use="required"/>
                  <xs:attribute name="coalesce" type="xs:boolean" default="false" use="optional"/>
                </xs:complexType>
              </xs:element>
              <xs:element name="non-batching"/>
            </xs:choice>
          </xs:sequence>
          <xs:attribute name="concurrency" type="xs:positiveInteger" default="1" use="optional"/>
          <xs:attribute name="size" type="xs:positiveInteger" default="2147483647" use="optional"/>
          <xs:attribute name="thread-pool" type="xs:string" use="optional"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="cache-entry-type">
    <xs:simpleContent>
      <xs:extension base="ehcache:fqcn-type">
        <xs:attribute name="serializer" type="ehcache:fqcn-type">
          <xs:annotation>
            <xs:documentation xml:lang="en">
              A fully qualified class name of the type's serializer class.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
        <xs:attribute name="copier" type="ehcache:fqcn-type">
          <xs:annotation>
            <xs:documentation xml:lang="en">
              A fully qualified class name of the type's copier class.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="expiry-type">
    <xs:choice>
      <xs:element name="class" type="ehcache:fqcn-type">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            A fully qualified class name to a concrete type that implements
            org.ehcache.expiry.Expiry and has a public default no argument constructor.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="tti" type="ehcache:time-type">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            Entries in the cache should expire if not accessed for the defined time.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="ttl" type="ehcache:time-type">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            Entries in the cache should expire after the defined time.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="none">
        <xs:annotation>
          <xs:documentation xml:lang="en">
            Entries in the cache should never expire.
          </xs:documentation>
        </xs:annotation>
        <xs:complexType/>
      </xs:element>
    </xs:choice>
  </xs:complexType>

  <xs:complexType name="time-type">
    <xs:simpleContent>
      <xs:extension base="xs:positiveInteger">
        <xs:attribute name="unit" type="ehcache:time-unit" default="seconds">
          <xs:annotation>
            <xs:documentation xml:lang="en">
              The time unit (see java.util.concurrent.TimeUnit) this value is expressed in.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="memory-type">
    <xs:simpleContent>
      <xs:extension base="xs:positiveInteger">
        <xs:attribute name="unit" type="ehcache:memory-unit" default="B" use="optional">
          <xs:annotation>
            <xs:documentation xml:lang="en">
              The memory unit (see org.ehcache.config.units.MemoryUnit) this value is expressed in.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="resource-type">
    <xs:simpleContent>
      <xs:extension base="xs:positiveInteger">
        <xs:attribute name="unit" type="ehcache:resource-unit" default="entries" use="optional">
          <xs:annotation>
            <xs:documentation xml:lang="en">
              The resource unit (see org.ehcache.config.ResourceUnit) this value is expressed in.
            </xs:documentation>
          </xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

  <xs:complexType name="persistable-memory-type">
    <xs:complexContent>
      <xs:extension base="ehcache:memory-type">
        <xs:attribute name="persistent" type="xs:boolean" default="false" use="optional"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:element name="resource" abstract="true">
    <xs:annotation>
      <xs:appinfo>
        <jaxb:dom/>
      </xs:appinfo>
    </xs:annotation>
  </xs:element>

  <xs:element name="heap" type="ehcache:resource-type" substitutionGroup="ehcache:resource">
    <xs:annotation>
      <xs:appinfo>
        <jaxb:class/>
      </xs:appinfo>
    </xs:annotation>
  </xs:element>
  <xs:element name="offheap" type="ehcache:memory-type" substitutionGroup="ehcache:resource">
    <xs:annotation>
      <xs:appinfo>
        <jaxb:class/>
      </xs:appinfo>
    </xs:annotation>
  </xs:element>
  <xs:element name="disk" type="ehcache:persistable-memory-type" substitutionGroup="ehcache:resource">
    <xs:annotation>
      <xs:appinfo>
        <jaxb:class/>
      </xs:appinfo>
    </xs:annotation>
  </xs:element>

  <xs:complexType name="resources-type">
    <xs:sequence>
      <xs:element ref="ehcache:resource" minOccurs="1" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="disk-store-settings-type">
    <xs:attribute name="thread-pool" type="xs:string" use="optional"/>
    <xs:attribute name="writer-concurrency" type="xs:positiveInteger" use="optional" default="1"/>
  </xs:complexType>

  <xs:simpleType name="time-unit">
    <xs:restriction base="xs:string">
      <xs:enumeration value="nanos"/>
      <xs:enumeration value="micros"/>
      <xs:enumeration value="millis"/>
      <xs:enumeration value="seconds"/>
      <xs:enumeration value="minutes"/>
      <xs:enumeration value="hours"/>
      <xs:enumeration value="days"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="memory-unit">
    <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:enumeration value="PB"/>
    </xs:restriction>
  </xs:simpleType>
  <!-- Keeping the below explicit instead of union with the above to ease auto complete -->
  <xs:simpleType name="resource-unit">
    <xs:restriction base="xs:string">
      <xs:enumeration value="entries"/>
      <xs:enumeration value="B"/>
      <xs:enumeration value="kB"/>
      <xs:enumeration value="MB"/>
      <xs:enumeration value="GB"/>
      <xs:enumeration value="TB"/>
      <xs:enumeration value="PB"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="event-firing-type">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ASYNCHRONOUS" />
      <xs:enumeration value="SYNCHRONOUS" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="event-ordering-type">
    <xs:restriction base="xs:string">
      <xs:enumeration value="UNORDERED" />
      <xs:enumeration value="ORDERED" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="event-type">
    <xs:restriction base="xs:string">
      <xs:enumeration value="EVICTED" />
      <xs:enumeration value="EXPIRED" />
      <xs:enumeration value="REMOVED" />
      <xs:enumeration value="CREATED" />
      <xs:enumeration value="UPDATED" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="fqcn-type">
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="collapse"></xs:whiteSpace>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

JSR-107 extension

<xs:schema version="1.0"
           xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
           xmlns:eh="http://www.ehcache.org/v3"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified" targetNamespace="http://www.ehcache.org/v3/jsr107">
  <xs:import namespace="http://www.ehcache.org/v3"/>

  <xs:element name="mbeans" type="jsr107:mbeans-type" substitutionGroup="eh:service-configuration"/>

  <xs:element name="defaults" type="jsr107:defaults-type" substitutionGroup="eh:service-creation-configuration">
    <xs:key name="default-template-ref">
      <xs:selector xpath="cache-template"/>
      <xs:field xpath="@name"/>
    </xs:key>
  </xs:element>

  <xs:complexType name="defaults-type">
    <xs:sequence>
      <xs:element name="cache" type="jsr107:cache-type" minOccurs="0" maxOccurs="unbounded">
        <xs:key name="template-ref">
          <xs:selector xpath="cache-template"/>
          <xs:field xpath="@name"/>
        </xs:key>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="default-template" type="xs:IDREF" use="optional"/>
    <xs:attribute name="jsr-107-compliant-atomics" type="xs:boolean" use="optional"/>
    <xs:attribute name="enable-management" type="xs:boolean" use="optional"/>
    <xs:attribute name="enable-statistics" type="xs:boolean" use="optional"/>
  </xs:complexType>

  <xs:complexType name="cache-type">
    <xs:attribute name="name" type="xs:ID" use="required" />
    <xs:attribute name="template" type="xs:IDREF" use="required" />
  </xs:complexType>

  <xs:complexType name="mbeans-type">
    <xs:attribute name="enable-management" type="xs:boolean" use="optional"/>
    <xs:attribute name="enable-statistics" type="xs:boolean" use="optional"/>
  </xs:complexType>
</xs:schema>

XA transactions extension

<xs:schema version="1.0"
           xmlns:tx="http://www.ehcache.org/v3/tx"
           xmlns:eh="http://www.ehcache.org/v3"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified"
           targetNamespace="http://www.ehcache.org/v3/tx">
  <xs:import namespace="http://www.ehcache.org/v3"/>

  <xs:element name="xa-store" type="tx:xa-store-config-type" substitutionGroup="eh:service-configuration"/>

  <xs:element name="jta-tm" type="tx:jta-tm-type" substitutionGroup="eh:service-creation-configuration"/>

  <xs:complexType name="xa-store-config-type">
    <xs:attribute name="unique-XAResource-id" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:complexType name="jta-tm-type">
    <xs:attribute name="transaction-manager-lookup-class" type="xs:string" use="required"/>
  </xs:complexType>

</xs:schema>