<?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 ();
$Nav = NULL;
$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>
  <h2>What's this all about?</h2>
  <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 global-links.html";

$html = ob_get_contents ();
ob_end_clean ();

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