<?php
/**
 * Copyright (c) 2017, 2022 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *   Wayne Beaton (Eclipse Foundation)
 *   Eric Poirier (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */


$licenseFile = dirname(__FILE__) . "/../licenses.json";
$licenses = json_decode(file_get_contents($licenseFile), true);
$modified = strtotime($licenses['meta']['updated']);

$approved = array_merge($licenses['approved'], $licenses['valid']);

function dumpLicenseList($licenses) {
    asort($licenses);
    echo "<ul>";
    foreach ($licenses as $spdx => $name) {
        echo "<li>{$name} (<a target=\"_spdx\" href=\"https://spdx.org/licenses/{$spdx}\">{$spdx}</a>)</li>";
    }
    echo "</ul>";
}

?>
<div id="maincontent">
  <div id="midcolumn">
    <h1><?php echo $pageTitle; ?></h1>
    <p>Updated <?php print $App->getFormattedDate($modified); ?></p>
    <h3 id="approved">Approved Licenses</h3>
		<p>
			This approved license list enumerates the licenses that the Eclipse
			Foundation has approved for third-party content used by its projects.
			Inclusion in this list does not suggest that the Eclipse Foundation has
			determined that every one of these licenses can be used by every
			Eclipse open source project. That is, <em>the licenses on this list
				are not necessarily compatible with every Eclipse Foundation project
				license, or with each other</em>.
		</p>
		<p>
			When a license is absent from this list, it does not necessarily 
			mean that use of the license is forbidden. In the case where an Eclipse
			open source project requires the use of content that is distributed
			under a license that is not on this list, an Eclipse project committer can 
			get assistance from the Eclipse Foundation Intellectual Property Team.
		</p>
		<p>
			In the general case, determining whether or not a particular
			combination of licenses are consistent is hard.
		</p>
		<p> Eclipse project committers can get help from the Eclipse Foundation 
			Intellectual Property Team help regarding licenses and other intellectual
			property matters by engaging in the <a
				href="https://www.eclipse.org/projects/handbook/#ip">Eclipse
				Intellectual Property Due Diligence Process</a>.
		</p>
		<p>
			If you otherwise have any questions about this list or its use,
			please contact <a href="license@eclipse.org">license@eclipse.org</a>.
		</p>
		<?php dumpLicenseList($approved); ?>
    <h3 id="nonapproved">Non Approved Licenses</h3>
    <p>
      Other licenses have been approved by the Eclipse Board of Directors
      in certain cases.</p>
      <p>Please contact <a href="license@eclipse.org">license@eclipse.org</a>
      for more information.
    </p>
  </div>
</div>