blob: 12cfa5fc6388202a94ce68a3f45f79a15aabbb96 [file] [log] [blame]
<?php
/*******************************************************************************
* Copyright (c) 2007-2019 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:
* Antoine Toulme, Intalio Inc. bug 248845: Refactoring generate1.php into different files with a functional approach
* Denis Roy (Eclipse Foundation) - Bug 550544 - Babel server is not ready for PHP 7
*******************************************************************************/
require_once(dirname(__FILE__) . "/fragment.class.php");
class Feature {
public $language;
public $feature_id;
public $train;
public $fragments;
public $output_dir;
public $tmp_dir;
/**
* default constructor
*/
function Feature($language, $train, $tmp_dir, $output_dir, $fragments = null) {
$this->language = $language;
$this->train = $train;
if (!$fragments) {
$fragments = Fragment::select($language, $train);
}
$this->fragments = $fragments;
$this->output_dir = $output_dir;
$this->tmp_dir = $tmp_dir;
$projects = $this->associated_projects();
if (count($projects) == 1) {
$this->feature_id = "org.eclipse.babel.nls_". $projects[0]->id ."_". $language->iso;
} else {
$this->feature_id = "org.eclipse.babel.nls_".$language->iso;
}
}
/**
* Returns an integer between 0 and 100 representing the percent completion
* of the translation of this feature in this language.
*/
function pct_complete() {
global $dbh;
if (strcmp($this->language->iso, "en_AA") == 0) {
return 100;
}
foreach($this->associated_projects() as $project) {
$sql = "SELECT pct_complete
FROM project_progress
WHERE project_id = \"". $project->id ."\"
AND version = \"". $project->version ."\"
AND language_id = " . $this->language->id;
$project_pct_complete_result = mysqli_query($dbh, $sql);
if ($project_pct_complete_result and
(($project_pct_complete = mysqli_fetch_assoc($project_pct_complete_result)) != null)) {
if (!isSet($pct)) {
$pct = $project_pct_complete['pct_complete'];
} else {
// there might be some better way to do the average.
$pct = ($pct + $project_pct_complete['pct_complete'])/2;
}
} else {
// for now we assume the project is not translated at all.
// We should maybe return some fixed value equivalent to "unknown"
if (!isSet($pct)) {
$pct = 0;
} else {
$pct = $pct/2;
}
}
}
if (!isSet($pct)) {
return 0;
}
return $pct;
}
/*
* Copies all the necessary legal files in the destination folder specified.
*/
function copyLegalFiles($dir) {
exec("cp ". LEGAL_FILES_DIR. "about.html $dir");
exec("cp ". LEGAL_FILES_DIR. "eclipse_update_120.jpg $dir");
exec("cp ". LEGAL_FILES_DIR. "epl-2.0.html $dir");
exec("cp ". LEGAL_FILES_DIR. "feature.properties $dir");
exec("cp ". LEGAL_FILES_DIR. "license.html $dir");
}
/**
* Generates the fragments and the feature.
*/
function generateAll() {
$this->cleanupOutput();
foreach($this->fragments as $fragment) {
$this->generateFragment($fragment);
}
$this->generate();
}
/*
* Cleans the $output_dir/eclipse/features/ and $output_dir/eclipse/plugins folders.
*/
function cleanupOutput($output_dir = null, $create_eclipse_structure = true) {
if (!$output_dir) {
$output_dir = $this->output_dir;
}
if ($create_eclipse_structure) {
$instructions = array("rm -Rf $output_dir/eclipse/features/",
"rm -Rf $output_dir/eclipse/plugins/",
"mkdir -p $output_dir/eclipse/features/",
"mkdir -p $output_dir/eclipse/plugins/");
} else {
$instructions = array("rm -Rf $output_dir/*");
}
foreach ($instructions as $cmd) {
$retval = system($cmd, $return_code);
if ($return_code != 0) {
echo "### ERROR during the execution of: $cmd\n";
echo $retval . "\n";
}
}
}
/**
* Copies the legal files and generates the feature.xml file in the feature folder.
*/
function generate($dir = null) {
if (!$dir) {
$dir = $this->output_dir."/eclipse/features/".$this->feature_id;
}
exec("mkdir -p $dir");
$this->copyLegalFiles($dir);
$this->generateFeatureXml($dir);
}
/**
* Generates a fragment.
*/
function generateFragment($fragment, $tmp_dir = null, $output_dir = null) {
if (!$tmp_dir) {
$tmp_dir = $this->tmp_dir;
}
if (!$output_dir) {
$output_dir = $this->output_dir;
}
$fragment->generateFragment($tmp_dir, "$output_dir/eclipse/plugins/");
}
/*
* Generates the feature.xml file in the designated folder.
*/
function generateFeatureXml($dir) {
$project_toStr = "";
$projects_string_array = array();
foreach($this->associated_projects() as $proj) {
$projects_string_array[] = $proj->id;
}
$project_toStr = join(", ", $projects_string_array);
$outp = fopen("$dir/feature.xml", "w");
fwrite($outp, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" .
"\n<feature id=\"" . $this->feature_id . "\"" .
"\n\tlabel=\"Babel Language Pack for $project_toStr in " . $this->language->name . " (" . $this->pct_complete() . ")\"" .
"\n\timage=\"eclipse_update_120.jpg\"" .
"\n\tprovider-name=\"%providerName\"" .
"\n\tversion=\"" . $this->train->version . "_" . $this->train->timestamp. "\">" .
"\n\t<copyright>\n\t\t%copyright\n\t</copyright>" .
"\n\t<license url=\"%licenseURL\">\n\t\t%license\n\t</license>" .
"\n\t<description>Babel Language Pack for $project_toStr in " . $this->language->name . "</description>" );
foreach ($this->fragments as $fragment) {
fwrite($outp, "\n\t<plugin fragment=\"true\" id=\"" . $fragment->fragment_id(). "\" unpack=\"false\" " .
"version=\"". $this->train->version. "_" . $this->train->timestamp . "\" download-size=\"" . $fragment->filesize. "\" install-size=\"" . $fragment->filesize . "\" />");
}
fwrite($outp, "\n</feature>");
fclose($outp);
}
/**
* Returns the projects associated with this feature.
*/
function associated_projects() {
$projects = array();
foreach($this->fragments as $fragment) {
foreach($fragment->associated_projects() as $proj) {
$projects[$proj->id . "_" . $proj->version] = $proj;
}
}
return array_values($projects);
}
/*
* jars the content of a directory $dir, places it in a file named $output
*/
function internalJar($dir, $output) {
$cmd = "cd $dir; jar cfM $output .";
$retval = system($cmd, $return_code);
if ($return_code != 0) {
echo "### ERROR during the execution of: $cmd\n";
echo "$retval\n";
}
}
/**
* Jars the feature into an output folder.
* This function is only used when defining features for a site, not for a normal feature creation
* Once the feature is jarred, its folder is removed.
*/
function jar($dir = null, $output_dir = null) {
if (!$dir) {
$dir = $this->output_dir ."/eclipse/features/";
}
if (!$output_dir) {
$output_dir = $this->output_dir;
}
$feature_filename = $this->filename() . ".jar";
$this->internalJar($dir, "$output_dir/eclipse/features/$feature_filename");
// delete the folder of the feature
system("rm -Rf \"$output_dir/eclipse/features/". $this->feature_id . "\"");
}
/*
* Returns the file name of the feature as guessed from the feature_id
* and the train information.
*/
function filename() {
return $this->feature_id ."_". $this->train->version ."_". $this->train->timestamp;
}
/**
* Zips the feature as a zip to a destination folder.
*/
function zip($destination, $output_dir = null) {
if (!$output_dir) {
$output_dir = $this->output_dir;
}
$filename = $this->filename() . ".zip";
$instructions = array(
"cd $output_dir ; zip -r -q $filename eclipse",
"cd $output_dir ; mv $filename $destination");
foreach ($instructions as $cmd) {
$retval = system($cmd, $return_code);
if ($return_code != 0) {
echo "### ERROR during the execution of: $cmd";
echo "\n$return_code $retval";
}
}
return "$destination/$filename";
}
// Following functions help dealing with CSV files.
/**
* Zips the feature as a zip to a destination folder.
*/
function zipAsCSV($destination, $output_dir = null) {
if (!$output_dir) {
$output_dir = $this->output_dir;
}
$filename = $this->filename() . ".zip";
$instructions = array(
"zip -r -q $filename $output_dir/* -d $output_dir/$filename",
"mkdir -p $destination",
"cd $output_dir ; mv $filename $destination");
foreach ($instructions as $cmd) {
$retval = system($cmd, $return_code);
if ($return_code != 0) {
echo "### ERROR during the execution of: $cmd";
echo "\n$return_code $retval";
}
}
return "$destination/$filename";
}
function generateAsCSV() {
global $dbh;
$this->cleanupOutput(null, false);
$filename = $this->filename() . ".csv";
$language = $this->language->id;
$train = $this->train->id;
$sql = <<<SQL
SELECT s.name, s.value, s.string_id
FROM files AS f
INNER JOIN strings AS s ON f.file_id = s.file_id
INNER JOIN release_train_projects as v ON (f.project_id = v.project_id AND f.version = v.version)
WHERE f.is_active
AND s.non_translatable <> 1
AND v.train_id = '$train'
SQL;
$result = mysqli_query($dbh, $sql);
$f = fopen("$this->output_dir/" . $this->filename() . ".csv", "w");
while (($row = mysqli_fetch_assoc($result)) != null) {
$value_row = mysqli_fetch_assoc(mysqli_query($dbh, "SELECT value from translations where string_id = " . $row['string_id'] . " and language_id = " . $language));
$value = '';
if ($value_row != null) {
$value = $value_row['value'];
}
fputcsv($f, array($row['name'], $row['value'], $value));
}
fclose($f);
}
}