<?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(mysql_query($sql, $dbh)) {
				if($this->file_id == 0) {
					$this->file_id = mysql_insert_id($dbh);
					$Event->key_value = $this->file_id;
				}
				$rValue = true;
				$Event->add();
			}
			else {
				echo $sql . "\n";
				$GLOBALS['g_ERRSTRS'][1] = mysql_error();
			}
		}
		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 = mysql_query($sql, $dbh);
			if($result && mysql_num_rows($result) > 0) {
				$myrow = mysql_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 = mysql_query($sql, $dbh);
			while ($myrow_strings = mysql_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 = mysql_query($sql, $dbh);
			while ($myrow_strings = mysql_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 = mysql_query($sql);
			while (($strings_row = mysql_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 = mysql_query($sql);
			while (($strings_row = mysql_fetch_assoc($strings_result)) != null) {
				$result[$strings_row['key']] = $strings_row['trans'];
			}
		}
		return $result;
	}
}
?>
