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

 ------
 build mini-site
 ------

 For the official OpenJPA site, please visit {{{http://openjpa.apache.org}http://openjpa.apache.org}}. This area is automatically generated by maven during the site deploy process, which is automatically triggered by svn checkins or manually run by a release manager.

 The contents of this directory (including documentation and release artifacts) are not necessarily endorsed by the OpenJPA community, and are not official release artifacts.
 
*-------------------*-------------------------*
 Description        | Location 
*-------------------*-------------------------*
 Source and binary  | {{downloads/}}
 download directory |
*-------------------*-------------------------*
 Documentation      | {{docs/index.html}}
 (multi-page)       |
*-------------------*-------------------------*
 JavaDoc            | {{apidocs/index.html}}
*-------------------*-------------------------*
