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.

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

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

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

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

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.

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