~~ 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.

           -----------------------------------
           Apache Neethi - WS-Policy Framework
           -----------------------------------

Welcome to Apache Neethi

  Apache Neethi\u2122 provides general framework for the programmers to use WS Policy. 
  It is compliant with latest WS Policy specification which was published in 
  March 2006. This framework is specifically written to enable the Apache Web 
  services stack to use WS Policy as a way of expressing it's requirements and 
  capabilities.

Latest Release
  <<September 2021 - Apache Neethi Version 3.2.0 Released!>>

  \[{{{http://ws.apache.org/neethi/download.cgi}Download Neethi 3.2.0}}\]


Key Features

    * Provides a convenient API for Policy processing 

    * Provides a mechanism to extend domain specific types as assertions 

    * Provides a mechanism to provide custom serialization / de-serialization of assertions 

    * More provision for the domain authors to determine the behavior of the assertions 

    []

====

  Apache Neethi, Neethi, Apache, the Apache feather logo, and the Apache Neethi project
  logo are trademarks of The Apache Software Foundation.
