<?php

require_once 'build.class.php';
require_once 'component.class.php';
require_once 'buildTypes.php';

$builds = array();
$currentBuild = null;
$currentComponent = null;
$currentBundle = null;
$latestBuild = null;

if (! ($xmlparser = xml_parser_create()) ) {
	die ("Cannot create parser");
}

function handleBuild($attribs) {
	//	echo "<h2> Build: " . $attribs['NAME'] . "</h2>";
	global $builds, $currentBuild;
	$currentBuild = new Build( $attribs['NAME'], $attribs['TSTAMP'], $attribs['TYPE'], $attribs['STREAM']);
	$builds[] = $currentBuild;
}

function handleComponent($attribs) {
	global $currentComponent, $currentBuild;

	$currentComponent = new Component( $attribs['NAME'], $attribs['SUMMARY'], $attribs['JUNITRESULTSURL']);
	$currentBuild->addComponent($currentComponent);
}

function handleBundle($attribs) {
	global $currentComponent, $currentBundle;
	$currentBundle = new Bundle( $attribs['NAME'], $attribs['LINK'], $attribs['SIZE'], $attribs['SUMMARY']);
	$currentComponent->addBundle($currentBundle);
}

function handleDependency($attribs) {
	global $currentBuild;
	$dependency = new Dependency( $attribs['NAME'], $attribs['LINK']);
	$currentBuild->addDependency($dependency);
}

function handleDetail($attribs) {
	global $currentBuild;
	$detail = new Detail( $attribs['NAME'], $attribs['LINK'], $attribs['SUMMARY']);
	$currentBuild->addDetail($detail);
}

function start_tag($parser, $name, $attribs) {
	//echo "Current tag : ".$name."<br />";
	if ( strcmp($name, "BUILD") == 0 ) handleBuild($attribs);
	if ( strcmp($name, "COMPONENT") == 0) handleComponent($attribs);
	if ( strcmp($name, "BUNDLE") == 0 ) handleBundle($attribs);
	if ( strcmp($name, "DEPENDENCY") == 0 ) handleDependency($attribs);
	if ( strcmp($name, "DETAIL") == 0 ) handleDetail($attribs);
}

function end_tag($parser, $name) {
	//	echo "Reached ending tag ".$name."<br /><br />";
}

xml_set_element_handler($xmlparser, "start_tag", "end_tag");

function tag_contents($parser, $data) {
	//echo "Contents : ".$data."<br />";
}

/**
 * Finds the latest stable build. Looking for latest timestamp for in the highest seniority of builds.
 *
 */
function findLatestBuild() {
	global $latestBuild, $builds, $buildTypes	;

	$latestFound = false;
	foreach( $buildTypes as $buildType ) {
		if ( !$latestFound ) {
			foreach( $builds as $build ) {
				if ( strcmp($build->getType(), $buildType) == 0 ) {
					if ( $latestBuild == null ) { $latestBuild = $build;}
					else {
						if ( $build->getTStamp() > $latestBuild->getTStamp() ) {
							$latestBuild = $build;
						}
					}
					$latestFound = true;
				}
			}
		}
	}
}

xml_set_character_data_handler($xmlparser, "tag_contents");

$filename = $App->getDownloadBasePath() ."/technology/tigerstripe/downloads.xml";
if (!($fp = fopen($filename, "r"))) { die("cannot open ".$filename); }

while ($data = fread($fp, 4096)){
	$data=eregi_replace(">"."[[:space:]]+"."<","><",$data);
	if (!xml_parse($xmlparser, $data, feof($fp))) {
		$reason = xml_error_string(xml_get_error_code($xmlparser));
		$reason .= xml_get_current_line_number($xmlparser);
		die($reason);
	}
}
xml_parser_free($xmlparser);

findLatestBuild();
?>