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

02/12/2018 Updated with Apache Camel 2.9.13

02/12/2018 Updated with UIMA-AS which includes UIMA-SDK 2.10.2 and
           ActiveMQ 5.15.2, Spring Framework 4.3.9, xstream 1.4.10,
           Jetty 9.2.22 v20170606
           
01/03/2017 Updated with jna-4.2.2 to support OS-based login to WS.

12/15/2016 Updated with UIMA-AS 2.9.0 which includes new UIMA SDK 2.9.0 
           and ActiveMQ 5.14.0. There were no new images added nor
           new jars for the webserver.

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




