| <?php |
| /******************************************************************************* |
| * Copyright (c) 2007-2008 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 |
| *******************************************************************************/ |
| |
| 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() { |
| 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() { |
| $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); |
| } |
| } |