<?php

ini_set("display_errors", true);
error_reporting (E_ALL);
$serverName = $_SERVER["SERVER_NAME"];
if ("download.eclipse.org" === $serverName) {
  include "dlconfigOnDownloads.php";
} else {
  include "dlconfig.php";
}
$ipouterrors= array();

include $relativePath."/commonFiles/orbitUtilities.php";
// previous page is for "bread crumbs"

# get path to use when resolving relative children repositories
if (isset($_GET['repoPath'])) {
	$targetServer = 'https://download.eclipse.org';
	$rPath = $_GET['repoPath'];
	$repoPath = $targetServer . '/' . $rPath;

	// ... /N20161019150530/repository
	$start = strrpos($rPath, '/', -12);
	$buildlabel = substr($rPath, $start + 1, 15);
} else {
	echo 'Missing repoPath.';
	exit;
}

$buildURL = "";
if (isset($_GET['buildURL'])) {
    $buildURL = $_GET['buildURL'];
}

$displayablezipfilesize="(0M)";
if (isset($_GET['zipFileSize'])) {
    $displayablezipfilesize = $_GET['zipFileSize'];
}

$pageTitle="Orbit Build $buildlabel";

require $relativePath."/commonFiles/DL.header.php.html";

?>

<?php

// detect if on Eclipse download machine and use Eclipse mirror URLs
$pos = strpos(getcwd(),'/tools/orbit/committers/drops/');
if($pos === false) {
  $downloadUrlPrefix = '';
  $downloadWithRedirectUrlPrefix = '';
}
else {
  $downloadUrlPrefix = 'http://www.eclipse.org/downloads/download.php?file=/tools/orbit/committers/drops/' . $buildlabel . '/';
  $downloadWithRedirectUrlPrefix = 'http://www.eclipse.org/downloads/download.php?r=1&file=/tools/orbit/committers/drops/' . $buildlabel . '/';
}

# get repo content
if ( $_SERVER['REQUEST_METHOD'] === 'POST' ) {
        if ( $_SERVER['CONTENT_LENGTH'] > 1000) {
          echo 'Input repository is too large. The input repository should ' .
               'be a composite metadata repository.';
          exit;

        }
        $repoXml = trim(file_get_contents('php://input'));
}

# read composite content
$xmlDoc = new DOMDocument();
if ( isset($repoXml) ) {
        $xmlDoc->loadXML( $repoXml );
} else {
        if(!headers_sent())
                header($_SERVER['SERVER_PROTOCOL'].' 400 Missing Repo Data', true, 400);
        else
                die('Need repo data!');
        exit;
}

$xslContent = file_get_contents( 'repo-index.xsl' );
$xslDoc = new DOMDocument();
$xslDoc->loadXML( $xslContent );

# transform to HTML
$proc = new XSLTProcessor();
$proc->importStylesheet( $xslDoc );

echo "<h1>Orbit Build: $buildlabel</h1>";
echo "<h2>Useful Information</h2>";
echo "<p>In addition to the bundles themselves, the following maps, project sets, and test results are useful for committers and consumers:</p>";

// If a build fails, especially early, many of the following files won't exist.
// So, we don't produce "link" to them. But, we still leave a descriptive line, in case they
// disappear (are not produced) for some other reason, then we'd notice.
// Subsequently decided to put in "marker" file for when build "fails early", so
// for now will skip these files we know won't exist, if we fail early, but
// basic logic (of checking for existence) is still sound.
// Note: the above "directory.txt" file should always exist, as it is
// "raw" map file, retrieved first, and used during the build, so might be
// required to help debugging a failure.

$failedEarlyfile="buildFailedEarly.txt";
if (!file_exists($failedEarlyfile)) {

       $fname="iplog-$buildlabel.html";
       if (file_exists($fname)) {
         echo "<a href=\"$fname\">Bundle IP Log Information</a><br />";
       } else {
         echo "Bundle IP Log Information does not exist. <br />";
       }

       // Caution this "antBuilderOutput" is here twice, once, here, for
       // normal case, and later in "failed early" else case.
       // TODO: there's gotta be a better way.
       $fname=$buildURL;
       if ($fname != "") {
          echo "<a href=\"$fname\">Maven Build Output</a><br />";
       } else {
          echo "Maven Build Output does not exist. <br />";
       }


       $fname="comparator.log";
       if (file_exists($fname)) {
         echo "<a href=\"$fname\">P2 Mirror Comparator Output</a><br />";
       } else {
          echo "P2 Mirror Comparator Output does not exist. <br />";
       }

       // the referenceRepoExists (and Not) file is an indicator file whose contents is the name of the
       // reference repo we tried to use in the build. Elsewhere, we test for mere existence of the repository,
       // and use "fail" icon if it did not exist,
       // but even if it exists, that does not necessarily mean it is the right repository to be using, so we display
       // the name of the repository directory for easy manual inspection (though, is a little redundent with
       // comparator log).
       // note to self: use file_get_contents to reading contents into a string.
       if (file_exists("referenceRepoExists")) {
           echo "<img class=\"cs\" alt=\"Repo exists\" src=\"".$imagePath."/commonFiles/Checkmark.gif\" /> Repo used for comparison during mirroring: ";
           readfile("referenceRepoExists");
               echo "<br />";
       }
       elseif (file_exists("referenceRepoExistsNot")) {
         echo "<img class=\"cs\" alt=\"Repo not found\" src=\"".$imagePath."/commonFiles/Fail.gif\" /> Bad build. Repo to use while mirroring was not found:<br />\n";
               readfile("referenceRepoExistsNot");
               echo "<br />\n";
       }
       else {
              echo "<img class=\"cs\" alt=\"Repo indicator file not found\" src=\"".$imagePath."/commonFiles/Fail.gif\" /><br />\n";
               echo "Repository indicator file not found. Probably a bad build or build script error? Check Ant Build Output.";
               echo "<br />\n";
        }

       $fname="results-$buildlabel.xml";
       if (file_exists($fname)) {
              echo "<a href=\"results-$buildlabel.xml\">\n";
              // the testsFailed.txt file is an intentional indicator (only) file
              if (file_exists("testsFailed.txt")) {
                  echo "<img class=\"cs\" alt=\"Tests Failed\" src=\"".$imagePath."/commonFiles/Fail.gif\" />\n";
              }
              elseif (file_exists("testsOk.txt")) {
                  echo "<img class=\"cs\" alt=\"Tests Passed\" src=\"".$imagePath."/commonFiles/Checkmark.gif\" />\n";
              }
              echo "Test Results</a><br />\n";
       } else {
              echo "Test Results do not exist. <br />\n";
       }

    // We get the list "early" so we have results of IP Log checks at right point in page.
    // $bundleList = getBundleList("./repository/plugins");

    $sizeofiperrors=count($ipouterrors);
    //echo "count: $sizeofiperrors <br />";
    //echo "contents: <br />";
    //dump($ipouterrors);
    if ($sizeofiperrors > 0) {
        // this likely won't have "permission" to write files on web server.
        // we execute the index.php file during "build" to get this file written.
        $filenameerr="testsFailedIPLog.txt";
        $dataerr="";
        foreach ($ipouterrors as $iperrs) {
           $dataerr = $dataerr.$iperrs."<br />\n";
        }
        file_put_contents ($filenameerr, $dataerr);
        //
        echo "<img class=\"cs\" alt=\"Checks Failed\" src=\"".$imagePath."/commonFiles/Fail.gif\" />" . "IP Log XML File Checks: Errors Found: <br />\n";
        foreach ($ipouterrors as $iperrs) {
           echo "<li>".$iperrs."</li>\n";
        }
    } else {
        echo "<img class=\"cs\" alt=\"Checks Ok\" src=\"".$imagePath."/commonFiles/Checkmark.gif\" />" ."IP Log XML File Checks: Ok <br />\n";
    }

    echo "<a href=\"reporeports/\">CBI Repository Analysis Reports</a><br />\n";

    echo "</p>\n";

       $currentPageURLSegments = $repoPath;
       echo "<h2>Orbit Build Repository</h2>\n";
       echo "<p>For HTTP access, a p2 repository for this specific build can be found by adding 'repository' to the end of this download site URL, namely:<br />";
       echo "<a href=\"${currentPageURLSegments}\">${currentPageURLSegments}</a></p>";

if (file_exists("repository/index.xml.gz")) {
       echo "<p>For use with tools such as <a href=\"http://bndtools.org/\">bndtools</a>, an <a href=\"http://www.osgi.org/Main/HomePage\">OSGi</a> repository index file for this specific build can be found by adding 'repository/index.xml.gz' to the end of this download site URL, namely:<br />";
       echo "<a href=\"${currentPageURLSegments}repository/index.xml.gz\">${currentPageURLSegments}repository/index.xml.gz</a></p>";
}


       echo "<h2>Zipped Orbit Build Repository</h2>";
       echo "<p>The following zip file is a compressed-archive version of the above repository, for those that need or desire to have a copy of the whole repository on their local machine:<br />";
       echo "<a href=\"{$downloadUrlPrefix}orbit-buildrepo-$buildlabel.zip\">orbit-buildrepo-$buildlabel.zip</a> (<a href=\"checksum/orbit-buildrepo-$buildlabel.zip.md5\">md5</a>) (<a href=\"checksum/orbit-buildrepo-$buildlabel.zip.sha1\">sha1</a>) $displayablezipfilesize</p>";

} else {
       echo "Build failed early. Check <a href=\"$failedEarlyfile\">short summary</a> or full Ant Build Output.<br />";
       // Caution this "antBuilderOutput" is here twice, once, here, for
       // "failed early" case, and above, for normal case. TODO: there's gotta be a better way.
       $fname="antBuilderOutput.log";
       if (file_exists($fname)) {
          echo "<a href=\"$fname\">Ant Build Output</a><br />";
       } else {
          echo "Ant Build Output does not exist. <br />";
       }
}


$childRepoXmlList = array();
$children = $xmlDoc->getElementsByTagName('child');

$bug506001Loc = 'tools/orbit/bug506001';

foreach ($children as $c) {
  $childLoc = $c->getAttribute('location');
  // ... /N20161019150530/repository
  $start = strrpos($childLoc, '/', -12);
  $childBuildLabel = substr($childLoc, $start + 1, 15);

  $childContent = file_get_contents($targetServer . '/' . $bug506001Loc . '/' . $childBuildLabel . '/' . 'content.xml');
  if (! $childContent) {
    echo 'Could not find ' . $bug506001Loc . '/' . $childBuildLabel . '/' . 'content.xml' . ' on server.';
    exit;
  }

  $childRepoXml = trim($childContent);
  $childRepoXmlList[$childLoc] = $childRepoXml;
}


$nBundles = 0;
$nDistinctBundles = 0;
$nTotalBundles =  0;
$nDistinctCQs = 0;
$listOfCQs = "";

foreach ($childRepoXmlList as $childRepoXml) {
  $childXmlDoc = new DOMDocument();
  $childXmlDoc->loadXML($childRepoXml);
  $xpath = new DOMXpath($childXmlDoc);

  $nBundles += $xpath->evaluate("count(/repository/units/unit[provides/provided/@namespace='org.eclipse.equinox.p2.eclipse.type' and provides/provided/@name='bundle']/@id)");
  $nDistinctBundles += $xpath->evaluate("count(/repository/units/unit[provides/provided/@namespace='org.eclipse.equinox.p2.eclipse.type' and provides/provided/@name='bundle' and not(preceding::unit/@id=../../@id)]/@id)");
  $nTotalBundles += $xpath->evaluate("count(/repository/units/unit[provides/provided/@name='bundle' or provides/provided/@name='source']/@id)");
  $nDistinctCQs += $xpath->evaluate("count(/repository/units/unit/properties/property[@name='iplog.bug_id' and not(preceding::property/@value=@value)])");
  $cqNodeList = $xpath->evaluate("/repository/units/unit/properties/property[@name='iplog.bug_id' and not(preceding::property/@value=@value)]/@value");
  foreach ($cqNodeList as $node) {
    $listOfCQs .= "," . $node->nodeValue;
  }
}

$ipzillaURL = "https://dev.eclipse.org/ipzilla/buglist.cgi?bug_id=" . $listOfCQs;

echo "<h2>Individual Bundles</h2>";

echo "<h3>Statistics</h3>";
echo "<p>Number of distinct third party packages: $nDistinctBundles.<br />";
echo "Number of bundles (including different versions): $nBundles. <br />";
echo "Total number of bundles (including source): $nTotalBundles.";

echo "<h3>CQ Bookkeeping</h3>";
echo "Total number of distinct CQs: $nDistinctCQs. <br />";
echo "IPZilla <a href=\"$ipzillaURL\">list of all CQs</a></p>";
echo "<p>Note: IPZilla is a database for tracking CQs (Contribution Questionnaires) and is only accessible by committers, ";
echo "since in theory they might contain some non-public information. But, don't worry ... if you are not a committer you are not";
echo " missing anything ... they are pretty dry! These (and the links provided here) are just some aides for committers to double check our book-keeping.</p>";

echo "<h3>Table of Bundles</h3>";
echo "<table class=\"table table-striped table-condensed\">";
echo "<tr>";
echo "<th align=\"left\">Bundle</th>";
echo "<th>Source</th>";
echo "<th>Version</th>";
echo "<th>Orbit CQ</th>";
echo "<th>Orbit Contact</th>";
echo "</tr>";

$outHTML = '';
foreach ($childRepoXmlList as $childLoc => $childRepoXml) {
  $proc->setParameter(null, 'repoPath', $repoPath . '/' . $childLoc);
  $childXmlDoc = new DOMDocument();
  $childXmlDoc->loadXML($childRepoXml);
  $html = $proc->transformToXML( $childXmlDoc );
  $outHTML = $outHTML . $html;
}

// Sort the content all together
$sortXslContent = file_get_contents('sort.xsl');
$sortXslDoc = new DOMDocument();
$sortXslDoc->loadXML($sortXslContent);

$outXmlDoc = new DOMDocument();
$outXmlDoc->loadHTML($outHTML);

$sproc = new XSLTProcessor();
$sproc->importStylesheet($sortXslDoc);
$finalHTML = $sproc->transformToXML ($outXmlDoc);
echo "$finalHTML";

echo "</table>";
echo "<p>Note: entries marked with 'unzip' are intented to be unzipped in a normal IDE environment, to work as intended (even though the file to download is a jar file).</p>";

//include $relativePath."/commonFiles/footerSUA.html";
//include $relativePath."/commonFiles/footerWebmaster.html";
require $relativePath."/commonFiles/DL.footer.php.html";

?>
