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

#-------------------------------------------------------------------------------
# Already used licenses in project :
# - Apache 2
# - Apache License
# - Apache License Version 2.0
# - Apache License, Version 2.0
# - Apache Software License - Version 2.0
# - CDDL 1.0
# - CDDL+GPL License
# - Common Public License Version 1.0
# - Eclipse Public License v1.0
# - Eclipse Public License - Version 1.0
# - Revised BSD License
# - The Apache Software License, Version 2.0
# - The BSD License
# - The MIT License
# - GNU Lesser General Public License, Version 2.1
# - HSQLDB License
# - JDOM License
# - MIT License
# - New BSD License
#
# Please fill the missing licenses for dependencies :
commons-beanutils--commons-beanutils--1.7.0=Apache License, Version 2.0
commons-logging--commons-logging--1.0.3=Apache License, Version 2.0
# http://x-stream.github.io/license.html
com.thoughtworks.xstream--com.springsource.com.thoughtworks.xstream--1.4.1=BSD 3-Clause License
geronimo-spec--geronimo-spec-jta--1.0-M1=Apache License, Version 2.0
javax.transaction--com.springsource.javax.transaction--1.1.0=CDDL 1.0
org.aopalliance--com.springsource.org.aopalliance--1.0.0=
org.apache.commons--com.springsource.org.apache.commons.codec--1.3.0=Apache License, Version 2.0
org.apache.commons--com.springsource.org.apache.commons.csv--1.0.0.BUILD-20080106=Apache License, Version 2.0
org.apache.commons--com.springsource.org.apache.commons.httpclient--3.1.0=Apache License, Version 2.0
org.apache.commons--com.springsource.org.apache.commons.logging--1.1.1=Apache License, Version 2.0
org.apache.derby--com.springsource.org.apache.derby--10.5.1000001.764942=Apache License, Version 2.0
org.apache.derby--com.springsource.org.apache.derby.client--10.5.1000001.764942=Apache License, Version 2.0
org.apache.derby--com.springsource.org.apache.derby.drda--10.5.1000001.764942=Apache License, Version 2.0
org.apache.hadoop--hadoop-core--0.20.204.0=Apache License, Version 2.0
org.aspectj--com.springsource.org.aspectj.runtime--1.6.0=Eclipse Public License v1.0
org.aspectj--com.springsource.org.aspectj.weaver--1.6.0=Eclipse Public License v1.0
# https://github.com/hunterhacker/jdom/blob/jdom-1.1/core/LICENSE.txt
org.jdom--com.springsource.org.jdom--1.1.0=JDOM License 
org.springframework--org.springframework.aop--3.0.5.RELEASE=Apache License, Version 2.0
org.springframework--org.springframework.asm--3.0.5.RELEASE=Apache License, Version 2.0
org.springframework--org.springframework.beans--3.0.5.RELEASE=Apache License, Version 2.0
org.springframework--org.springframework.context--3.0.5.RELEASE=Apache License, Version 2.0
org.springframework--org.springframework.core--3.0.5.RELEASE=Apache License, Version 2.0
org.springframework--org.springframework.expression--3.0.5.RELEASE=Apache License, Version 2.0
org.springframework--org.springframework.jdbc--3.0.5.RELEASE=Apache License, Version 2.0
org.springframework--org.springframework.orm--3.0.5.RELEASE=Apache License, Version 2.0
org.springframework--org.springframework.transaction--3.0.5.RELEASE=Apache License, Version 2.0
# http://www.xmlpull.org/
org.xmlpull--com.springsource.org.xmlpull--1.1.4.c=Public Domain
oro--oro--2.0.8=Apache License, Version 2.0
tomcat--jasper-compiler--5.5.12=Apache License, Version 2.0
tomcat--jasper-runtime--5.5.12=Apache License, Version 2.0
