blob: a26c5ef593053d79173c77e536263f5d98c537c7 [file] [log] [blame]
<?php
/**
* Copyright (c) 2018 Eclipse Foundation.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* Contributors:
* Christopher Guindon (Eclipse Foundation) - Initial implementation
*
* SPDX-License-Identifier: EPL-2.0
*/
if (basename(__FILE__) == basename($_SERVER['PHP_SELF'])) {
exit();
}
require_once (realpath(dirname(__FILE__) . "/../../system/app.class.php"));
/**
* Compare packages
*
* Migrated from downloads.git
*
* @author chrisguindon
*/
class ComparePackages {
private $App = NULL;
protected $os_display = '';
protected $display = '';
private $platform = array();
private $legend = array();
private $devmode = FALSE;
private $images = array(
0 => '',
1 => array(
'included',
'check.jpg'
),
// 2 => array('partially included', 'checkpartial.jpg'),
2 => array(
'Included (with Source)',
'checksource.jpg'
)
);
protected $release = 'photon';
private $header = array();
private $header_strip = array(
'(includes Incubating components)',
'Eclipse IDE for ',
'Eclipse for ',
'Eclipse IDE for ',
'Developers',
'Software',
'Eclipse'
);
private $row = array();
private $path_xml_download = '/home/data/httpd/writable/community/';
protected $features_accepted = array();
protected $features_list = array();
private $path_xml_packages = 'Win.xml';
private $prefix_package = '';
public $protocol = 'http';
public function __construct($App = NULL) {
if (!is_a($App, 'App')) {
$App = new App();
}
$this->App = $App;
if (!empty($this->App->devmode) && $this->App->devmode == TRUE) {
$this->path_xml_download = $_SERVER['DOCUMENT_ROOT'] . '/downloads-xml/';
}
$this->protocol = $this->App->getHTTPPrefix();
$this->setupPlatform($this->App);
$this->features_accepted = $this->getFeaturesXml();
$this->setPrefixPackage('release');
$this->setRelease('latest');
}
public function setRelease($release) {
$releases = array(
'juno',
'kepler',
'luna',
'mars',
'neon',
'oxygen',
'photon',
'2018-09',
'latest'
);
if (in_array($release, $releases)) {
$this->release = $release;
$this->features_list = $this->getFeaturesList();
}
}
public function getLegend() {
foreach ($this->images as $id => $i) {
$this->legend[] = $this->getLegendImage($id);
}
return implode(' ', $this->legend);
}
public function setPrefixPackage($prefix) {
$this->prefix_package = $prefix . 'Cache';
$this->prepareDownloads();
}
function getOs() {
return $this->os_display;
}
protected function prepareDownloads() {
$od = $this->os_display;
if ($od == "linux" || $od == "linux-x64") {
$this->display = "Linux";
$this->updatePackages($this->prefix_package . "Linux.xml");
}
elseif ($od == "macosx" || $od == "cocoa64") {
$this->display = "macOS";
$this->updatePackages($this->prefix_package . "Cocoa.xml");
}
elseif ($od == "carbon") {
$this->display = "macOS";
$this->updatePackages($this->prefix_package . "Carbon.xml");
}
else {
$this->display = "Windows";
$this->updatePackages($this->prefix_package . "Win.xml");
}
}
public function updatePackages($path) {
$this->path_xml_packages = $path;
$packages = simplexml_load_file($this->path_xml_download . $this->path_xml_packages, NULL, LIBXML_NOCDATA);
$this->packages = $this->hackPackages($packages);
}
public function getPackages($package = NULL) {
foreach ($this->packages as $p) {
if ($p['package_bugzilla_id'] == $package) {
return $p;
}
}
return $this->packages;
}
public function getReadableFeature($id = NULL) {
if (is_null($id) || $id == "" || empty($this->features_list[$id])) {
return FALSE;
}
$this->features_list[$id]['name'] = (substr($this->features_list[$id]['name'], 0, 8) == 'Eclipse ') ? str_replace('Eclipse ', '', $this->features_list[$id]['name']) : $this->features_list[$id]['name'];
if ($this->features_list[$id]['name'] == "%feature.label") {
return FALSE;
}
return $this->features_list[$id];
}
public function output() {
$this->getPackageData();
ob_start();
?>
<table id="compareTable" class="table">
<thead>
<tr>
<?php
foreach ($this->header as $t) {
print $t;
}
?>
</tr>
</thead>
<tbody>
<?php
$count = 0;
foreach ($this->row as $t) {
$count++;
print '<tr id="row-' . $count . '">';
foreach ($t as $c) {
print $c;
}
print '</tr>';
}
?>
</tbody>
</table>
<?php
return ob_get_clean();
}
private function getFeaturesXml() {
// feature restriction
$url = simplexml_load_file($this->path_xml_download . 'featuresRestriction.xml');
$json = json_encode($url);
return json_decode($json, TRUE);
}
private function getFeaturesList() {
// readable features
$url = $this->path_xml_download . 'features' . ucfirst($this->release) . '.json';
$json = json_decode(file_get_contents($url), TRUE);
return $this->renameFeatures($json);
}
private function hackPackages($p) {
// adding RCP to all packages.
foreach ($p->package as $f) {
$ex = explode(',;', $f->features);
if (!in_array('org.eclipse.rcp', $ex)) {
$f->features = $f->features . 'org.eclipse.rcp,;';
}
// Scout
if ($f['icon'] == 'http://www.eclipse.org/downloads/images/scout.jpg') {
$f->features = $f->features . 'org.eclipse.scout.source,;';
}
if ($f['icon'] == 'http://www.eclipse.org/downloads/images/dsl-package.jpg') {
$f->features = $f->features . 'org.eclipse.rcp.source,;org.eclipse.cvs.source,;org.eclipse.jdt.source,;org.eclipse.pde.source,;org.eclipse.xtend.sdk.source,;org.eclipse.xtext.sdk.source';
}
$count = 1;
$f['icon'] = str_replace('http://www.eclipse.org', '', $f['icon'], $count);
$f['id'] = $f['package_bugzilla_id'];
$f['url'] = str_replace('http:', '', $f['url'], $count);
$f['downloadurl'] = str_replace('http:', '', $f['downloadurl'], $count);
$f['downloadurl64'] = str_replace('http:', '', $f['downloadurl64'], $count);
}
return $p;
}
private function renameFeatures($f) {
return $f;
}
private function getPackageData() {
$count = 0;
$this->header[] = '<td class="col-' . $count . '"></td>';
$this->row['radio'][] = '<td id="td_info" class="col-' . $count . '"><span>Select packages to compare</span></td>';
// Setting up the first two rows
foreach ($this->packages->package as $p) {
$count++;
$name = str_replace(' and ', '/', str_replace($this->header_strip, '', $p['name']));
$this->row['radio'][] = '<td class="col-' . $count . '"><input type="checkbox" name="controls" id="controls-' . $count . '" value="col-' . $count . '" class="input-radio"/></td>';
$this->header[] = '<td class="col-' . $count . '"><a href="' . $this->protocol . '://eclipse.org' . $p['url'] . '" title="' . $p['name'] . '"><img width="32" src="' . $p['icon'] . '"><br/>' . $name . '</a></td>';
}
// creating a row from each feature
foreach ($this->features_accepted['item'] as $a) {
$count = 0;
$multif = explode(';', $a);
$rfeatures = $this->getReadableFeature($multif[0]);
if (empty($rfeatures)) {
continue;
}
$this->row[$multif[0]][] = '<td class="td_feature-name col-' . $count . '"><span title="' . $rfeatures['description'] . '">' . $rfeatures['name'] . '</span></td>';
foreach ($this->packages->package as $p) {
$count++;
$xfeatures = explode(",;", $p->features);
foreach ($multif as $aa) {
if (!empty($this->features_list[$aa]['id']) && in_array($this->features_list[$aa]['id'] . '.source', $xfeatures)) {
$img = 2;
break;
}
elseif (in_array($aa, $xfeatures)) {
$img = 1;
break;
/*
* }elseif ($a == 'org.eclipse.rcp'){
* $img = 1;
*/
}
else {
$img = 0;
}
}
$this->row[$multif[0]][] = '<td class="col-' . $count . '">' . $this->getLegendImage($img) . '</td>';
}
}
}
private function getLegendImage($id = 0) {
if (!$id) {
return '&nbsp;';
}
$image_prefix = '/downloads/images/';
return '<img width="16" src="' . $image_prefix . $this->images[$id][1] . '" alt="' . $this->images[$id][0] . '"><span class="check-description">' . $this->images[$id][0] . '</span>';
}
public function getRelease() {
return $this->release;
}
private function setupPlatform($App) {
$this->os_display = (!isset($_GET['osType'])) ? $this->App->getClientOS() : $_GET['osType'];
if ($this->os_display == 'linux-x64') {
$this->os_display = 'linux';
}
// default to win32 if $this->App->getClientOS() is returning something
// strange.
$platform = array(
'win32',
'linux',
'macosx'
);
if (!in_array($this->os_display, $platform)) {
$this->os_display = 'win32';
}
$this->platform['win32'] = array(
'name' => 'Windows',
'shortname' => 'Windows'
);
$this->platform['linux'] = array(
'name' => 'Linux',
'shortname' => 'Linux'
);
$this->platform['macosx'] = array(
'name' => 'macOS',
'shortname' => 'macOS'
);
}
}