#
#   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 Directory Fortress Web

The purpose of this NOTICE.txt file is to include notices that are required by the copyright owner and their license. Some of the accompanying products have an attribution requirement, so see below. Other accompanying products do not require attribution, so are not listed.

This product includes software developed by:

1. The Apache Software Foundation (http://www.apache.org/)
2. The Eigenbase Project (http://www.eigenbase.org/)
3. JUnit.org (http://www.junit.org/)
4. The Java Community Process (http://www.jcp.org/)
5. SLF4J (http://www.slf4j.org/)
6. Terracotta (http://www.terracotta.org/TPL)
7. Spring (http://www.springsource.org/)
8. AspectJ (http://www.eclipse.org/aspectj/)
