<?php
/*******************************************************************************
 * Copyright (c) 2011, 2016 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Wayne Beaton - initial API and implementation
 *   Jens Reimann - show pointer cursor for slideups
 *******************************************************************************/

/**
 * This file provides a listing of the output generated by the download
 * directory scan tool. For a given project, it lists all the third-party
 * JAR files found, along with their location, and corresponding CQ (if
 * available). If a CQ cannot be determined for a potential third-party
 * library, the entry is highlighted.
 *
 * The input for this script is provided by dashboard/downloads/scan_all.php;
 * this script is currently run on the build server every Friday. See comments
 * on scan_all.php.
 */
require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/common.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/debug.php");
trace_file_info(__FILE__);

require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");
$App = new App();
$Nav = new Nav();
$Menu = new Menu();

if ($App->devmode) {
	$base = $_SERVER['DOCUMENT_ROOT'] . '/projects/tests/data/ip-scans';
} else {
	$base = '/home/data/httpd/writable/projects/ip-scans/';
	mustBeCommitter();
}

include($App->getProjectCommon());

require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/util/summary.php");


function getProjectScans() {
	global $base;
	global $projectNamePattern;

	$scans = array();

	if (!$dh = opendir($base)) return $scans;

	while (($file = readdir($dh)) !== false) {
		if (preg_match("/^($projectNamePattern).xml$/", $file, $matches)) {
			$scans[$matches[1]] = $file;
		}
	}
	closedir($dh);

	ksort($scans);
	return $scans;
}

function generateReport($id) {
	global $base;

	if (!$id) return null;
	$file = "$base/$id.xml";
	if (!file_exists($file)) {
		echo "<p>Cannot find the data file. Please try again later.
			If this problem persists, please contact
			<a href=\"mailto:emo@eclipse.org\">EMO</a>.</p>";
		return;
	}


	$scan = simplexml_load_file($file);
	if (!$scan) {
		echo "<p>We experienced a problem while attempting
			to parse the data file. Please try again later.
			If this problem persists, please contact
			<a href=\"mailto:emo@eclipse.org\">EMO</a>.</p>";
		return;
	}

	$date = date("Y-m-d h:m", filemtime($file));
	echo "<p>This report is based on information extracted on $date.</p>";

	echo "<p>This report is intended for use by Eclipse committers only;
			it is not intended for use by the general public.</p>";

	echo "<p>Note that this scan report is intended to assist Eclipse projects
			to identify potential errors in IP tracking. The scan tools does
			its best to identify Java JAR files and categorize them as either
			artefacts developed by the project or third-party libraries. The
			matching algorithm is not perfect as there is much variability in
			how JAR files are packaged and distributed. <b>Many of the \"hits\"
			displayed on this page may be bogus.</b> It may also fail to identify
			whether or not, for example, a \"piggyback\" is required.
			Ultimately, Eclipse committers are responsible for ensuring that
			intellectual property is appropriately tracked. This tool is
			intended to assist in that tracking; it is not a replacement
			for the due diligence.</p>";

	if (!$scan->project) {
		echo "<p>Nothing to report; no files found in project downloads.</p>";
		return;
	}

	foreach ($scan->project as $project) {
		$projectId = $project['id'];
		echo "<h3>$projectId</h3>";
		dumpIncludes($project);
		dumpBundles($project);
		dumpMissing($project);
	}
}

function dumpIncludes($project) {
	echo "<h4>Eclipse Projects</h4>";

	$ids = array();
	foreach($project->includes as $include) {
		$ids[] = (string)$include['id'];
	}

	if (!$ids) {
		echo "<p>No bundles from other Eclipse projects were found.</p>";
		return;
	}

	echo "<p>Bundles from the following Eclipse projects were found amoung your project
		downloads. Use this information to confirm your understanding of what is being
		distributed by your project. Please report any errors you find to
		<a href=\"mailto:emo@eclipse.org\">EMO</a>.</p>";

	echo "<div style=\"margin-left:25px\">";
	echo "<ul>";

	sort($ids);
	foreach($ids as $id) {
		echo "<li>$id</li>";
	}
	echo "</ul>";
	echo "</div>";
}

function dumpBundles($project) {
	echo "<h4>Third-party Bundles</h4>";

	$bundles = array();
	$test = array();
	foreach ($project->bundle as $bundle) {
		if (isPossibleTestBundle($bundle)) {
			$test[(string)$bundle['name']] = $bundle;
		} else {
			$bundles[(string)$bundle['name']] = $bundle;
		}
	}

	echo "<p>The following potential third-party libraries were found in the project
		downloads. There may be some incorrectly identified JAR files/bundles in this
		list (especially those that do not follow bundle versioning conventions).</p>";
	echo "<p>We cannot find the corresponding CQ for those bundles displayed in red.
		This does not necessarily mean that there is no CQ, only that we cannot determine
		the relationship. Please report any errors you find to
		<a href=\"mailto:emo@eclipse.org\">EMO</a>.</p>";
	echo "<p>Click on the JAR/bundle name to toggle a listing of file paths showing
		where this file is found.</p>";

	dumpBundleList($bundles);

	if ($test) {
		echo "<p>The following libraries may be test bundles. We have grouped them here
			for convenience.</p>";

		dumpBundleList($test);
	}
}

/**
 * Answers true if the bundle might possibly be a test JAR, or false otherwise.
 *
 * A bundle is considered a test JAR if we cannot identify a CQ, and
 * <b>all</b> of the paths contain the word 'test'.
 *
 * @param unknown_type $bundle
 * @return boolean
 */
function isPossibleTestBundle(&$bundle) {
	if ($bundle->cq) return false;

	foreach($bundle->location as $location) {
		$path = $location['path'];
		if (!preg_match('/test/', $path)) return false;
	}
	return true;
}

function dumpBundleList(&$bundles) {
	if (!$bundles) {
		echo "<p>No bundles found.</p>";
		return;
	}

	ksort($bundles);

	echo "<div style=\"margin-left:25px\">";
	foreach($bundles as $bundle) {
		dumpBundle($bundle);
	}
	echo "</div>";
}

function dumpBundle($bundle) {
	$name = $bundle['name'];
	if ($cq = $bundle->cq) {
		$id = $cq['id'];
		$name = "$name (<a href=\"https://dev.eclipse.org/ipzilla/show_bug.cgi?id=$id\" target=\"cq\">CQ $id</a>)";
	} else {
		$name = "<span style=\"color:red;font-weight:bold\">$name (No CQ found)</span>";
	}
	echo "<div class=\"slideup_toggle\">";
	echo "<p style=\"cursor: pointer;\">$name</p>";
	echo "<div class=\"slideup\">";
	echo "<ul>";
	foreach($bundle->location as $location) {
		$path = $location['path'];
		echo "<li>$path</li>";
	}
	echo "</ul>";
	echo "</div>";
	echo "</div>";
}

function dumpMissing($project) {
	echo "<h4>Summary of Missing CQs</h4>";

	$bundles = array();
	foreach ($project->bundle as $bundle) {
		if ($bundle->cq) continue;
		$bundles[(string)$bundle['name']] = $bundle;
	}

	if (!$bundles) {
		echo "<p>No missing CQs found.</p>";
		return;
	}

	echo "<div style=\"margin-left:25px\">";

	ksort($bundles);
	foreach($bundles as $bundle) {
		dumpBundle($bundle);
	}
	echo "</div>";
}

require_once($_SERVER['DOCUMENT_ROOT'] . "/projects/classes/Project.class.php");

$scans = getProjectScans();
$id = $App->getHttpParameter('id');
if (!isset($scans[$id])) $id = null;

ob_start();

$pageKeywords = "";
$pageTitle = "Project Downloads";
$pageAuthor = "Wayne Beaton";
?>

<div id="midcolumn">
<h1><?= $pageTitle ?></h1>

<div class="homeitem">

<p><strong>DEPRECATED.</strong> this tool is no longer supported and
will be retired soon.</p>

<p>This tool shows the results from automated scans of Eclipse project
directories.</p>

<form method="get">
<?php
	foreach ($_GET as $key => $value) {
		if ($key == 'id') continue;
		echo "<input type=\"hidden\" name=\"$key\" value=\"$value\"";
	}
?>
<p>Select a project:
	<select name="id">
	<?php
		foreach($scans as $project => $file) {
			$selected = $id == $project ? ' selected="true"' : '';
			echo "<option value=\"$project\"$selected>$project</option>";
		}
	?>
	</select>
	<input type="submit" value="Go!"/>
</p>
</form>

<p>The mapping of project to download directory that we use to
discover this information can be found
<a href="downloads_source.php">here</a>.</p>

<?php echo generateReport($id); ?>

</div>
</div>

<?php
$html = ob_get_contents();
ob_end_clean();
$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);

echo get_trace_html();
?>