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

This readme includes notes related to DUCC NOTICE and LICENSE files.


06/16/2016 Added cassandra and its dependencies. 
07/23/2015 Added missing xmlbeans attributions to NOTICE file


UIMA DUCC binary release includes a trimmed down version of ActiveMQ. Only the 
necessary parts of ActiveMQ are included.

We don't bundle activemq-web.jar so we need not include licenses for
prototype.js and behaviour.js. 

We are not including ibitis which an open source java mapping framework for SQL.

Also, activemq-jmdns_*.jar is not included in DUCC release so no need to mention
its license.

ActiveMQ bundles Java Service Wrapper from Tanuki software to support
running the ActiveMQ broker as a windows-NT service or a daemon thread 
in Linux or Unix systems.

Reviewed activemq notice and copied relevant legal stuff related to JSP and
Java Servlet.

Jan 17, 2014 - all DUCC jars are free of 3rd party classes. We only package
org/apache/uima/ducc/* classes. If this changes, need to modify NOTICE file
we bundle in a jar. 
 
The source tarball includes com.springsource.net.sf.cglib-2.2.0.jar which 
is licensed Apache 2.0. No notice file is available for it.

The JSON.org license has the famous restriction of use clause: 
"The Software shall be used for Good, not Evil."
Checked DUCC code for use of JSON and it looks like we use GSON from google
which has ASF 2.0 license. The above clause does not apply.

Derby jar file contains a NOTICE file referencing quite a number of dependencies.
These dependencies are not bundled (packaged) in derby jar though. For this
reason DUCC NOTICE file does not mention these dependencies. DUCC uses core
functionality of Derby. 

================
Ducc 2.1.0

Cassandra snappy, netty, and lz4 License mentions found in the jar manifests
Ducc includes Cassandra server (in DUCC_HOME/cassandra-server) and client
   side is in DUCC_HOME/lib/cassandra. On 6/16/2016 seems like client jar
   versions are older from the server.

high-scale-lib-1.0.6.jar - license http://mvnrepository.com/artifact/com.boundary/high-scale-lib/1.0.6

jBCrypt License - http://www.mindrot.org/files/jBCrypt/LICENSE

jLine License - http://jline.sourceforge.net/license.html




