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

/*
 * This is a simple tracing facility. If a 'trace' parameter is included in the
 * HTTP GET header, then trace information is gathered and made available for display.
 * 
 * Submit trace messages using the trace($message) function. Gathered
 * trace information can be collected into a single string of HTML
 * content using the get_trace_html() function; note that this function
 * will only provide non-empty content if the 'trace' parameter is included
 * in the HTTP GET header.
 * 
 * More complex interaction is possible. Tracing can be nested by using
 * the value returned by the trace($message) function. For example:
 * 
 * $tracer = trace('started something');
 * $tracer->trace('step 1');
 * $tracer->trace('step 2');
 * etc.
 * 
 * This would be rendered as a nested list that would appear thusly:
 * 
 * - started something
 *   - step 1
 *   - step 2
 * ...
 * 
 * The nesting can be arbitrarily deep.
 * 
 * Note that turning on the trace also turns on PHP error reporting.
 */
if (isset($_GET['trace']) || hasCommandLineArgument('-trace')) {
	error_reporting(E_ALL); 
	ini_set("display_errors", true);
	$_tracer = new Tracer();
} else { 
	$_tracer = new NullTracer();
}

function hasCommandLineArgument($value) {
	global $argv;
	if (!$argv) return false;
	foreach($argv as $arg) if ($arg == $value) return true;
	return false;
}

/*
 * @deprecated Use trace($message) instead.
 */
function debugMessage($message) {
	if (!isset($_GET['debug'])) return;
	
	trace($message);
}


$_file_tracer = trace("File Information");

trace_file_info(__FILE__); // Might as well trace information about this file...

function trace($message) {
	global $_tracer;
	
	return $_tracer->trace($message);
}

function get_trace_html() {
	global $_tracer;
	
	return $_tracer->to_html_div();
}

function get_trace_xml() {
	global $_tracer;
	
	return $_tracer->to_xml();
}

function get_trace_text() {
	global $_tracer;
	
	return $_tracer->to_text();
}

/**
 * Returns the trace information in an array suitable for
 * export using JSON.
 * 
 * @return string
 */
function get_trace_array() {
	global $_tracer;
	
	return $_tracer->to_array();
}

/**
 * Add some basic information about the given file to the trace data.
 * For the time being, this is limited to the modified date. This can
 * be helpful to let you know if you're actually running the latest
 * version of the file (in the case that you're uploading the script
 * to the Eclipse www server through CVS).
 * 
 * You can use the __FILE__ super global to easily include this 
 * information by adding the following line to your PHP file (after
 * the inclusion of this file, of course):
 * 
 * trace_file_info(__FILE__);
 */
function trace_file_info($fileName) {
	global $_file_tracer;
	
	$last_modified = filemtime($fileName);
	$date = date('l, dS F, Y @ h:ia', $last_modified);
	$_file_tracer->trace("File $fileName last modified on $date");
}

/*
 * This class is not intended to be instantiated by clients.
 */
class Tracer {
	var $message;
	var $children = array();
	
	function trace($message) {
		$child = new Tracer();
		$child->message = $message;
		$this->children[] = $child;
		return $child;
	}
	
	function to_html_div() {
		$html = '<div style="border-style:solid;border-width:1px"><p>Trace information</p>';
		$html .= $this->to_html();
		$html .= '</div>';
		
		return $html;
	}
	
	/* private */ function to_html() {
		$html = $this->message;
		if ($this->children) {
			$html .= '<ul>';
			foreach($this->children as $child) {
				$html .= '<li>' . $child->to_html() . '</li>';
			}
			$html .= '</ul>';
		}
		return $html;
	}
	
	function to_xml() {
		return "<!--\n" . $this->to_text() . "-->";
	}
	
	function to_text($indent = "\t") {
		$result = $this->message . "\n";
		foreach($this->children as $child) {
			$result .= $child->to_text("$indent\t");
		}
		return $result;
	}
	
	function to_array() {
		$values = array();
		$values[] = $this->message;
		if ($this->children) {
			foreach($this->children as $child) {
				$values[] = $child->to_array();
			}
		}
		return $values;
	}
}

/*
 * This class is not intended to be instantiated by clients.
 */
class NullTracer {
	function trace($message) {
		return $this;
	}
	
	function to_html_div() {
		return '';
	}
	
	function to_xml() {
		return '';
	}
	
	function to_text() {
		return '';
	}
	
	function to_array() {
		return '';
	}
}
?>