Apache Taverna Workbench
Copyright 2014-2016 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.

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