| <?php |
| /******************************************************************************* |
| * Copyright (c) 2008-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: |
| * Bjorn Freeman-Benson (Eclipse Foundation) - initial API and implementation |
| * Gabe O'Brien (Eclipse Foundation) - various fixes |
| * Wayne Beaton (Eclipse Foundation) - Bug 360086 |
| *******************************************************************************/ |
| |
| 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"); |
| require_once(dirname(__FILE__) . "/classes/Project.class.php"); |
| require_once(dirname(__FILE__) . "/classes/debug.php"); |
| require_once(dirname(__FILE__) . "/classes/common.php"); |
| trace_file_info(__FILE__); |
| |
| // ---------------------------------------------------------------------------- |
| // PHOENIX STUFF |
| |
| $App = new App(); |
| $Nav = new Nav(); |
| $Menu = new Menu(); |
| include($App->getProjectCommon()); |
| |
| $pageTitle = "Project Plan"; |
| $pageAuthor = "Wayne Beaton"; |
| include( '_commonLeftNav.php' ); |
| |
| /** |
| * Handle input parameters. |
| */ |
| $parameters = trace("Parsing parameters"); |
| if (isset($_REQUEST['projectid'])) { |
| $projectid = $_REQUEST['projectid']; |
| if (isValidProjectId($projectid)) { |
| $parameters->trace("Project is is $projectid"); |
| } else { |
| $projectid = htmlspecialchars($projectid); |
| $parameters->trace("The specified project id ($projectid) is invalid."); |
| } |
| } else $projectid = null; |
| |
| if (isset($_REQUEST['date'])) { |
| $value = $_REQUEST['date']; |
| $releaseDate = strtotime($value); |
| if ($releaseDate) { |
| $parameters->trace("Target release date is " . date('Y-m-d', $releaseDate)); |
| } else { |
| $value = htmlentities($value); |
| $parameters->trace("The specified date ($value) is invalid."); |
| } |
| } else $releaseDate = null; |
| |
| if (isset($_REQUEST['name'])) { |
| $releaseName = $_REQUEST['name']; |
| $parameters->trace("Target release name is $releaseName."); |
| } else $releaseName = null; |
| |
| if (isset($_REQUEST['planurl'])) { |
| $value = $_REQUEST['planurl']; |
| $url = normalizeFilePathUrl($url); |
| if ($url) { |
| $parameters->trace("Plan URL is $url"); |
| } else { |
| $value = htmlentities($value); |
| $parameters->trace("The specified url ($value) is invalid."); |
| } |
| } else $url = null; |
| |
| $raw = isset($_REQUEST['raw']); |
| |
| /* |
| * Must have a ?projectid=xxx or ?planurl=http://www.eclipse.org/xxx |
| */ |
| if ($projectid) { |
| $project = getProject($projectid); |
| if ($project) { |
| $url = normalizeFilePathUrl($project->getPlanUrl()); |
| |
| $release = null; |
| if ($releaseDate) { |
| $release = $project->getReleaseOnDate($releaseDate); |
| if (!$release) $parameters->trace('Release on ' . date('Y-m-d', $releaseDate) . ' not found!'); |
| } else if ($releaseName) { |
| $release = $project->getReleaseNamed($releaseName); |
| if (!$release) $parameters->trace("Release named $releaseName not found!"); |
| } |
| |
| if ($release) $url = normalizeFilePathUrl($release->getPlan()); |
| } else { |
| $parameters->trace("Project $projectid not found!"); |
| } |
| } |
| |
| // TODO What if the $url is null? |
| |
| |
| $App->AddExtraHtmlHeader(" |
| <style> |
| h2 {border-bottom: 2px solid gray;} |
| h3 {border-bottom: 1px dotted gray;} |
| </style>"); |
| |
| ob_start(); |
| ?> |
| <?php renderProjectPlan($project, $url, $releaseDate, $raw); |
| |
| function renderProjectPlan($project, $url, $releaseDate, $raw) { |
| if ($raw) renderRawProjectPlan($url); |
| else renderHtmlProjectPlan($project, $url, $releaseDate); |
| } |
| |
| function renderRawProjectPlan($url) { |
| $contents = @file_get_contents( $url ); |
| echo "<div id=\"maincontent\">"; |
| echo "<div id=\"midcolumn\">"; |
| echo "<div style=\"margin-left: 10px; margin-top: 10px\">"; |
| echo "<b>Location:</b> $url<br>"; |
| echo "<b>Meta-data Tag:</b> projectplanurl<br>"; |
| echo "<b>Raw:</b>"; |
| |
| echo "<pre>"; |
| echo htmlspecialchars($contents); |
| echo "</pre>"; |
| |
| echo "</div>"; |
| echo "</div>"; |
| echo "</div>"; |
| } |
| |
| function renderHtmlProjectPlan($project, $url, $releaseDate) { |
| $xml = new DomDocument(); |
| $xml->load($url); |
| if( $xml === false ) { |
| echo "<div id=\"maincontent\">"; |
| echo "<div id=\"midcolumn\">"; |
| $contents = @file_get_contents( $url ); |
| if( !$contents ) { |
| show_error_page( 'The specified URL (' . htmlspecialchars($url) . ') points to an empty file.', $projectid ); |
| } else { |
| if( preg_match( "/&(?<!amp;)/", $contents ) ) { |
| show_error_page( 'the file appears to have at least one naked &s in bugzilla urls: &s must be escaped as &amp; to be valid XML.', $projectid ); |
| } else { |
| show_error_page( 'the file is not a valid project plan XML file. See <a href="http://wiki.eclipse.org/Development_Resources/Project_Plan">the documentation</a> for details.', $projectid ); |
| } |
| } |
| echo "</div>"; |
| echo "</div>"; |
| return; |
| } |
| |
| // If we don't have a reference to the project, obtain it from the plan. |
| if (!$project) { |
| $releases = $xml->getElementsByTagName( "release" ); |
| $projectid = $releases->item(0)->getAttribute( "projectid" ); |
| $project = get_project($projectid); |
| } |
| |
| $pageTitle = "Project Plan for " . $project->getName(); |
| $projectName = $project->getName(); |
| |
| // ---------------------------------------------------------------------------- |
| // OUTPUT |
| $old_error_handler = set_error_handler("globalDisplayErrorHandler"); |
| /* create the processor and import the stylesheet */ |
| $xsl = new DomDocument(); |
| $xsl->load("project-plan-render.xsl"); |
| |
| $proc = new XsltProcessor(); |
| $xsl = $proc->importStylesheet($xsl); |
| $proc->setParameter(null, "projectName", $projectName); |
| $proc->setParameter(null, "projectId", $projectid); |
| |
| /* transform and output the xml document */ |
| $echo = $proc->transformToXML($xml); |
| if($echo === false){ |
| show_error_page( 'the project XML file loaded but was not able to be transformed by our XSL. Please confirm that your XML is valid.', $projectid ); |
| } else{ |
| echo $echo; |
| } |
| |
| restore_error_handler(); |
| } |
| |
| ?> |
| <div style="float: right; text-align: right"><a href="?projectid=<?= $projectid ?>&raw=1">view raw xml of project plan</a><br> |
| <a href="/projects/dev_process/project-status-infrastructure.php">from project meta-data key "projectplanurl"</a></div> |
| |
| <?php |
| $html = ob_get_contents(); |
| ob_end_clean(); |
| |
| # Generate the web page |
| $pageKeywords = ''; |
| $App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html); |
| |
| echo get_trace_html(); |
| |
| |
| |
| function show_error_page( $errormsg, $projectid ) { |
| global $App; |
| $leaders = array(); |
| |
| $result = $App->foundation_sql(" |
| SELECT DISTINCT(People.PersonID), FName, LName |
| FROM PeopleProjects, Projects, People |
| WHERE PeopleProjects.Relation in ('PL','PD') |
| AND InactiveDate is NULL |
| AND People.PersonID = PeopleProjects.PersonID |
| AND Projects.ProjectID = PeopleProjects.ProjectID |
| AND Projects.ProjectID = '$projectid' |
| ORDER BY LName"); |
| |
| while( $row = mysql_fetch_assoc($result) ) { |
| $leaders[] = $row['FName'] . ' ' . $row['LName']; |
| } |
| |
| if( count($leaders) == 0 ) { |
| $leaderstr = "project leader(s)"; |
| } else { |
| if( count($leaders) == 1 ) { |
| $leaderstr = "project leader (" . $leaders[0] . ")"; |
| } else { |
| $t1 = array_pop( $leaders ); |
| $leaderstr = "project leaders (" . implode( ", ", $leaders ) . " and " . $t1 . ")"; |
| } |
| } |
| ?> |
| <div style="margin-top: 60px; margin-left: 50px; width: 400px"> |
| <center> |
| <img src="/projects/images/no-plan.jpg"> |
| <p style="margin-top: 40px;">Unable to display the <?= $projectid ?> project plan because <?= $errormsg ?></p> |
| <?php if(count($leaders) != 0 ){ ?> |
| <p style="margin-bottom: 60px;">The project team and <?= $leaderstr ?> are responsible for the project plan. You can contact them via the <a href="http://www.eclipse.org/mail/">project's developer mailing list</a>.</p> |
| <?php } ?> |
| </center> |
| </div> |
| <?php |
| } |
| |
| // Global Errror Handler Function |
| // This replicates the look/functionality of userErrorHandler from harness.php |
| // but doesn't implement the test-specific checks for global flags. |
| // NOTE: This is not setup by default. If you need to enable this, |
| // do something like: $old_error_handler = set_error_handler("globalDisplayErrorHandler"); |
| // external_entry() sets this up if the context calls for it. |
| function globalDisplayErrorHandler($errno, $errmsg, $filename, $linenum, $vars) { |
| // TODO Refactor. This function is repeated in several files. |
| $errortype = array ( |
| E_ERROR => 'Error', |
| E_WARNING => 'Warning', |
| E_PARSE => 'Parsing Error', |
| E_NOTICE => 'Notice', |
| E_CORE_ERROR => 'Core Error', |
| E_CORE_WARNING => 'Core Warning', |
| E_COMPILE_ERROR => 'Compile Error', |
| E_COMPILE_WARNING => 'Compile Warning', |
| E_USER_ERROR => 'User Error', |
| E_USER_WARNING => 'User Warning', |
| E_USER_NOTICE => 'User Notice', |
| E_STRICT => 'Runtime Notice', |
| E_RECOVERABLE_ERROR => 'Catchable Fatal Error'); |
| switch($errno) { |
| case E_NOTICE: // discard NOTICEs |
| case E_STRICT: // discard RUNTIME notices for deprecated usages |
| return; |
| default: |
| echo "<p><table cellpadding=10 width=400 bgcolor=#ffcccc><tr><td><font size=+2>Trouble: </font>"; |
| echo "PHP $errortype[$errno]:<br>$errmsg<br>$filename ($linenum)"; |
| $mysql_error_func = 'mysql_error_check'; |
| if(function_exists($mysql_error_func)) { |
| $mysql_error_func(); |
| } |
| echo "</table></p>\n"; |
| } |
| } |
| ?> |