<?php
/*******************************************************************************
 * Copyright (c) 2008-2009 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:
 *    Eclipse Foundation - Initial API and implementation
 *    Kit Lo (IBM) - patch, bug 266010, Map file table does not show release train and file name info
 *    Kit Lo (IBM) - Bug 299402, Extract properties files from Eclipse project update sites for translation
*******************************************************************************/
include("global.php");

InitPage("");

global $User;
global $dbh;

if(!isset($User->userid)) {
	exitTo("importing.php");
}

if($User->is_committer != 1) {
	exitTo("login_oauth.php?errNo=3214","error: 3214 - you must be an Eclipse committer to access this page.");
}

require(dirname(__FILE__) . "/../classes/file/file.class.php");


$pageTitle 		= "Babel - Define Map Files or Update Sites";
$pageKeywords 	= "";
$incfile 		= "content/en_map_files.php";

$PROJECT_ID = getHTTPParameter("project_id");
$VERSION	= getHTTPParameter("version");
$TRAIN_ID 	= getHTTPParameter("train_id");
$FILE_FLD	= getHTTPParameter("fileFld");
$PATTERNS	= getHTTPParameter("patterns");
$FILENAME	= getHTTPParameter("filename");
$SUBMIT 	= getHTTPParameter("submit");

$VERSION = preg_replace("/^\* /", "", $VERSION);

if($SUBMIT == "Save") {
	if($PROJECT_ID != "" && $VERSION != "" && $FILE_FLD != "") {
		# Set URL type
		$is_Map_file = 1;
		if ($_POST["urlType"] == "updateSites") {
			$is_Map_file = 0;
		}

		# Delete old map files for this project version
		$sql = "DELETE FROM map_files WHERE project_id = "
			. returnQuotedString(sqlSanitize($PROJECT_ID, $dbh)) 
			. " AND version = " . returnQuotedString(sqlSanitize($VERSION, $dbh));
		mysqli_query($dbh, $sql);

		# Insert new map files for this project version
		$list = explode("\n", $FILE_FLD);
		foreach ($list as $file) {
			$file = str_replace("\r", "", $file);
			if(strlen($file) > 8) {
				$sql = "INSERT INTO map_files VALUES ("
					. returnQuotedString(sqlSanitize($PROJECT_ID, $dbh))
					. "," . returnQuotedString(sqlSanitize($VERSION, $dbh))
					. "," . returnQuotedString(sqlSanitize(md5($file), $dbh))
					. "," . returnQuotedString(sqlSanitize($file, $dbh))
					. ", 1, $is_Map_file)";
				mysqli_query($dbh, $sql);
			}
		}

		# Delete old plugin exclude patterns for this project version
		$sql = "DELETE FROM plugin_exclude_patterns WHERE project_id = "
			. returnQuotedString(sqlSanitize($PROJECT_ID, $dbh)) 
			. " AND version = " . returnQuotedString(sqlSanitize($VERSION, $dbh));
		mysqli_query($dbh, $sql);

		# Insert new plugin exclude patterns for this project version
		$list = explode("\n", $PATTERNS);
		foreach ($list as $pattern) {
			$pattern = str_replace("\r", "", $pattern);
			if (strlen($pattern) > 0) {
				if (strlen($pattern) > 26 && strcmp(substr($pattern, 0, 26), "No plugin exclude patterns") == 0) {
				} else {
					$sql = "INSERT INTO plugin_exclude_patterns VALUES ("
						. returnQuotedString(sqlSanitize($PROJECT_ID, $dbh))
						. "," . returnQuotedString(sqlSanitize($VERSION, $dbh))
						. "," . returnQuotedString(sqlSanitize($pattern, $dbh)) . ")";
					mysqli_query($dbh, $sql);
				}
			}
		}

		# Save the project/train association
		$sql = "DELETE FROM release_train_projects WHERE project_id = "
			. returnQuotedString(sqlSanitize($PROJECT_ID, $dbh)) 
			. " AND version = " . returnQuotedString(sqlSanitize($VERSION, $dbh));
		mysqli_query($dbh, $sql);
		$sql = "INSERT INTO release_train_projects SET project_id = "
			. returnQuotedString(sqlSanitize($PROJECT_ID, $dbh)) 
			. ", version = " . returnQuotedString(sqlSanitize($VERSION, $dbh))
			. ", train_id = " . returnQuotedString(sqlSanitize($TRAIN_ID, $dbh));
		mysqli_query($dbh, $sql);
		$GLOBALS['g_ERRSTRS'][0] = "Map files saved.";
	}
	else {
		$GLOBALS['g_ERRSTRS'][0] = "Project, version and URL cannot be empty.";  
	}
}
if($SUBMIT == "delete") {
	$SUBMIT = "showfiles";
	$sql = "DELETE FROM map_files WHERE  
	project_id = " . returnQuotedString(sqlSanitize($PROJECT_ID, $dbh)) . "
	AND version = " . returnQuotedString(sqlSanitize($VERSION, $dbh)) . "
	AND filename = ". returnQuotedString(sqlSanitize($FILENAME, $dbh)) . " LIMIT 1";
	mysqli_query($dbh, $sql);
}


$sql = "SELECT project_id FROM projects WHERE is_active = 1 ORDER BY project_id";
$rs_project_list = mysqli_query($dbh, $sql);

$sql = "SELECT pv.project_id, pv.version, count(m.is_active) AS map_count FROM project_versions as pv left join map_files as m on m.project_id = pv.project_id and m.version = pv.version WHERE pv.is_active = 1 and pv.version != 'unspecified' group by pv.project_id, pv.version ORDER BY pv.project_id ASC, pv.version DESC;";
$rs_version_list = mysqli_query($dbh, $sql);

$sql = "SELECT train_id FROM release_trains ORDER BY train_id ASC";
$rs_train_list = mysqli_query($dbh, $sql);

$sql = "SELECT train_id, project_id, version FROM release_train_projects ORDER BY project_id, version ASC";
$rs_train_project_list = mysqli_query($dbh, $sql);

global $addon;
$addon->callHook("head");
include($incfile);
$addon->callHook("footer");

?>
