<?php
/*******************************************************************************
 * Copyright (c) 2007-2013 Eclipse Foundation, IBM Corporation 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:
 *    Eclipse Foundation - initial API and implementation
 *    Antoine Toulmé - Bug 248917
 *    Kit Lo (IBM) - patch, bug 266250, Map file processor not running properly on live server
 *    Kit Lo (IBM) - patch, bug 258749, Keep spaces at the end of value string
 *    Kit Lo (IBM) - patch, bug 226378, Non-translatable strings or files should not be presented to user for translation
 *    Kit Lo (IBM) - Bug 299402, Extract properties files from Eclipse project update sites for translation
 *    Kit Lo (IBM) - [402215] Extract Orion JavaScript files for translation
 *    Kit Lo (IBM) - [413459] Received "Cannot deactivate string" messages during process_project_source_locations.php
 *******************************************************************************/

require_once("/home/data/httpd/babel.eclipse.org/html/json_encode.php");
require(dirname(__FILE__) . "/../system/language.class.php"); 
require(dirname(__FILE__) . "/../system/release_train.class.php"); 

require(dirname(__FILE__) . "/../string/string.class.php");

class File {
  public $errStrs;
  
  public $file_id		= 0;
  public $project_id	= '';
  public $version		= '';
  public $name			= '';
  public $is_active 	= 0;
  public $plugin_id = '';

	function save() {
		$rValue = false;
		if($this->name != "" && $this->project_id != "" && $this->version != "") {
			global $dbh;

			if($this->file_id == 0) {
				$this->file_id = $this->getFileID($this->name, $this->project_id, $this->version);
			}
			
			$sql 	= "INSERT INTO";
			$where = "";
			if($this->file_id > 0) {
				$sql = "UPDATE";
				$where = " WHERE file_id = " . sqlSanitize($this->file_id, $dbh);
			}
			
			$Event = new EventLog("files", "file_id", $this->file_id, $sql);
			
			$sql .= " files 
						SET file_id 	= " . sqlSanitize($this->file_id, $dbh) . ",
							project_id	= " . returnQuotedString(sqlSanitize($this->project_id, $dbh)) . ", 
							version		= " . returnQuotedString(sqlSanitize($this->version, $dbh)) . ", 
							name		= " . returnQuotedString(sqlSanitize($this->name, $dbh)) . ",
							plugin_id	= " . returnQuotedString(sqlSanitize($this->plugin_id, $dbh)) . ",
							is_active	= " . $this->is_active . $where;
			if(mysqli_query($dbh, $sql)) {
				if($this->file_id == 0) {
					$this->file_id = mysqli_insert_id($dbh);
					$Event->key_value = $this->file_id;
				}
				$rValue = true;
				$Event->add();
			}
			else {
				echo $sql . "\n";
				$GLOBALS['g_ERRSTRS'][1] = mysqli_error($dbh);
			}
		}
		else {
			echo "ERROR: One missing:Name: " . $this->name . "Project: " . $this->project_id  . "Version: " . $this->version;
		}
		return $rValue;
	}
	
	static function getFileID($_name, $_project_id, $_version) {
		$rValue = 0;
		if($_name != "" && $_project_id != "" && $_version != "") {
			global $dbh;

			$sql = "SELECT file_id
				FROM 
					files 
				WHERE name = " . returnQuotedString(sqlSanitize($_name, $dbh)) . "
					AND project_id = " . returnQuotedString(sqlSanitize($_project_id, $dbh)) . "	
					AND version = '" . sqlSanitize($_version, $dbh) . "'";

			$result = mysqli_query($dbh, $sql);
			if($result && mysqli_num_rows($result) > 0) {
				$myrow = mysqli_fetch_assoc($result);
				$rValue = $myrow['file_id'];
			}
		}
		return $rValue;
	}
	
	function parseProperties($_content) {
		$rValue = "";
		if($_content != "") {
			
			global $User;

			# find all current active strings for this properties file
			global $dbh;
			$strings = array();
			$sql = "SELECT * from strings WHERE is_active = 1 AND file_id = $this->file_id";
			$rs_strings = mysqli_query($dbh, $sql);
			while ($myrow_strings = mysqli_fetch_assoc($rs_strings)) {
			  $string = new String();
			  $string->string_id = $myrow_strings['string_id'];
			  $string->file_id = $myrow_strings['file_id'];
			  $string->name = $myrow_strings['name'];
			  $string->value = $myrow_strings['value'];
			  $string->userid = $myrow_strings['userid'];
			  $string->created_on = $myrow_strings['created_on'];
			  $string->is_active = $myrow_strings['is_active'];
			  $strings[$string->string_id] = $string;
			}

			# import existing strings, $String->save() will deal with merges
			$previous_line 	= "";
			$lines 			= explode("\n", $_content);
			$non_translatable = FALSE;
			foreach($lines as $line) {
				if(strlen($line) > 0 && $line[0] != "!" && $line[0] != ";") {
					# Bug 235553 - don't trim the space at the end of a line!
					# $line = trim($line);
					
					if($line[0] == "#") {
						$tokens = preg_split("/[\s]+/", $line);
						if (sizeof($tokens) > 2 && $tokens[2] == "NON-TRANSLATABLE") {
							if($tokens[1] == "START")
								$non_translatable = TRUE;
							elseif($tokens[1] == "END")
								$non_translatable = FALSE;
						}
					}
					elseif($non_translatable == FALSE) {
						# Does line end with a \ ?
						if(preg_match("/\\\\$/", $line)) {
							# Line ends with \
							
							# strip the backslash
							$previous_line .= $line . "\n";
						}
						else {
							if($previous_line != "") {
								$line 			= $previous_line . $line;
								$previous_line 	= "";
							}
	
							$tags = explode("=", $line, 2);
							if(count($tags) > 1) {
								if($rValue != "") {
									$rValue .= ",";
								}
								$tags[0] = trim($tags[0]);
								# Bug 235553 - don't trim the space at the end of a line!
								# Bug 258749 - use ltrim() to remove spaces at the beginning of value string
								$tags[1] = ltrim($tags[1]);
								
								$rValue .= $tags[0];
								
								$String = new String();
								$String->file_id 	= $this->file_id;
								$String->name 		= $tags[0];
								$String->value 		= $tags[1];
								$String->userid 	= $User->userid;
								$String->created_on = getCURDATE();
								$String->is_active 	= 1;
								$String->save();

								# remove the string from the list
								unset($strings[$String->string_id]);
							}
						}
					}
				}
			}

			# remove strings that are no longer in the properties file
			foreach ($strings as $string) {
			  $string->is_active = 0;
			  if (!$string->save()) {
			    echo "***ERROR: Cannot deactivate string $string->name in file $string->file_id\n";
			  }
			}
		}
		return $rValue;
	}

	function parseJs($_content) {
		if($_content != "") {
			
			global $User;

			# find all current active strings for this properties file
			global $dbh;
			$strings = array();
			$sql = "SELECT * from strings WHERE is_active = 1 AND file_id = $this->file_id";
			$rs_strings = mysqli_query($dbh, $sql);
			while ($myrow_strings = mysqli_fetch_assoc($rs_strings)) {
			  $string = new String();
			  $string->string_id = $myrow_strings['string_id'];
			  $string->file_id = $myrow_strings['file_id'];
			  $string->name = $myrow_strings['name'];
			  $string->value = $myrow_strings['value'];
			  $string->userid = $myrow_strings['userid'];
			  $string->created_on = $myrow_strings['created_on'];
			  $string->is_active = $myrow_strings['is_active'];
			  $strings[$string->string_id] = $string;
			}

			# import existing strings, $String->save() will deal with merges
			$file_contents = preg_replace("/NON-NLS-(.*)/", "", $_content);
			$file_contents = preg_replace("/\\/\\/\\$/", "", $file_contents);
			$file_contents = preg_replace("/((.*?(\n))+.*?)define\(/", "define(", $file_contents);
			$file_contents = preg_replace("/define\(((.*?(\n))+.*?)\)\;/", "$1", $file_contents);
			$jsons = new Services_JSON();
			$lines = $jsons->decode($file_contents);
			foreach($lines as $key => $value) {
				# escape newlines and tabs
				$value = preg_replace("/\\n/", "\\\\n", $value);
				$value = preg_replace("/\\t/", "\\\\t", $value);

				$String = new String();
				$String->file_id 	= $this->file_id;
				$String->name 		= $key;
				$String->value 		= $value;
				$String->userid 	= $User->userid;
				$String->created_on = getCURDATE();
				$String->is_active 	= 1;
				$String->saveJs();

				# remove the string from the list
				unset($strings[$String->string_id]);
			}

			# remove strings that are no longer in the properties file
			foreach ($strings as $string) {
			  $string->is_active = 0;
			  if (!$string->saveJs()) {
			    echo "***ERROR: Cannot deactivate string $string->name in file $string->file_id\n";
			  }
			}
		}
	}

	/**
	 * Returns the fragment relative path.
	 */
	function findFragmentRelativePath() {
		# strip useless CVS structure before the plugin name (bug 221675 c14):
		$pattern = '/^([a-zA-Z0-9\/_-])+\/([a-zA-Z0-9_-]+)\.([a-zA-Z0-9_-]+)(.*)\.properties$/i';
		$replace = '${2}.${3}${4}.properties';
		$path = preg_replace($pattern, $replace, $this->name);
		
		# strip source folder (bug 221675) (org.eclipse.plugin/source_folder/org/eclipse/plugin)
		$pattern = '/^([a-zA-Z0-9_-]+)\.([a-zA-Z0-9_-]+)\.([a-zA-Z0-9\._-]+)(.*)\/(\1)([\.\/])(\2)([\.\/])(.*)\.properties$/i';
		$replace = '${1}.${2}.${3}/${5}${6}${7}${8}${9}.properties';
		$path = preg_replace($pattern, $replace, $path);
		
		return $path;
	}
	
	/*
	 * Convert the filename to *_lang.properties, e.g., foo_fr.properties
	*/
	function appendLangCode($language_iso, $filename = null) {
		if (!$filename) {
			$filename = $this->findFragmentRelativePath();
		}
		if (preg_match( "/^(.*)\.properties$/", $filename, $matches)) {
			$filename = $matches[1] . '_' . $language_iso . '.properties';
		}
		return $filename;
	}
	
	/**
	 * returns a hash that contains a mapping from the translation keys to the translation values.
	 */
	function strings4PropertiesFile($language) {
		$result = array();
		if (strcmp($language->iso, "en_AA") == 0) {
			$sql = "SELECT string_id, name, value FROM strings WHERE file_id = " . $this->file_id .
			" AND is_active AND non_translatable = 0";
			$strings_result = mysqli_query($dbh, $sql);
			while (($strings_row = mysqli_fetch_assoc($strings_result)) != null) {
				$result[$strings_row['name']] = $this->project_id . $strings_row['string_id'] . ":" . $strings_row['value'];
			}
		} else {
			$sql = "SELECT
				strings.name AS 'key', 
				strings.value AS orig, 
				translations.value AS trans
				FROM strings, translations
				WHERE strings.string_id = translations.string_id
				AND strings.file_id = " . $this->file_id . "
				AND strings.is_active
				AND strings.non_translatable = 0
				AND translations.language_id = " . $language->id . "
				AND translations.is_active";
			$strings_result = mysqli_query($dbh, $sql);
			while (($strings_row = mysqli_fetch_assoc($strings_result)) != null) {
				$result[$strings_row['key']] = $strings_row['trans'];
			}
		}
		return $result;
	}
}
?>
