<?php
/*******************************************************************************
 * Copyright (c) 2010, 2017 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v2.0
 * which available at http://www.eclipse.org/legal/epl-2.0
 *******************************************************************************/

require_once(dirname(__FILE__) . "/../../eclipse.org-common/system/app.class.php");
require_once(dirname(__FILE__) . "/../../eclipse.org-common/system/nav.class.php");
require_once(dirname(__FILE__) . "/../../eclipse.org-common/system/menu.class.php");

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

$App = new App();
$Nav = new Nav();
$Menu = new Menu();

mustBeCommitter();

include($App->getProjectCommon());

// Preload all of the active projects to speed things up a bit.
$projects = Project::getActiveProjects();

function getProjectLink($id) {
 global $projects;

 if (isset($projects[$id])) {
  $project = $projects[$id];
  $url = $project->getUrl();
  $name = $project->getFormalName();
 } else {
  $url = "https://projects.eclipse.org/projects/{$id}";
  $name = $id;
 }

 return "<a href=\"{$url}\">{$name}</a>";
}

$ipzilla = IPZilla::getInstance();

function display_cq($cq) {
  if (!$cq->isApproved()) return;
  echo "<div class=\"cq\">";
  if ($cq->isProjectCode()) {
   $icon = 'eclipse.gif';
   $title = 'An EPL-licensed contribution to an Eclipse project';
  } elseif ($cq->isThirdParty()) {
   $icon = 'library.png';
   $title = 'A third-party library';
  } else {
   return;
  }

  $description = htmlentities($cq->getDescription());
  $name = htmlentities($cq->getName());
  $version = htmlentities($cq->getVersion());

  $header = $name;
  if ($version) $header = "$header $version";

  echo "<h4 id=\"{$cq->getId()}\"><img src=\"/projects/images/$icon\" title=\"$title\"></img>
   <a href=\"https://dev.eclipse.org/ipzilla/show_bug.cgi?id={$cq->getId()}\">CQ&nbsp;{$cq->getId()}</a>
   $header</h4><p>$description<p>";
  echo "<div class=\"cq-info\">";

  echo "<p>Name: {$cq->getName()}</p>";
  echo "<p>Version: {$cq->getVersion()}</p>";
  echo "<p>Due Diligence Type: {$cq->getDueDiligenceType()}</p>";
  echo "<p>Keywords: {$cq->getKeywords()}</p>";
  echo "<p>License(s): {$cq->getLicenses()}</p>";
  echo "<p>SPDX: {$cq->getSPDX()}</p>";

  $link = getProjectLink($cq->getProjectId());
  echo "<p>Created by: {$link}</p>";

  displayPiggybacks($cq);
  displayFilePatterns($cq);
  displayMavenPatterns($cq);
  displayRelated($cq);

  echo "</div>";
  echo "</div>";
}

function displayFilePatterns($cq) {
 if ($cq->getFilePatterns()) {
  echo "<p>File patterns:</p>";
  echo "<ul>";
  foreach($cq->getFilePatterns() as $pattern => $regex) {
   echo "<li>$pattern</li>";
  }
  echo "</ul>";
 }
}

function displayMavenPatterns($cq) {
 if ($patterns = $cq->getMvnPatterns()) {
  echo "<p>Maven patterns:</p>";
  echo "<ul>";
  foreach($patterns as $pattern) {
   echo "<li>$pattern</li>";
  }
  echo "</ul>";
 }
}

function displayPiggybacks($cq) {
 if ($piggybacks = $cq->getPiggybacks()) {
  echo "<p>Also used by:</p>";
  echo "<ul>";
  foreach($piggybacks as $piggyback) {
   $link = getProjectLink($piggyback->getProjectId());
   echo "<li>{$link} (<a href=\"https://dev.eclipse.org/ipzilla/show_bug.cgi?id={$piggyback->getId()}\">{$piggyback->getId()}</a>)</li>";
  }
  echo "</ul>";
 }
}

function displayRelated($cq) {
 if ($related = $cq->getRelatedCqs()) {
  usort($related, 'compareCqsBySemanticVersion');
  echo "<p>See also:</p>";
  echo "<ul>";
  foreach($related as $each){
   echo "<li><a href=\"#{$each->getId()}\">{$each->getId()}</a> {$each->getName()} {$each->getVersion()}</li>";
  }
  echo "</ul>";
 }
}

function compareCqsBySemanticVersion($a, $b) {
 return compareSemanticVersion($a->getVersion(), $b->getVersion());
}

ob_start();

$pageKeywords = "";
$pageTitle = "An Overview of Contribution Questionnaires";
$pageAuthor = "Wayne Beaton";
?>

<div id="midcolumn">
<div class="homeitem">
<h1><?= $pageTitle ?></h1>

<p>This page display information about contribution questionnaires (CQs),
including the hierarchical relationship of the various &quot;piggy-back&quot;.
Where known, the file patterns for any JAR'd bundles associated with
the CQs are indicated.</p>

<style>
.cq table {border-width:0;margin-top:1em;margin-bottom:5px}
.cq tr {vertical-align:top}
.cq p {margin:0}
.cq-info {margin-left:2em}
.cq-info p ul {margin-top:0px;margin-bottom:}
.cq-info li {margin:0}
</style>


<?php

$ipzilla->rootCqsDo(function($cq) {
 display_cq($cq);
});

?>

</div>
</div>

<?php
$html = ob_get_contents();
ob_end_clean();
$App->generatePage($theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html);
?>