<?php

require_once ($_SERVER ['DOCUMENT_ROOT'] . "/eclipse.org-common/system/app.class.php");
require_once ($_SERVER ['DOCUMENT_ROOT'] . "/eclipse.org-common/system/nav.class.php");
require_once ($_SERVER ['DOCUMENT_ROOT'] . "/eclipse.org-common/system/menu.class.php");
$App = new App ();
$Nav = new Nav ();
$Menu = new Menu ();
include ($App->getProjectCommon ()); # All on the same line to unclutter the user's desktop'

  #*****************************************************************************
  #
  #
  #****************************************************************************
  
  #
  # Begin: page-specific settings.  Change these. 
  $pageTitle = "Orbit overview";
$pageKeywords = "orbit, bundles, third party, code, equinox, osgi, framework, runtime";

// Add page-specific Nav bars here
// Format is Link text, link URL (can be http://www.someothersite.com/), target (_self, _blank), level (1, 2 or 3)
// $Nav->addNavSeparator("My Page Links", "downloads.php");
// $Nav->addCustomNav("My Link", "mypage.php", "_self", 3);
// $Nav->addCustomNav("Google", "http://www.google.com/", "_blank", 3);

// End: page-specific settings
//

// Paste your HTML content between the markers!
ob_start ();
?>

<div id="midcolumn">
  <h1><?= $pageTitle ?></h1>
  <p class=bar>What's this all about?</p>
  <p>The Orbit project provides a repository of bundled versions of
    third party libraries that are approved for use in one or more
    Eclipse projects. The repository maintains current and old versions
    of such libraries to facilitate current builds as well as the
    rebuilding of historical output. The contents of Orbit are available
    in several different forms (e.g., Update Site, download archives,
    ...). As the Eclipse tooling evolves, developers will be able to
    easily obtain and add supplied bunldes to their workspace or target
    platform.</p>
  <p>One of the key issues with bundling third-party libraries is the
    inconsistency in naming, versioning and form of the resultant
    bundles. Orbit eliminates duplicated work and bundle naming,
    structuring and versioning variations but focusing the bundling
    effort in one project.</p>
  <p>Crucially, no development is carried out in this project. Teams
    proposing the use of a third party library for the first time are
    able to work with the community developed here and other potential
    users of the library to derive an appropriate selection and
    packaging of the function they need. For example, a team may start
    out with &quot;a need for Jetty&quot;. As we have seen, systems like
    Jetty often include several JARs and a wide variety of
    infrastructure pieces (e.g., Apache Commons Logging). In some cases
    this additional function is not needed for the project's use, is
    already approved and available or has special packaging needs.
    Through this project the teams needing function arrive at a mutually
    agreeable form of the required function.</p>
  <p>It is important to note that committers on Orbit are not
    responsible for doing the packaging work. That responsibility
    remains with the teams seeking to use the requested library. In
    short, don't open a bug report requesting that &quot;someone bundle
    Jetty version X&quot;. Open one offering to bundle Jetty version X.
    Orbit acts as a hub or focal point for people with needs related to
    third party libraries and those with related technical expertise.</p>
  <p>The bundled libraries are retained and made available within the
    project in various ways (e.g., download zip, update site, ...) for
    use in the projects that have received the appropriate approvals.
    Note teams seeking to use a library must still follow the IP
    process. For example, the current process calls or all third party
    code use to be cleared by the Foundation. So even if a library is
    approved by the Foundation for use by all projects, project teams
    must still fill out a Contribution Questionnaire (CQ) and notify the
    Foundation of their intentions to use a library. (There is a "reuse
    from Orbit" option, that makes the submission simpler than starting
    from scratch). This allows the library use to be tracked and
    facilitates version synchronization (e.g., stepping up to new
    releases) as well as notification of issues found with approved and
    previously distributed libraries.</p>
  <p>&nbsp;</p>

</div>

<?php
include $_SERVER ['DOCUMENT_ROOT'] . "/orbit/global-links.html";
include "dir-links.html";
?>

<?php
$html = ob_get_contents ();
ob_end_clean ();

// Generate the web page
$App->generatePage ( $theme, $Menu, $Nav, $pageAuthor, $pageKeywords, $pageTitle, $html );
?>
