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