<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Copyright 2010 Nicholas Blair, Eric Dalquist Licensed under the Apache 
	License, Version 2.0 (the "License"); you may not use this file except in 
	compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 
	Unless required by applicable law or agreed to in writing, software distributed 
	under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES 
	OR CONDITIONS OF ANY KIND, either express or implied. See the License for 
	the specific language governing permissions and limitations under the License. -->

<xsd:schema
	xmlns="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tool="http://www.springframework.org/schema/tool"
	targetNamespace="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
	elementFormDefault="qualified" attributeFormDefault="unqualified">

	<xsd:import namespace="http://www.springframework.org/schema/tool"
		schemaLocation="http://www.springframework.org/schema/tool/spring-tool-2.5.xsd" />

	<xsd:annotation>
		<xsd:documentation><![CDATA[
    Defines the elements used in the ehcache-spring-annotation project's declarative
    caching infrastructure.
        ]]></xsd:documentation>
	</xsd:annotation>

	<xsd:complexType name="cache-manager-aware_type">
		<xsd:attribute name="cache-manager" type="xsd:string"
			default="cacheManager">
			<xsd:annotation>
				<xsd:documentation source="java:net.sf.ehcache.CacheManager"><![CDATA[
The bean name of the CacheManager that is to be used to drive caching.

This attribute is not required, and only needs to be specified
explicitly if the bean name of the desired CacheManager
is not 'cacheManager'.
                ]]></xsd:documentation>
				<xsd:appinfo>
					<tool:annotation kind="ref">
						<tool:expected-type type="net.sf.ehcache.CacheManager" />
					</tool:annotation>
				</xsd:appinfo>
			</xsd:annotation>
		</xsd:attribute>
	</xsd:complexType>

	<xsd:element name="annotation-driven">
		<xsd:complexType>
			<xsd:complexContent>
				<xsd:extension base="cache-manager-aware_type">
					<xsd:attribute name="create-missing-caches" type="xsd:boolean"
						default="false">
						<xsd:annotation>
							<xsd:documentation><![CDATA[
            Should cache names from @Cacheable annotations that don't exist in
            the CacheManager be created based on the default cache or should an
            exception be thrown?
                                ]]></xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="default-cache-key-generator"
						type="xsd:string" use="optional">
						<xsd:annotation>
							<xsd:documentation><![CDATA[
            Default CacheKeyGenerator implementation to use. If not specified 
            HashCodeCacheKeyGenerator will be used as the default.
                                ]]></xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="self-populating-cache-scope"
						default="shared">
						<xsd:annotation>
							<xsd:documentation><![CDATA[
            Are the SelfPopulatingCache wrappers scoped to the method or are they shared
            among all methods using each self populating cache.
                            ]]></xsd:documentation>
						</xsd:annotation>
						<xsd:simpleType>
							<xsd:restriction base="xsd:string">
								<xsd:enumeration value="method" />
								<xsd:enumeration value="shared" />
							</xsd:restriction>
						</xsd:simpleType>
					</xsd:attribute>
					<xsd:attribute name="proxy-target-class" type="xsd:boolean"
						default="false">
						<xsd:annotation>
							<xsd:documentation><![CDATA[
            Are class-based (CGLIB) proxies to be created? By default, standard
            Java interface-based proxies are created.
        
            Note: Class-based proxies require the @Transactional annotation to be
            defined on the concrete class. Annotations in interfaces will not work
            in that case (they will rather only work with interface-based proxies)!
                            ]]></xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
					<xsd:attribute name="order" type="xsd:int">
						<xsd:annotation>
							<xsd:documentation source="java:org.springframework.core.Ordered"><![CDATA[
            Controls the ordering of the execution of the transaction advisor
            when multiple advice executes at a specific joinpoint.
                            ]]></xsd:documentation>
						</xsd:annotation>
					</xsd:attribute>
				</xsd:extension>
			</xsd:complexContent>
		</xsd:complexType>
	</xsd:element>

	<xsd:element name="config">
		<xsd:complexType>
			<xsd:complexContent>
				<xsd:extension base="cache-manager-aware_type">
					<xsd:sequence>
						<xsd:element name="evict-expired-elements" type="evict-expired-elements_type"
							minOccurs="0" />
					</xsd:sequence>
				</xsd:extension>
			</xsd:complexContent>
		</xsd:complexType>
	</xsd:element>

	<xsd:complexType name="evict-expired-elements_type">
		<xsd:annotation>
			<xsd:documentation><![CDATA[
            The include and exclude rules will be processed in the order they are specified.
            ]]></xsd:documentation>
		</xsd:annotation>
		<xsd:choice minOccurs="0" maxOccurs="unbounded">
			<xsd:element name="include" type="cache-filtering_type"
				minOccurs="0" maxOccurs="unbounded" />
			<xsd:element name="exclude" type="cache-filtering_type"
				minOccurs="0" maxOccurs="unbounded" />
		</xsd:choice>
		<xsd:attribute name="interval" type="xsd:string"
			default="60">
			<xsd:annotation>
				<xsd:documentation><![CDATA[
                Declare how often Ehcache#evictExpiredElements() should be invoked; value
                is in minutes.
                ]]></xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
	</xsd:complexType>

	<xsd:complexType name="cache-filtering_type">
		<xsd:attribute name="name" type="xsd:string">
			<xsd:annotation>
				<xsd:documentation><![CDATA[
                A specific Ehcache name.
                ]]></xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
		<xsd:attribute name="pattern" type="xsd:string">
			<xsd:annotation>
				<xsd:documentation><![CDATA[
                A regular expression pattern to be used to match against Ehcache names.
                ]]></xsd:documentation>
			</xsd:annotation>
		</xsd:attribute>
	</xsd:complexType>
</xsd:schema>
