<?php
/**
 * Copyright (c) 2006, 2018 Eclipse Foundation.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *   Wayne Beaton (Eclipse Foundation)- initial API and implementation
 *   Eric Poirier (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */
?>

<div id="midcolumn">
  <h1><?php print $pageTitle ?></h1>
  <p>
    The Usage Data Collector (UDC) is included in the packages available for download from the
    <a href="/downloads">Eclipse Downloads page</a>. The UDC collects information about how individuals are using the
    Eclipse platform. This information is periodically uploaded to servers hosted by The Eclipse
    Foundation. The intent is to use this data to help committers and organizations better
    understand how developers are using Eclipse.
  </p>
  <h4>Targeted Users of the Data:</h4>
  <ul>
    <li>Users of Eclipse</li>
    <li>Committers working on Eclipse projects</li>
    <li>ISVs and organizations creating Eclipse based software</li>
    <li>Enterprise IT departments that make extensive use of Eclipse technology</li>
    <li>Academic researchers who want to study how developers work</li>
  </ul>
  <h4>Data Collected</h4>
  <p>Captured data is associated with a user through a combination of workstation and workspace ids
    that are automatically generated by the collector. This identification is not tied to any
    personal information about the user.</p>
  <p>The usage data monitors what is being used and when (timestamp), including:</p>
  <ol>
    <li>Loaded bundles</li>
    <li>Commands accessed via keyboard shortcuts</li>
    <li>Actions invoked via menus or toolbars</li>
    <li>Perspective changes</li>
    <li>View usage</li>
    <li>Editor usage</li>
  </ol>
  <p>Where possible, the UDC also captures the symbolic name and version of the bundle contributing
    the command/action/perspective/view/editor.</p>
  <p>The UDC also captures some basic information about the runtime environment:</p>
  <ul>
    <li>Operating System</li>
    <li>System Architecture</li>
    <li>Window System</li>
    <li>Locale</li>
    <li>Number of processors available</li>
    <li>And a number of system properties:
      <ul>
        <li>java.runtime.name</li>
        <li>java.runtime.version</li>
        <li>java.specification.name</li>
        <li>java.specification.vendor</li>
        <li>java.specification.version</li>
        <li>java.vendor</li>
        <li>java.version</li>
        <li>java.vm.info</li>
        <li>java.vm.name</li>
        <li>java.vm.specification.name</li>
        <li>java.vm.specification.vendor</li>
        <li>java.vm.specification.version</li>
        <li>java.vm.vendor</li>
        <li>java.vm.version</li>
      </ul>
    </li>
  </ul>
  <p>Note that none of these properties contain file paths or anything of a personal nature.</p>
  <p>
    Please review the <a href="terms.php">Terms of Use</a>.
  </p>
</div>
<?php include "rightcol.php"; ?>

