| <?php | |
| /** | |
| * ***************************************************************************** | |
| * Copyright (c) 2016 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 | |
| * Christopher Guindon (Eclipse Foundation) - minor changes | |
| * ***************************************************************************** | |
| */ | |
| /** | |
| * This class represents a forge instance (e.g. | |
| * Eclipse, LocationTech, | |
| * or PolarSys). The intent is to try and centralize the notion of a | |
| * forge rather than have bits of code here and there to handle all of | |
| * the different forges (i.e. to reduce the long term maintenance burden). | |
| */ | |
| class Forge { | |
| /** | |
| * Forge data | |
| * | |
| * @var array | |
| */ | |
| public $data = array(); | |
| /** | |
| * List of all forges | |
| * | |
| * @var array | |
| */ | |
| private static $forges = array(); | |
| /** | |
| * Constructor | |
| * | |
| * @param unknown $data | |
| */ | |
| function __construct($data = array()) { | |
| $this->data = $data; | |
| } | |
| /** | |
| * Get $forges | |
| * | |
| * @return Forge[] | |
| */ | |
| static function getForges() { | |
| if (!empty(self::$forges)) { | |
| return self::$forges; | |
| } | |
| $forges = array( | |
| 'eclipse' => array( | |
| 'id' => 'eclipse', | |
| 'name' => 'Eclipse', | |
| 'url' => 'https://projects.eclipse.org', | |
| 'hudson_domain' => array( | |
| 'hudson.eclipse.org', | |
| 'ci.eclipse.org' | |
| ) | |
| ) | |
| ); | |
| foreach ($forges as &$forge) { | |
| $forge = new self($forge); | |
| } | |
| return self::$forges = $forges; | |
| } | |
| /** | |
| * Get specific forge | |
| * | |
| * @param string $id | |
| * | |
| * @return Forge | |
| */ | |
| static function getForge($id) { | |
| $forges = self::getForges(); | |
| if (isset($forges[$id])) { | |
| return $forges[$id]; | |
| } | |
| return array(); | |
| } | |
| /** | |
| * Get default forge | |
| * | |
| * @return Forge | |
| */ | |
| static function getDefault() { | |
| return self::getForge('eclipse'); | |
| } | |
| /** | |
| * Get forge from project id | |
| * | |
| * @param unknown $id | |
| * | |
| * @return NULL|Forge | |
| */ | |
| static function getForgeForProjectId($id) { | |
| $segments = explode('.', $id); | |
| if ($segments[0] == 'foundation-internal') { | |
| return null; | |
| } | |
| foreach (self::getForges() as $id => $forge) { | |
| if ($id == $segments[0]) { | |
| return $forge; | |
| } | |
| } | |
| return self::getDefault(); | |
| } | |
| /** | |
| * Get forge id | |
| * | |
| * @return string | |
| */ | |
| function getId() { | |
| if (isset($this->data['id'])) { | |
| return $this->data['id']; | |
| } | |
| return ""; | |
| } | |
| /** | |
| * Get forge name | |
| * | |
| * @return string | |
| */ | |
| function getName() { | |
| if (isset($this->data['name'])) { | |
| return $this->data['name']; | |
| } | |
| return ""; | |
| } | |
| /** | |
| * Get forge url | |
| * | |
| * @return string | |
| */ | |
| function getUrl() { | |
| if (isset($this->data['url'])) { | |
| return $this->data['url']; | |
| } | |
| return ""; | |
| } | |
| /** | |
| * Get hudson url | |
| * | |
| * @return array | |
| */ | |
| function getHudsonDomain() { | |
| if (isset($this->data['hudson_domain'])) { | |
| return $this->data['hudson_domain']; | |
| } | |
| return array(); | |
| } | |
| /** | |
| * Get local project id based off the forge | |
| * | |
| * @param unknown $id | |
| * @return unknown|NULL | |
| */ | |
| function getLocalProjectId($id) { | |
| if ($this->isEclipseForge()) { | |
| return $id; | |
| } | |
| $forgeId = $this->getId(); | |
| if (preg_match("/^$forgeId\.(.*)$/", $id, $matches)) { | |
| return $matches[1]; | |
| } | |
| return null; | |
| } | |
| /** | |
| * Verify if current forge is Eclipse | |
| * | |
| * @return boolean | |
| */ | |
| function isEclipseForge() { | |
| return $this->getId() == 'eclipse'; | |
| } | |
| /** | |
| * Validate if url is a valid CI url | |
| * | |
| * @param string $url | |
| * @return boolean | |
| */ | |
| public function isValidCIUrl($url = "") { | |
| // Verify the syntax of the given URL | |
| if (!filter_var($url, FILTER_VALIDATE_URL)) { | |
| return FALSE; | |
| } | |
| // get forge class from eclipse.org-common | |
| $parsed_url = parse_url(strtolower($url)); | |
| if (!isset($parsed_url['path'])) { | |
| // no path specified | |
| return FALSE; | |
| } | |
| $host_parts = explode('.', $parsed_url['host']); | |
| // main domain name should be 2nd from last | |
| if (count($host_parts) < 2) { | |
| // the build link url is very unlikely to be valid | |
| return FALSE; | |
| } | |
| // check host is in the list of accepted domains | |
| $hudson_domain = $this->getHudsonDomain(); | |
| if (!in_array($parsed_url['host'], $hudson_domain)) { | |
| return FALSE; | |
| } | |
| // break the path into parts | |
| $path_parts = explode('/', trim($parsed_url['path'], '/')); | |
| if (empty($path_parts[0])) { | |
| // first part is empty, parsed path had only contained '/' | |
| return FALSE; | |
| } | |
| // check path size, should be 1 or 3 parts | |
| if (count($path_parts) < 1 || count($path_parts) > 3) { | |
| // path longer than expected | |
| return FALSE; | |
| } | |
| if (count($path_parts) === 3) { | |
| // some projects have hudson for first path part - should be project name | |
| // 2nd part should be job if job specified (3rd part is build job name) | |
| if ($path_parts[0] === 'hudson' || $path_parts[1] !== 'job') { | |
| return FALSE; | |
| } | |
| } | |
| return TRUE; | |
| } | |
| } |