<?xml version="1.0" encoding="UTF-8"?>
<!--
  Licensed to the Apache Software Foundation (ASF) under one
  or more contributor license agreements. See the NOTICE file
  distributed with this work for additional information
  regarding copyright ownership. The ASF licenses this file
  to you 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:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:beans="http://www.springframework.org/schema/beans"
  xmlns:cxf-beans="http://cxf.apache.org/configuration/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  targetNamespace="http://cxf.apache.org/policy" 
  elementFormDefault="qualified"
  attributeFormDefault="unqualified"  >

  <xsd:import namespace="http://www.springframework.org/schema/beans" schemaLocation="http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"/>
  <xsd:import namespace="http://cxf.apache.org/configuration/beans" schemaLocation="http://cxf.apache.org/schemas/configuration/cxf-beans.xsd"/>

  <xsd:annotation>
    <xsd:documentation>
      This schema defines features and beans to configure the CXF Policy Framework.
    </xsd:documentation>
  </xsd:annotation>

  <xsd:element name="policies">
    <xsd:annotation>
      <xsd:documentation>
        The policies feature enables and configures the CXF Policy Framework.
        It can have any number of Policy or PolicyReference child elements.
        When this feature applies to a client or service endpoint, these policies
        are merged with other policies attached to policy scope that contain
        the policy subject to obtain the effective policy for the subject.
        When this feature is applied to the bus, its policies are relevant to all
        client and server endpoints created on that bus.
      </xsd:documentation>
    </xsd:annotation>
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="alternativeSelector" type="xsd:anyType" minOccurs="0">
          <xsd:annotation>
            <xsd:documentation>
                The alternative selector to use when choosing one of multiple policy alternatives.
                The child element of this element must be a bean whose bean class implements 
                org.apache.cxf.ws.policy.selector.AlternativeSelector, or a reference to such a bean.
            </xsd:documentation>          
          </xsd:annotation>
        </xsd:element>
        <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
      </xsd:sequence>
      <xsd:attribute name="ignoreUnknownAssertions" type="xsd:boolean" default="false"/>
      <xsd:attribute name="namespace" type="xsd:string"/>
      <xsd:attribute name="id" type="xsd:string"/>
    </xsd:complexType>
  </xsd:element>
  
  <xsd:element name="engine">
    <xsd:complexType>
      <xsd:all>        
        <xsd:element name="alternativeSelector" type="xsd:anyType" minOccurs="0">
          <xsd:annotation>
            <xsd:documentation>
                The alternative selector to use when choosing one of multiple policy alternatives.
                The child element of this element must be a bean whose bean class implements 
                org.apache.cxf.ws.policy.selector.AlternativeSelector, or a reference to such a bean.
            </xsd:documentation>          
          </xsd:annotation>
        </xsd:element>
      </xsd:all>
      <xsd:attributeGroup ref="cxf-beans:beanAttributes"/>       
      <xsd:attribute name="enabled" type="xsd:boolean" default="false">         
        <xsd:annotation>
          <xsd:documentation>
              The state of the policy engine.
              If enabled, the policy interceptors will be added to the interceptor
              chains of all messages and faults, and in turn may add feature specific
              interceptors depending on the capabilities and requirements of the
              underlying message exchange.
              By default, the engine is turned off.
          </xsd:documentation>          
        </xsd:annotation>
      </xsd:attribute>
      <xsd:attribute name="ignoreUnknownAssertions" type="xsd:boolean" default="false">
        <xsd:annotation>
          <xsd:documentation>
              Indicates how to handle assertions for which no AssertionBuilders are registered.
              By default, the policy engine throws an Exception upon encoutering an
              unknown assertion type. If this attribute is set to true, it will only
              log a warning.              
          </xsd:documentation>
        </xsd:annotation>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>
 
  <xsd:element name="constants">
    <xsd:complexType>
      <xsd:attribute name="namespace" type="xsd:string" default="http://www.w3.org/2006/07/ws-policy">
        <xsd:annotation>
          <xsd:documentation>
              The namespace of the WS-Policy Framework specification. 
              This attribute can be set to support older versions of the specification.           
          </xsd:documentation>
        </xsd:annotation>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>
  
    <xsd:element name="externalAttachment">
    <xsd:complexType>
      <xsd:complexContent>
        <xsd:extension base="beans:identifiedType">
          <xsd:attributeGroup ref="cxf-beans:beanAttributes"/>        
          <xsd:attribute name="location" type="xsd:string" default="http://www.w3.org/2006/07/ws-policy">
            <xsd:annotation>
              <xsd:documentation>
                  Location of the external attachment document. 
                  It must be specified in form of a Spring Resource type property, e.g.
                  classpath:etc/policies.xml or file:/x1/resources/polcies.xml.          
              </xsd:documentation>
            </xsd:annotation>
          </xsd:attribute>
        </xsd:extension>
      </xsd:complexContent>
    </xsd:complexType>
  </xsd:element>
  
</xsd:schema>
