~~ 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

  <<6th April 2011 - Apache Neethi Version 3.0.0 Released!>>

  \[{{{http://ws.apache.org/neethi/download.cgi}Download Neethi 3.0.0}}\]

  <<6th April 2011 - Apache Neethi Version 2.0.5 Released!>>

  \[{{{http://ws.apache.org/neethi/download.cgi}Download Neethi 2.0.5}}\]


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.
