<?php 
/*******************************************************************************
 * Copyright (c) 2012 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 (Eclipse Foundation)- initial API and implementation
 *******************************************************************************/

/**
 * The ProjectPlanParser turns an XML-based project plan into an array. 
 */
class ProjectPlanParser  {
    var $parser;
    var $stack;

    static function getPlanFromFile($file) {
    	if (!$file) return null;
    	if (!file_exists($file)) return null;
    	if (!$contents = file_get_contents($file)) return null;
    	
    	return self::getPlanFromString($contents);
    }
    
    static function getPlanFromString($string) {
    	if (!$string) return null;
    	$parser = new self();
    	return $parser->parse($string);
    }
    
    function __construct() {
        $this->parser = xml_parser_create_ns();

        xml_set_object($this->parser, $this);
        xml_set_element_handler($this->parser, "start", "end");
        xml_set_character_data_handler($this->parser, "characters");
    }

    function parse($data) {
    	$this->stack = array(array());
        xml_parse($this->parser, $data, true);
        $top = array_pop($this->stack);
		return $top['plan'][0];
    }
    
    function start($parser, $tag, $attributes) {
    	if (preg_match('/^HTTP:\/\/WWW\.ECLIPSE\.ORG\/PROJECT\/PLAN:(.+)$/', $tag, $matches)) {
    		$nested = array();
    		foreach($attributes as $key => $value) $nested[strtolower($key)] = $value;
    		array_push($this->stack, $nested);
    	} else {
    		preg_match('/^http:\/\/[^:]+:(.+)$/i', $tag, $matches);
    		$tag = strtolower($matches[1]);
    		foreach($attributes as $key => $value) 
    			$tag .= ' ' . strtolower($key) . "=\"$value\"";
    		$this->characters($parser, "<$tag>");
    	}
    }

    function characters($parser, $data) {
    	if (!trim($data)) return;
    	
        $top = array_pop($this->stack);
        $top['#text'] .= $data;
        array_push($this->stack, $top);
    }

    function end($parser, $tag) {
    	if (preg_match('/^HTTP:\/\/WWW\.ECLIPSE\.ORG\/PROJECT\/PLAN:(.+)$/', $tag, $matches)) {
    		$tag = strtolower($matches[1]);
    		$nested = array_pop($this->stack);
    		if (isset($nested['#text'])) 
    			$nested['#text'] = preg_replace('/\s+/', ' ', trim($nested['#text']));
    		$top = array_pop($this->stack);
    		$top[$tag][] = $nested;
    		array_push($this->stack, $top);
    	} else {
    		preg_match('/^http:\/\/[^:]+:(.+)$/i', $tag, $matches);
    		$tag = strtolower($matches[1]);    		
    		$this->characters($parser, "</$tag>");
    	}
    }
}

?>