<?php
/* Copyright (c) 2007 IBM, made available under EPL v1.0
 * Contributors Nick Boldt
 *
 * The common parameter parsing module for the REST web-api
 * for retrieving data from the database. This is NOT part
 * of the public web-api.
 * 
 * Run this script on your build server or on www.eclipse.org (warnings will be thrown re: exec() call in downloads-scripts.php#getTestResultsJUnitXML())
 * TODO: fix path errors if run on build.eclipse.org
 *
 * parent=name, eg., modeling or NONE
 * top=name, eg., emf, gmf
 * project=name, eg., sdo, gmf
 * version=x.y.z
 * buildID=AyyyymmddHHMM, where A = {N, I, M, S, R}
 *
 * All 4 values are required.
 * 
 * Test cases:
 * 
 * GEF, with parent=NONE
 * http://emf.torolab.ibm.com/modeling/build/checkBuildStatus.php?parent=NONE&top=tools&project=gef&buildID=I200809091900&version=3.5.0
 * 
 * modeling.emf.*, on both servers:
 * http://emf.torolab.ibm.com/modeling/build/checkBuildStatus.php?parent=modeling&top=emf&project=emf&buildID=N200809161300&version=2.5.0
 * http://emft.eclipse.org/modeling/build/checkBuildStatus.php?parent=modeling&top=emf&project=query&buildID=R200806091744&version=1.2.0
 * http://emft.eclipse.org/modeling/build/checkBuildStatus.php?parent=modeling&top=gmf&project=gmf&version=2.1.2&buildID=M200809162010
 */

ini_set('display_errors', 1); ini_set('error_reporting', E_ALL);

$isEMFserver = (preg_match("/^emf(?:\.torolab\.ibm\.com)$/", $_SERVER["SERVER_NAME"]));
$isBuildServer = (preg_match("/^(emft|modeling|build)\.eclipse\.org$|^localhost$/", $_SERVER["SERVER_NAME"])) || $isEMFserver;
$isBuildDotEclipseServer = $_SERVER["SERVER_NAME"] == "build.eclipse.org";
$isWWWserver = (preg_match("/^(?:www.|)eclipse.org$/", $_SERVER["SERVER_NAME"]));
$isEclipseCluster = (preg_match("/^(?:www.||download.|download1.|build.)eclipse.org$/", $_SERVER["SERVER_NAME"]));
$debug = (isset ($_GET["debug"]) && preg_match("/^\d+$/", $_GET["debug"]) ? $_GET["debug"] : -1);
$writableRoot = ($isBuildServer ? $_SERVER["DOCUMENT_ROOT"] . "/modeling/includes/" : "/home/data/httpd/writable/www.eclipse.org/");
$writableBuildRoot = $isBuildDotEclipseServer ? "/opt/public/modeling" : "/home/www-data";

$data = loadHttpGetVars();
if ( (isset($data["parent"]) && $data["parent"] == "NONE" ) || // no parent
	( !isset($data["top"]) && isset($data["project"]) ) ||  // no top
	( (!isset($data["parent"]) || !$data["parent"]) && isset($data["top"]) && isset($data["project"]) && $data["top"] == $data["project"]) ) // no parent & top == project  
{
	$PR =  $data["project"]; # GEF
}
else
{
	$PR =  (isset($data["parent"]) && $data["parent"] != "NONE" ? $data["parent"] . "/" : "") . $data["top"]; # modeling/mdt
}

#print "<i>$PR</i><br>";
$data["project"] = isset($data["project"]) ?  $data["project"] : "";
$projct = $data["project"];

$html = isset($_GET["html"]);

require_once($_SERVER["DOCUMENT_ROOT"] . "/modeling/includes/buildServer-common.php");
require_once($_SERVER["DOCUMENT_ROOT"] . "/modeling/includes/scripts.php");
require_once($_SERVER["DOCUMENT_ROOT"] . "/modeling/includes/downloads-scripts.php");
$hadLoadDirSimpleError = 1;

if (isset($data["project"]))
{
	$file = $_SERVER["DOCUMENT_ROOT"] . "/$PR/downloads/extras-" . $data["project"] . ".php";
	if (file_exists($file))
	{
		include_once($file);
	}
}

if ($debug<0) header($html ? "Content-Type: text/html\n\n" : "Content-Type: text/plain\n\n");
if (sizeof($data)<4)
{
	echo "Must specify parent project, top project, sub project (component), version, and buildID:\n\n" .
		"  " . $_SERVER['SCRIPT_NAME'] . "?parent=NONE&top=gef&project=&version=3.4.0&buildID=R200706201159\n" .
		"  " . $_SERVER['SCRIPT_NAME'] . "?parent=modeling&top=emf&project=query&version=1.1.0&buildID=R200706201159&html\n";
	exit;
}

$unknown=true;
$dropsDir = getPWD($data["project"] . "/" . "downloads/drops/", false, $debug > 0);

$buildDetails = "Build Details\t" . "http://" . $_SERVER["SERVER_NAME"] . "/" . $PR . "/downloads/?project=$projct&amp;sortBy=date&amp;hlbuild=" . $data["buildID"] . "#" . $data["buildID"] . "\n\n";
if (is_readable($dropsDir . $data["version"] . "/" . $data["buildID"]))
{
	$extraTestsResults = getExtraTestsResults($data["version"], $data["buildID"], $html);
	$buildResults  = showBuildResults($dropsDir,
		$data["version"] . "/" . $data["buildID"] . "/", $html);
	if ($html)
	{
		print $buildResults[0];
		print isset($extraTestsResults) && isset($extraTestsResults[0]) && sizeof($extraTestsResults[0]) > 0 ? implode(" | ", $extraTestsResults[0]) : "";
		print "<br/>\n";
		print '<a href="' . $buildResults[1] . '">Test Results</a>' . "<br/>\n";
		print '<a href="' . $buildResults[2] . '">Build Log</a>' . "<br/>\n";
	}
	else
	{
		print "Status\t" . $buildResults[0];
		print isset($extraTestsResults) && isset($extraTestsResults[0]) && isset($extraTestsResults[0][0]) ? $extraTestsResults[0][0] : "";
		print "\n\n";
		print "JUnit Results\t" . $buildResults[1] . "\n\n";
		print isset($extraTestsResults) && isset($extraTestsResults[1]) && isset($extraTestsResults[1][0]) && $extraTestsResults[1][0] ? $extraTestsResults[1][0] . "\n" : "";
		print "Build Log\t" . $buildResults[2] . "\n\n";
		print $buildDetails;
	}
	$unknown=false;
}
if ($unknown)
{
	print "Status\tUNKNOWN" . ($debug > 0 ? "\t(" . $dropsDir . $data["version"] . "/" . $data["buildID"] . ")" : "") . "\n\n";
	print $buildDetails;
}

/**********************************************************************************************************************************/

function loadHttpGetVars()
{
	global $debug;
	$data = array();
	$input_patterns = array(
		/* regex => array(http get vars) */
		"#(NONE|[a-z]+)#" => array("parent"),
		"#([a-z0-9]+)#" => array("top","project"),
		"#([0-9\.]{5})#" => array("version"),
		"#([NIMSR][0-9]{12})#" => array("buildID"),
	);

	foreach($input_patterns as $regex => $httpfieldnames)
	{
		foreach ($httpfieldnames as $httpfieldname)
		{
			$param = isset($_GET[$httpfieldname]) ? $_GET[$httpfieldname] : null;
			if ($debug > 0)
			{
				print "<pre>     [$regex][$httpfieldname] Got \$param = $param     </pre>\n";
			}
			if ($param !== null)
			{
				if (preg_match($regex, $param, $matches))
				{
		  			$data[$httpfieldname] = $param;
		  		}
			}
		}
	}
	return $data;
}


?>
