| <?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 (Eclipse Foundation)- initial API and implementation |
| *******************************************************************************/ |
| |
| /* |
| * This script assumes that it is being included by another script. We |
| * assume that the $App variable has already been defined. |
| */ |
| |
| require_once(dirname(__FILE__) . "/Project.class.php"); |
| require_once(dirname(__FILE__) . "/debug.php"); |
| trace_file_info(__FILE__); |
| |
| class ProjectRoot { |
| /** |
| * @internal |
| * @var Project[] |
| */ |
| var $topLevelProjects; |
| |
| /** |
| * All the projects that we know about (even inactive ones). |
| * @internal |
| * @var Project[] |
| */ |
| var $allProjects; |
| |
| /** |
| * Only the active projects (duh). |
| * |
| * @internal |
| * @var Project[] |
| */ |
| var $activeProjects; |
| |
| /** |
| * @internal |
| * @var bool |
| */ |
| var $isProjectInfoLoaded = false; |
| |
| function __construct() { |
| $this->load_project_hierarchy(); |
| } |
| |
| /** |
| * @deprecated |
| */ |
| function isValidProjectName($name) { |
| global $projectNamePattern; |
| |
| return preg_match("/^$projectNamePattern$/", $name); |
| } |
| |
| /** |
| * Answers an array containing all top-level projects. Only |
| * active projects are included. |
| * |
| * @return Project[] |
| */ |
| function getTopLevelProjects() { |
| return $this->topLevelProjects; |
| } |
| |
| /** |
| * @deprecated |
| * @see #getTopLevelProjects() |
| */ |
| function get_project_hierarchy() { |
| return $this->getTopLevelProjects(); |
| } |
| |
| /** |
| * @deprecated |
| * @see #getActiveProjects() |
| */ |
| function get_all_projects() { |
| return $this->getActiveProjects(); |
| } |
| |
| function getActiveProjects() { |
| return $this->activeProjects; |
| } |
| |
| function getAllProjects() { |
| return $this->allProjects; |
| } |
| |
| /** |
| * @deprecated |
| * @see #getProject() |
| */ |
| function get_project($id) { |
| return $this->getProject($id); |
| } |
| |
| /** |
| * This function answers the project with the given id. |
| * |
| * @return Project |
| */ |
| function getProject($id) { |
| return $this->allProjects[$id]; |
| } |
| |
| /** |
| * @internal |
| */ |
| function load_project_hierarchy() { |
| if ($this->topLevelProjects) return; |
| |
| global $App; |
| |
| $project_fields = array('ProjectId', 'Name','Level','ParentProjectID','Description', |
| 'UrlDownload','UrlIndex','DateActive','SortOrder','IsActive', |
| 'BugsName','ProjectPhase','DiskQuotaGB','IsComponent','IsStandard'); |
| |
| $project_fields_string = implode(',', $project_fields); |
| |
| $where = "ProjectId != 'Eclipse Foundation' and ProjectId not like 'foundation-internal%' and ProjectId not like 'locationtech%'"; |
| |
| // if ($activeOnly) $where = "$where and IsActive"; |
| |
| $query = " |
| SELECT |
| $project_fields_string |
| FROM |
| Projects |
| WHERE |
| $where |
| ORDER BY ProjectID"; |
| |
| $result = $App->foundation_sql($query); |
| |
| $top_level = array(); |
| $projects = array(); |
| $activeProjects = array(); |
| |
| while($row = mysql_fetch_assoc($result)) { |
| $id = $row["ProjectId"]; |
| $parentId = $row['ParentProjectID']; |
| |
| $project = new Project($this, $row); |
| |
| $projects[$id] = $project; |
| |
| if ($project->isActive()) { |
| $activeProjects[$id] = $project; |
| |
| if ($parentId == "root" || !$parentId) { |
| $top_level[] = $project; |
| } else { |
| $parent = $projects[$parentId]; |
| if ($parent) { |
| $project->parent = $parent; |
| $parent->children[] = $project; |
| } else { |
| // TODO Deal with the orphan |
| } |
| } |
| } |
| } |
| |
| mysql_free_result($result); |
| |
| $this->topLevelProjects = $top_level; |
| $this->allProjects = $projects; |
| $this->activeProjects = $activeProjects; |
| |
| $this->_loadProjectHistory(); |
| } |
| |
| /** |
| * This function loads the project information on demand. Since |
| * we don't necessarily know if we need this information when the |
| * object is constructed, we delay loading until we're asked. This |
| * function loads the information for all projects. The amount of |
| * data is relatively small, so it doesn't make a lot of sense to |
| * load it piecemeal. At least not for the time being. |
| * |
| * This function is called from methods in the Project class. |
| * |
| * @internal |
| * |
| * PRIVATE: THIS FUNCTION IS NOT API. |
| */ |
| /* private */ function load_project_info() { |
| if ($this->isProjectInfoLoaded) return; |
| $tracer = trace("Loading project information from Eclipse DB."); |
| |
| global $App; |
| |
| $sql = " |
| SELECT distinct |
| i.ProjectInfoID as ProjectInfoID, i.ProjectID as ProjectID, |
| i.MainKey as MainKey, v.SubKey as SubKey, i.LastModified as LastModified, v.Value as Value |
| FROM |
| ProjectInfo as i |
| join ProjectInfoValues as v on (i.ProjectInfoID = v.ProjectInfoID) |
| ORDER By ProjectID, ProjectInfoID, MainKey, SubKey |
| "; |
| $result = $App->eclipse_sql($sql); |
| |
| while($row = mysql_fetch_assoc($result)) { |
| $projectId = $row['ProjectID']; |
| if (!isset($this->allProjects[$projectId])) continue; |
| |
| $id = $row['ProjectInfoID']; |
| $key = $row['MainKey']; |
| $subkey = $row['SubKey']; |
| $value = $row['Value']; |
| |
| $project = $this->allProjects[$projectId]; |
| if ($project) { |
| $tracer->trace("$id > $projectId > $key/$subkey > $value"); |
| $project->values[] = $row; |
| } |
| } |
| |
| mysql_free_result($result); |
| |
| $this->isProjectInfoLoaded = true; |
| } |
| |
| /** |
| * This function walks through the array of projects (recursing |
| * into the child projects as necessary) to find and answer the |
| * project with the given id. |
| * |
| * PRIVATE: THIS FUNCTION IS NOT API. |
| * @deprecated |
| */ |
| /* private */ function find_project(&$projects, $id) { |
| foreach($projects as $project) { |
| if (strcmp($project->getId(),$id) == 0) return $project; |
| $match = $this->find_project($project->getChildren(), $id); |
| if ($match) return $match; |
| } |
| return null; |
| } |
| |
| function _loadProjectHistory() { |
| // SELECT i.projectid as active, a.projectid as inactive from Projects as a join Projects as i on (substring_index(a.projectid, '.', -1) = substring_index(i.projectid, '.', -1) and not i.IsActive) where a.IsActive |
| $moveMap = array( |
| "rt.ercp","dsdp.ercp", |
| "technology.rtsc","dsdp.rtsc", |
| "tools.tm","dsdp.tm", |
| "rt.equinox","technology.equinox", |
| "rt.equinox","eclipse.equinox", |
| "rt.equinox.bundles","eclipse.equinox.bundles", |
| "rt.equinox.framework","eclipse.equinox.framework", |
| "rt.equinox.p2","eclipse.equinox.p2", |
| "rt.equinox.security","eclipse.equinox.security", |
| // "rt.equinox","eclipse.incubator.equinox", |
| // "modeling.emf.compare","eclipse.platform.compare", |
| // "eclipse.jdt.core","eclipse.platform.core", |
| // "stp.core","eclipse.platform.core", |
| // "modeling.emft.search","eclipse.platform.search", |
| "modeling.emf.cdo","modeling.emft.cdo", |
| "modeling.emf.compare","modeling.emft.compare", |
| "modeling.emf.mwe","modeling.emft.mwe", |
| "modeling.emf.teneo","modeling.emft.teneo", |
| "modeling.mdt.modisco","modeling.gmt.modisco", |
| //"modeling.mdt.uml2","modeling.uml2", |
| "soa.swordfish","rt.swordfish", |
| "soa.bpmnmodeler","stp.bpmnmodeler", |
| "soa.sca","stp.sca", |
| "technology.dash.athena","technology.athena", |
| "tools.buckminster","technology.buckminster", |
| "webtools.dali","technology.dali", |
| "rt.ecf","technology.ecf", |
| "rt.eclipselink","technology.eclipselink", |
| "soa.jwt","technology.jwt", |
| "tools.mat","technology.mat", |
| "tools.ptp.photran","technology.photran", |
| "tools.ptp","technology.ptp", |
| "rt.rap","technology.rap", |
| "rt.riena","technology.riena", |
| "technology.dash.athena","technology.soc.athena", |
| "technology.ide4edu","technology.soc.ide4edu", |
| "soa.swordfish","technology.swordfish", |
| "modeling.mdt.xsd","technology.xsd", |
| "mylyn.reviews","tools.mylyn.reviews", |
| // "eclipse.jdt.core","tools.pdt.core", |
| // "stp.core","tools.pdt.core", |
| "tools.atf","webtools.atf"); |
| |
| while (current($moveMap)) { |
| $new = current($moveMap); |
| $old = next($moveMap); |
| next($moveMap); |
| |
| if (!isset($this->allProjects[$new])) continue; |
| if (!isset($this->allProjects[$old])) continue; |
| |
| trace("Project $old was moved to $new."); |
| |
| $newProject = $this->allProjects[$new]; |
| $oldProject = $this->allProjects[$old]; |
| |
| $newProject->movedFrom[] = $oldProject; |
| } |
| } |
| } |
| ?> |