<?php  
/*******************************************************************************
 * Copyright (c) 2008, 2016 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
 *******************************************************************************/

/*
 * This file is deprecated. Calls to this file will redirect to the 
 * corresponding functionality in the PMI when a valid project
 * id is provided, or to the project root otherwise.
 * 
 * The PMI has its own links directly to the generator.
 */

require_once($_SERVER['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
$App = new App();

require_once dirname(__FILE__) . "/classes/Project.class.php";
require_once dirname(__FILE__) . "/classes/common.php";
require_once dirname(__FILE__) . "/classes/debug.php";

/**
 * Iterate through the list of project ids provided and 
 * keep only those ids that map to actual existing projects.
 */
function getProjectIdsFromRequest() {
	if (!$params = split(',', getRawProjectIdsFromRequest())) return null;
	$ids = array();
	foreach($params as $id) {
		if (isValidProjectId($id)) $ids[] = $id;
	}
	return $ids;
}

/**
 * The ids of the projects that we're going to work with can
 * be specified in either the 'id' or 'projectid' parameters.
 * Regardless of which parameter is used, we expect a
 * comma-separated list of project ids.
 */
function getRawProjectIdsFromRequest() {
	if (isset($_REQUEST['id'])) return $_REQUEST['id'];
	if (isset($_REQUEST['projectid'])) return $_REQUEST['projectid'];
	return array();
}

/**
 * Answer the top-most project hierarchically in the list of project ids.
 * Most of the time, this will be exactly one project, but in some cases
 * (e.g. the Eclipse Project) multiples are provided.
 */
function getRootProjectId() {
    $ids = getProjectIdsFromRequest();
    if (count($ids) == 1) return $ids[0];
    
    /**
     * Keep things very simple. Sort the list so that the
     * entry with the smallest number of segments (separated by
     * dots) is the first thing in the list. Assume that the
     * first entry after sorting is the top-most project
     * hierarchically.
     * 
     * FIXME Determine how to deal with top-most siblings.
     * 
     * This is pretty inefficient since we'll end up recomputing
     * values repeatedly. However, this script isn't called
     * very often, the check for a single value will bail us
     * out before we get to this point most of the time, and
     * the inefficiency really isn't that bad given that the
     * size of the array will always be pretty small.
     */
    usort($ids, function($a, $b) {
       $oa = count(preg_split('/./', $a));
       $ob = count(preg_split('/./', $b));
       
       return $oa == $ob ? 0 : ($oa > $ob ? 1 : -1);
    });
    
    return $ids[0];
}

/*
 * Search for the top-most project in the list of project ids.
 * If there is one, then redirect to the PMI instance for IP Log 
 * generation.
 * 
 * Note that we try to find the next release and generate the
 * IP Log based on that (releases may include subprojects and
 * we need to include them). If there is no next release, then
 * just open the IP Log generator on the project itself.
 */
$url = "/projects";
if ($parent = getRootProjectId()) {
    if ($project = get_project_from_pmi($parent)) {
        if ($release = $project->getNextRelease()) {
            $url = $release->getUrl();
        } else {
            $url = $project->getUrl();
        }
        $url = "$url/iplog/preview";
    } 
}
    
header("Location: $url");
exit();

?>
