<?php

ini_set("display_errors", true);
error_reporting (E_ALL);

echo 'Preparing Final Page';
$serverName = $_SERVER["SERVER_NAME"];
if ("download.eclipse.org" === $serverName) {
  include "dlconfigOnDownloads.php";
} else {
  include "dlconfig.php";
}
$ipouterrors= array();

// previous page is for "bread crumbs"

# get path to use when resolving relative children repositories
if (isset($_GET['repoPath'])) {
	$rPath = $_GET['repoPath'];
	$repoPath = 'http://download.eclipse.org/' . $rPath;
	$buildlabel = substr($rPath, strrpos($rPath, '/') + 1);
} else {
	echo 'Missing repoPath.';
	exit;
}

$pageTitle="Orbit Build $buildlabel";

// curPageURL returns URL segments
// http://build.eclipse.org/orbit/projects/                                 ==> http://build.eclipse.org/orbit/projects/
// http://build.eclipse.org/orbit/projects/index.php                        ==> http://build.eclipse.org/orbit/projects/
// http://build.eclipse.org/orbit/projects/index.php?value=name             ==> http://build.eclipse.org/orbit/projects/
// echo "current base URL: " . curPageURL();

//$ipoutfilename=__DIR__."/commonFiles/iplogFileErrors.txt";
//chmod($ipoutfilename, 0666);
//file_put_contents ($ipoutfilename,"");


function curPageURL() {

    $isHTTPS = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on");
    $port = (isset($_SERVER["SERVER_PORT"]) && ((!$isHTTPS && $_SERVER["SERVER_PORT"] != "80") || ($isHTTPS && $_SERVER["SERVER_PORT"] != "443")));
    $port = ($port) ? ':'.$_SERVER["SERVER_PORT"] : '';
    $url = ($isHTTPS ? 'https://' : 'http://').$_SERVER["SERVER_NAME"].$port.$_SERVER["REQUEST_URI"];


    $pattern = "!(^.*/)" . "index\.php(\?.*)*$!";

    $matched = preg_match($pattern, $url, $matches);
    if ($matched)
    {
        $url=$matches[1];
    }
    return $url;

}

// test of curPageURL
// http://build.eclipse.org/orbit/projects/                                 ==> http://build.eclipse.org/orbit/projects/
// http://build.eclipse.org/orbit/projects/index.php                        ==> http://build.eclipse.org/orbit/projects/
// http://build.eclipse.org/orbit/projects/index.php?value=name             ==> http://build.eclipse.org/orbit/projects/
// echo "current base URL: " . curPageURL();


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

?>

<?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 "<p><b>This page is a work in progress.</b></p>";
echo "<p>The repository offered by this build is a composite of the content seen here and the last 'old' R (Recommended) build. The metadata from that build is not yet fully displayed below so to view it please go to <a href=\"http://download.eclipse.org/tools/orbit/downloads/drops/R20160520211859/\">R20160520211859</a>.<p>";

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="antBuilderOutput.log";
       if (file_exists($fname)) {
          echo "<a href=\"$fname\">Ant Build Output</a><br />";
       } else {
          echo "Ant 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=\"".$relativePath."/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=\"".$relativePath."/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=\"".$relativePath."/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=\"".$relativePath."/commonFiles/Fail.gif\" />\n";
              }
              elseif (file_exists("testsOk.txt")) {
                  echo "<img class=\"cs\" alt=\"Tests Passed\" src=\"".$relativePath."/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=\"".$relativePath."/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=\"".$relativePath."/commonFiles/Checkmark.gif\" />" ."IP Log XML File Checks: Ok <br />\n";
    }

    echo "</p>\n";

       $currentPageURLSegments = curPageURL();
       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}repository/\">${currentPageURLSegments}repository/</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>";
}

       $displayablezipfilesize=fileSizeForDisplay("orbit-buildrepo-$buildlabel.zip");

       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');

foreach ($children as $c) {
  $childLoc = $c->getAttribute('location');
  $proc->setParameter(null, 'repoPath', $repoPath . '/' . $childLoc);

  $childContent = file_get_contents($repoPath . '/' . $childLoc . '/' . 'content.jar');
  if (! $childContent) {
    echo 'Could not find ' . $childLoc . '/' . 'content.jar' . ' on server.';
    exit;
  }
  $childRepoFile = tmpfile();
  $ret = fwrite($childRepoFile, $childContent);
  if (! $ret) {
    echo 'Failed to read ' . $childLoc . '/' . 'content.jar';
    exit;
  }
  $childRepoFileData = stream_get_meta_data($childRepoFile);
  $childRepoFileName = $childRepoFileData['uri'];
  $zip = zip_open($childRepoFileName);
  while ($zip_entry = zip_read($zip)) {
    if (zip_entry_name($zip_entry) == 'content.xml' &&
        zip_entry_open($zip, $zip_entry, "r")) {
      $fstream = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));
      zip_entry_close($zip_entry);
    }
  }
  zip_close($zip);
  fclose($childRepoFile);

  $childRepoXml = trim($fstream);
  array_push($childRepoXmlList, $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>";

foreach ($childRepoXmlList as $childRepoXml) {
  $childXmlDoc = new DOMDocument();
  $childXmlDoc->loadXML($childRepoXml);
  $html = $proc->transformToXML( $childXmlDoc );
  echo "$html";
}

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";

?>
