<?php 	
/*******************************************************************************
 * Copyright (c) 2011 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
 *******************************************************************************/

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();	

// TODO Refactor this code
// This is repeated in downloads.php; if it's use twice, it needs a single home.
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 getProjectPairings($base) {
	
	global $projectNamePattern;
	
	$pairings = array();
	
	if (!$dh = opendir($base)) return $scans;
	
	while (($file = readdir($dh)) !== false) {
		if (!preg_match("/^$projectNamePattern.xml$/", $file)) continue;
		retrievePairings($pairings, "$base/$file");
	}
	closedir($dh);

	return $pairings;
}

function retrievePairings(&$pairings, $file) {
	
	$scan = simplexml_load_file($file);
	
	foreach ($scan->project as $project) {
		retrieveProjectPairings($pairings, $project);
	}
}

function retrieveProjectPairings(&$pairings, $project) {	
	$source = $project['id'];
	foreach($project->includes as $target) {
		$target = (string)$target['id'];
		$pairings[$target][] = $source;
	}
}

function cmp_count($a, $b) {
	if (count($a) == count($b)) return 0;
	return (count($a) > count($b)) ? -1 : 1;
}

$pairings = getProjectPairings($base);
uasort($pairings, 'cmp_count');

ob_start();

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

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

<div class="homeitem">

<p>This page shows the frequency with which bits of projects are distributed
by other projects. Project A is considered to be used/distributed by project B
if project B includes at least one bundle from project A in its download directory.
Note that that this does not reflect actual use; that would require scanning
bundle manifests (which we don't do just yet).</p>

<?php
echo "<ul>";
foreach($pairings as $target => $sources) {
	$count = count($sources);
	$entries = array();
	foreach($sources as $id) {
		$entries[] = "<a href=\"downloads.php?id=$id\">$id</a>";
	}
	$list = join(', ', $entries);
	echo "<li>$target ($count)";
	echo "<ul><li>$list</li></ul>";
	echo "</li>";
}
echo "</ul>";

?>

</div>
</div>

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

echo get_trace_html();
?>