 -----
 Apache Wink
 -----
 -----
 May 2009

~~
~~ 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 Wink

  Apache Wink is a simple yet solid framework for building RESTful Web services. It is comprised of a Server module and a Client module
  for developing and consuming RESTful Web services.

  The <<Wink Server>> module is a complete implementation of the JAX-RS v1.1 specification. On top of this implementation, 
  the Wink Server module provides a set of additional features that were designed to facilitate
   the development of RESTful Web services.
  
  The <<Wink Client>> module is a Java based framework that provides functionality for communicating with RESTful Web services.
  The framework is built on top of the JDK HttpURLConnection and adds essential features that facilitate the development of such client applications.
