This product is based on:
Apache Taverna Workbench
Copyright 2014-2020 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (http://www.apache.org/).

Portions of this software were originally based on the following:
- Copyright 2007-2014 University of Manchester, UK
These have been licensed to the Apache Software Foundation under a software grant.

---------------------------------------------------------
./taverna-ui/src/main/java/org/apache/taverna/lang/ui/TableMap.java

TODO:
 * Copied from code found at http://www.informit.com/guides/content.aspx?g=java&seqNum=57

This is not open source - this file must be removed

---------------------------------------------------------
taverna-workbench-impl/src/main/java/org/apache/taverna/workbench/ui/impl/LoggerStream.java

 *  JBoss: The OpenSource J2EE WebOS   *
 *                                     *
 *  Distributable under LGPL license.  *
 *  See terms of license at gnu.org.   *
 *                                     *
 *  Modified by Stian Soiland-Reyes    *


TODO: This file is not Apache License compatible and must be removed
---------------------------------------------------------
taverna-workbench-api/src/main/resources/org/apache/taverna/workbench/icons/


TODO: Some of these icons are from the 
icon sets Crystal and Crystal Clear by Everaldo Coelho, 
licensed under the LGPL license.
See https://commons.wikimedia.org/wiki/Crystal_Clear
and https://commons.wikimedia.org/wiki/Category:Crystal_icons

FIXME: Remove incompatible icons (but keep those we made ourselves)

---------------------------------------------------------


TODO: clarify license for
src/main/jjtree/dotparser.jjt

  JavaCC grammar for parsing Graphviz DOT files.
  Written by Lynn Monson at lm@lmonson.com

http://web.archive.org/web/20101110152804/http://lmonson.com/blog/?page_id=66
says:

> I’ve included all of the generated files in the download in case you don’t
> want to run the JavaCC tools, but just realize that everthing was generated
> from the single dotparser.jjt file.

> There are no restrictions on the use of this software, but equally, it is
provided with no warranty or support.

FIXME: that is probably not a compatible open-source license - 
we should contact the author - he already have an 
ICLA on file:
https://people.apache.org/unlistedclas.html

---------------------------------------------------------
./taverna-perspective-myexperiment/src/main/java/org/apache/taverna/ui/perspectives/myexperiment/model/Base64.java

TODO: File claims to be public domain?

http://iharder.sourceforge.net/current/java/base64/

This is a Public Domain Java class providing very fast Base64 encoding and decoding in the form of convenience methods and input/output streams.

Also is this file really needed as Commons Codec can do Base64?
---------------------------------------------------------


taverna-ui/src/main/java/org/apache/taverna/lang/ui/treetable/


  Copyright 1994-2004 Sun Microsystems, Inc. All Rights Reserved.
  Redistribution and use in source and binary forms, with or without
  modification, are permitted provided that the following conditions are
  met:


  1 Redistribution of source code must retain the above copyright notice,
  this list of conditions and the following disclaimer.


  2 Redistribution in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the
  documentation and/or other materials provided with the distribution.


  Neither the name of Sun Microsystems, Inc. or the names of contributors
  may be used to endorse or promote products derived from this software
  without specific prior written permission.


  This software is provided "AS IS," without a warranty of any kind. ALL
  EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
  ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE
  OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN")
  AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE
  AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS
  DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST
  REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,
  INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE
  THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS
  SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.



  You acknowledge that this software is not designed, licensed or intended
  for use in the design, construction, operation or maintenance of any
  nuclear facility.

---------------------------------------------------------
