| <?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"; | |
| } | |
| } | |
| ?> |