Apache Taverna Server
Copyright 2014-2018 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 2010-2014 University of Manchester, UK
These have been licensed to the Apache Software Foundation under a software grant.

---------------------------------------------------------
org.apache.taverna.server.usagerecord.xml.urf classes are
derived from https://www.ogf.org/documents/GFD.98.pdf
and http://schemas.ogf.org/urf/2003/09/url

      Usage Record Working Group XML Schema definition (GFD.98)

      Copyright (C) Open Grid Forum (2006-2007). All Rights Reserved.

      This document and translations of it may be copied and furnished to
      others, and derivative works that comment on or otherwise explain it or
      assist in its implementation may be prepared, copied, published and
      distributed, in whole or in part, without restriction of any kind,
      provided that the above copyright notice and this paragraph are included
      on all such copies and derivative works. However, this document itself
      may not be modified in any way, such as by removing the copyright notice
      or references to the OGF or other organizations, except as needed for
      the purpose of developing Grid Recommendations in which case the
      procedures for copyrights defined in the OGF Document process must be
      followed, or as required to translate it into languages other than
      English.

      The limited permissions granted above are perpetual and will not be
      revoked by the OGF or its successors or assignees.

      This document and the information contained herein is provided on an "As
      Is" basis and the OGF disclaims all warranties, express or implied,
      including but not limited to any warranty that the use of the
      information herein will not infringe any rights or any implied
      warranties of merchantability or fitness for a particular purpose.
---------------------------------------------------------
org.apache.taverna.server.usagerecord.xml.urf2 classes are
derived from https://www.ogf.org/documents/GFD.204.pdf

  Copyright © Open Grid Forum (2006-2013). Some Rights Reserved.
 
  This document and translations of it may be copied and furnished to others,
  and derivative works that comment on or otherwise explain it or assist in its
  implementation may be prepared, copied, published and distributed, in whole
  or in part, without restriction of any kind, provided that the above
  copyright notice and this paragraph are included as references to the derived
  portions on all such copies and derivative works. The published OGF document
  from which such works are derived, however, may not be modified in any way,
  such as by removing the copyright notice or references to the OGF or other
  organizations, except as needed for the purpose of developing new or updated
  OGF documents in conformance with the procedures defined in the OGF Document
  Process, or as required to translate it into languages other than English.
  OGF, with the approval of its board, may remove this restriction for
  inclusion of OGF document content for the purpose of producing standards in
  cooperation with other international standards bodies.
 
  The limited permissions granted above are perpetual and will not be revoked
  by the OGF or its successors or assignees.
 ---------------------------------------------------------
 