<commit_before>/*
 * Copyright (c) 2014 <NAME> (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    <NAME> - initial API and implementation
 */
package org.eclipse.oomph.setup.doc;

import org.eclipse.oomph.setup.CatalogSelection;
import org.eclipse.oomph.setup.LocationCatalog;
import org.eclipse.oomph.setup.ProductVersion;
import org.eclipse.oomph.setup.ScopeType;
import org.eclipse.oomph.setup.SetupTask;
import org.eclipse.oomph.setup.doc.Everything.Infrastructure.Index;
import org.eclipse.oomph.setup.doc.Everything.Scope.Installation;
import org.eclipse.oomph.setup.doc.Everything.Scope.ProductCatalog;
import org.eclipse.oomph.setup.doc.Everything.Scope.ProductCatalog.Product;
import org.eclipse.oomph.setup.doc.Everything.Scope.ProductCatalog.Product.Version;
import org.eclipse.oomph.setup.doc.Everything.Scope.ProjectCatalog;
import org.eclipse.oomph.setup.doc.Everything.Scope.ProjectCatalog.Project;
import org.eclipse.oomph.setup.doc.Everything.Scope.ProjectCatalog.Project.Stream;
import org.eclipse.oomph.setup.doc.Everything.Scope.User;
import org.eclipse.oomph.setup.doc.Everything.Scope.Workspace;
import org.eclipse.oomph.setup.doc.Everything.SetupResource.CatalogSelectionResource;
import org.eclipse.oomph.setup.doc.Everything.SetupResource.IndexResource.ProductCatalogResource;
import org.eclipse.oomph.setup.doc.Everything.SetupResource.IndexResource.ProjectCatalogResource;
import org.eclipse.oomph.setup.doc.Everything.SetupResource.IndexResource.ProjectCatalogResource.ProjectResource;
import org.eclipse.oomph.setup.doc.Everything.SetupResource.InstallationResource;
import org.eclipse.oomph.setup.doc.Everything.SetupResource.LocationResource;
import org.eclipse.oomph.setup.doc.Everything.SetupResource.WorkspaceResource;
import org.eclipse.oomph.setup.doc.Everything.SetupWizard.ConfirmationPage;
import org.eclipse.oomph.setup.doc.Everything.SetupWizard.ExecutionWizard;
import org.eclipse.oomph.setup.doc.Everything.SetupWizard.InstallerWizard;
import org.eclipse.oomph.setup.doc.Everything.SetupWizard.ProductPage;
import org.eclipse.oomph.setup.doc.Everything.SetupWizard.ProjectPage;
import org.eclipse.oomph.setup.doc.Everything.SetupWizard.ProjectWizard;
import org.eclipse.oomph.setup.doc.Everything.SetupWizard.PromptPage;
import org.eclipse.oomph.setup.doc.Everything.Task.Compound;
import org.eclipse.oomph.setup.doc.Everything.Task.P2;
import org.eclipse.oomph.setup.doc.Everything.Task.Targlet;
import org.eclipse.oomph.setup.doc.Everything.Task.Trigger;
import org.eclipse.oomph.setup.doc.Everything.Task.Variable;
import org.eclipse.oomph.setup.doc.Everything.TaskComposition.ScopeList;
import org.eclipse.oomph.setup.doc.Everything.TaskComposition.TaskList.Consolidation;
import org.eclipse.oomph.setup.doc.Everything.TaskComposition.TaskList.Filter;
import org.eclipse.oomph.setup.doc.Everything.TaskComposition.TaskList.InitialPhase;
import org.eclipse.oomph.setup.doc.Everything.TaskComposition.TaskList.Reorder;

/**
 * Outline
 *
 *<p>
 * Consider the steps involved in setting up a fresh Eclipse development environment to work with the source code of a particular version of a specific project:
 * <ul>
 * <li>
 * Install a project-specific IDE with appropriate tooling,
 * i.e., an IDE configured with all the settings and tools needed for editing, compiling, debugging, and testing the project's artifacts.
 * </li>
 * <li>
 * Materialize the workspace with the project's bundles and features by importing their workspace projects from various source code repositories,
 * organizing those workspace projects into meaningful working sets.
 * </li>
 * <li>
 * Materialize the target platform to contain all the bundles and features needed to compile the project's source code, run the project's tests, and exercise the project's end-user functionality.
 * </li>
 * </ul>
 *
 * The instructions for all these steps must be well-documented and generally evolve from release to release.
 * As such, one should consider the following salient questions:
 * <ul>
 * <li>
 * Who writes and maintains these instructions?
 * </li>
 * <li>
 * How do contributors find these instructions for each specific project?
 * </li>
 * <li>
 * How many contributors must follow these instructions, how often, and with how much invested time?
 * </li>
 * </ul>
 * The most fundamental question is, why is anyone doing this manually?
 * The overall process is tedious, error-prone, and time consuming,
 * i.e., it's a complete waste of human resource.
 * With Oomph, all these instructions are formalized as setup {@linkplain Task tasks} that are {@linkplain TaskExecution performed} automatically.
 * </p>
 * <p>
 * In addition to the project-specific setup process,
 * each user typically has her own personal favorite tools she wants installed
 * as well as has her own personal preferences,
 * such as key bindings,
 * she wants uniformly applied to each installation and workspace.
 * With Oomph Setup, this too is formalized and automated.
 * </p>
 *
 * <p>
 * The process of setting up a development environment involves two phases.
 * The first, or bootstrap phase, involves installing a functional product on disk.
 * Using the traditional manual approach one achieves this goal by as follows:
 * <ul>
 * <li>
 * Download a product, i.e., a package, from Eclipse's download page.
 * </li>
 * <li>
 * Unzip that download to the desired location on disk using an unzip tool that can handle Eclipse's zip files.
 * </li>
 * <li>
 * Ensure that a bit-appropriate JRE version is installed and visible on the execution path.
 * </li>
 * <li>
 * Run the executable.
 * </li>
 * </ul>
 * </p>
 * <p>
 * The second phase involves activities performed in the running product itself:
 * <ul>
 * <li>
 * Install additional tools not included in the downloaded product.
 * </li>
 * <li>
 * Configure various preferences appropriately, ideally by importing those preferences from a carefully-crafted Eclipse preference file.
 * </li>
 * <li>
 * Import workspace projects, ideally by importing those projects from a carefully-crafted project set file.
 * </li>
 * <li>
 * Activate the required target platform, ideally by activating a carefully-crafted target platform description file.
 * </li>
 * </ul>
 * </p>
 * <p>
 * To automate this setup process, Oomph provides the following:
 * <ul>
 * <li>
 * An {@linkplain InstallerWizard installer wizard} that automates the both phases of setting up a development environment.
 * </li>
 * <li>
 * A {@linkplain ProjectWizard project wizard} that automates the second phase of setting up a development environment.
 * <li>
 * An {@linkplain ProjectWizard execution wizard} that automates updating the development environment,
 * including the provisioning of personal favorite tools and personal preferences.
 * </li>
 * </ul>
 * Oomph helps ensure that each developer works with the same uniformly-provisioned development environment
 * and that each user has her personal tools and preferences uniformly available across all installations and workspaces.
 * Note that Oomph can be installed into an existing IDE, i.e., one not installed by Oomph,
 * via Oomph's <a rel="nofollow" href="http://download.eclipse.org/oomph/updates">update site</a>
 * or via Oomph's <a rel="nofollow" href="http://download.eclipse.org/oomph/updates/org.eclipse.oomph.site.zip">site archive</a>.</p>
 * </p>
 * <p>
 * To understand how best to exploit Oomph in order to save time and spare aggravation,
 * some basic concepts need to be well understood.
 * Automation is achieved by specifying setup {@linkplain Task tasks} organized into {@linkplain Scope scopes} stored in {@linkplain SetupResource resources}.
 * </p>
 * <p>
 * An important footnote is that Oomph makes heavy use of {@link BundlePool bundle pooling}
 * so it highly disk-space efficient to install many products and provision many target platforms
 * because they can all share a common bundle pool such that for each installable unit, there is only on jar file on disk.
 * Not only is this space efficient,
 * it also dramatically improves installation and provisioning performance
 * because once an installable unit is in the pool,
 * it never again needs to be downloaded from the Internet.
 * </p>
 * <p>
 * Here is the setup model:
 * {@link #setupModel()}
 * </p>
 *
 * @number 2
 */
public abstract class Everything
{
  /**
   * @snippet tree org.eclipse.setup.tree http://git.eclipse.org/c/oomph/org.eclipse.oomph.git/plain/setups/org.eclipse.setup
   * @title org.eclipse.setup
   */
  protected abstract void index();

  /**
   * @snippet tree Setup.genmodel.tree /org.eclipse.oomph.setup/model/Setup.genmodel
   * @title Setup.genmodel
   */
  protected abstract void setupModel();

  /**
   * Tasks
   * <p>
   * A setup {@link SetupTask task} is the fine-grained unit of work in the overall setup process.
   * A task is declarative in nature,
   * i.e., it describes what needs to be achieved rather than how it's achieved.<commit_msg>[444714] Author help center documentation for Oomph Setup<commit_after>/*
 * Copyright (c) 2014 <NAME> (Berlin, Germany) and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    <NAME> - initial API and implementation
 */
package org.eclipse.oomph.setup.doc;

import org.eclipse.oomph.setup.CatalogSelection;
import org.eclipse.oomph.setup.LocationCatalog;
import org.eclipse.oomph.setup.ProductVersion;
import org.eclipse.oomph.setup.ScopeType;
import org.eclipse.oomph.setup.SetupTask;
import org.eclipse.oomph.setup.doc.Everything.Infrastructure.Index;
import org.eclipse.oomph.setup.doc.Everything.Scope.Installation;
import org.eclipse.oomph.setup.doc.Everything.Scope.ProductCatalog;
import org.eclipse.oomph.setup.doc.Everything.Scope.ProductCatalog.Product;
import org.eclipse.oomph.setup.doc.Everything.Scope.ProductCatalog.Product.Version;
import org.eclipse.oomph.setup.doc.Everything.Scope.ProjectCatalog;
import org.eclipse.oomph.setup.doc.Everything.Scope.ProjectCatalog.Project;
import org.eclipse.oomph.setup.doc.Everything.Scope.ProjectCatalog.Project.Stream;
import org.eclipse.oomph.setup.doc.Everything.Scope.User;
import org.eclipse.oomph.setup.doc.Everything.Scope.Workspace;
import org.eclipse.oomph.setup.doc.Everything.SetupResource.CatalogSelectionResource;
import org.eclipse.oomph.setup.doc.Everything.SetupResource.IndexResource.ProductCatalogResource;
import org.eclipse.oomph.setup.doc.Everything.SetupResource.IndexResource.ProjectCatalogResource;
import org.eclipse.oomph.setup.doc.Everything.SetupResource.IndexResource.ProjectCatalogResource.ProjectResource;
import org.eclipse.oomph.setup.doc.Everything.SetupResource.InstallationResource;
import org.eclipse.oomph.setup.doc.Everything.SetupResource.LocationResource;
import org.eclipse.oomph.setup.doc.Everything.SetupResource.WorkspaceResource;
import org.eclipse.oomph.setup.doc.Everything.SetupWizard.ConfirmationPage;
import org.eclipse.oomph.setup.doc.Everything.SetupWizard.ExecutionWizard;
import org.eclipse.oomph.setup.doc.Everything.SetupWizard.InstallerWizard;
import org.eclipse.oomph.setup.doc.Everything.SetupWizard.ProductPage;
import org.eclipse.oomph.setup.doc.Everything.SetupWizard.ProjectPage;
import org.eclipse.oomph.setup.doc.Everything.SetupWizard.ProjectWizard;
import org.eclipse.oomph.setup.doc.Everything.SetupWizard.PromptPage;
import org.eclipse.oomph.setup.doc.Everything.Task.Compound;
import org.eclipse.oomph.setup.doc.Everything.Task.P2;
import org.eclipse.oomph.setup.doc.Everything.Task.Targlet;
import org.eclipse.oomph.setup.doc.Everything.Task.Trigger;
import org.eclipse.oomph.setup.doc.Everything.Task.Variable;
import org.eclipse.oomph.setup.doc.Everything.TaskComposition.ScopeList;
import org.eclipse.oomph.setup.doc.Everything.TaskComposition.TaskList.Consolidation;
import org.eclipse.oomph.setup.doc.Everything.TaskComposition.TaskList.Filter;
import org.eclipse.oomph.setup.doc.Everything.TaskComposition.TaskList.InitialPhase;
import org.eclipse.oomph.setup.doc.Everything.TaskComposition.TaskList.Reorder;

/**
 * Outline
 *
 *<p>
 * Consider the steps involved in setting up a fresh Eclipse development environment to work with the source code of a particular version of a specific project:
 * <ul>
 * <li>
 * Install a project-specific IDE with appropriate tooling,
 * i.e., an IDE configured with all the settings and tools needed for editing, compiling, debugging, and testing the project's artifacts.
 * </li>
 * <li>
 * Materialize the workspace with the project's bundles and features by importing their workspace projects from various source code repositories,
 * organizing those workspace projects into meaningful working sets.
 * </li>
 * <li>
 * Materialize the target platform to contain all the bundles and features needed to compile the project's source code, run the project's tests, and exercise the project's end-user functionality.
 * </li>
 * </ul>
 *
 * The instructions for all these steps must be well-documented and generally evolve from release to release.
 * As such, one should consider the following salient questions:
 * <ul>
 * <li>
 * Who writes and maintains these instructions?
 * </li>
 * <li>
 * How do contributors find these instructions for each specific project?
 * </li>
 * <li>
 * How many contributors must follow these instructions, how often, and with how much invested time?
 * </li>
 * </ul>
 * The most fundamental question is, why is anyone doing this manually?
 * The overall process is tedious, error-prone, and time consuming,
 * i.e., it's a complete waste of human resource.
 * With Oomph, all these instructions are formalized as setup {@linkplain Task tasks} that are {@linkplain TaskExecution performed} automatically.
 * </p>
 * <p>
 * In addition to the project-specific setup process,
 * each user typically has her own personal favorite tools she wants installed
 * as well as has her own personal preferences,
 * such as key bindings,
 * she wants uniformly applied to each installation and workspace.
 * With Oomph Setup, this too is formalized and automated.
 * </p>
 *
 * <p>
 * The process of setting up a development environment involves two phases.
 * The first, or bootstrap phase, involves installing a functional product on disk.
 * Using the traditional manual approach one achieves this goal by as follows:
 * <ul>
 * <li>
 * Download a product, i.e., a package, from Eclipse's download page.
 * </li>
 * <li>
 * Unzip that download to the desired location on disk using an unzip tool that can handle Eclipse's zip files.
 * </li>
 * <li>
 * Ensure that a bit-appropriate JRE version is installed and visible on the execution path.
 * </li>
 * <li>
 * Run the executable.
 * </li>
 * </ul>
 * </p>
 * <p>
 * The second phase involves activities performed in the running product itself:
 * <ul>
 * <li>
 * Install additional tools not included in the downloaded product.
 * </li>
 * <li>
 * Configure various preferences appropriately, ideally by importing those preferences from a carefully-crafted Eclipse preference file.
 * </li>
 * <li>
 * Import workspace projects, ideally by importing those projects from a carefully-crafted project set file.
 * </li>
 * <li>
 * Activate the required target platform, ideally by activating a carefully-crafted target platform description file.
 * </li>
 * </ul>
 * </p>
 * <p>
 * To automate this setup process, Oomph provides the following:
 * <ul>
 * <li>
 * An {@linkplain InstallerWizard installer wizard} that automates the both phases of setting up a development environment.
 * </li>
 * <li>
 * A {@linkplain ProjectWizard project wizard} that automates the second phase of setting up a development environment.
 * <li>
 * An {@linkplain ProjectWizard execution wizard} that automates updating the development environment,
 * including the provisioning of personal favorite tools and personal preferences.
 * </li>
 * </ul>
 * Oomph helps ensure that each developer works with the same uniformly-provisioned development environment
 * and that each user has her personal tools and preferences uniformly available across all installations and workspaces.
 * Note that Oomph can be installed into an existing IDE, i.e., one not installed by Oomph,
 * via Oomph's <a rel="nofollow" href="http://download.eclipse.org/oomph/updates">update site</a>
 * or via Oomph's <a rel="nofollow" href="http://download.eclipse.org/oomph/updates/org.eclipse.oomph.site.zip">site archive</a>.</p>
 * </p>
 * <p>
 * To understand how best to exploit Oomph in order to save time and spare aggravation,
 * some basic concepts need to be well understood.
 * Automation is achieved by specifying setup {@linkplain Task tasks} organized into {@linkplain Scope scopes} stored in {@linkplain SetupResource resources}.
 * </p>
 * <p>
 * An important footnote is that Oomph makes heavy use of {@link BundlePool bundle pooling}
 * so it highly disk-space efficient to install many products and provision many target platforms
 * because they can all share a common bundle pool such that for each installable unit, there is only on jar file on disk.
 * Not only is this space efficient,
 * it also dramatically improves installation and provisioning performance
 * because once an installable unit is in the pool,
 * it never again needs to be downloaded from the Internet.
 * </p>
 * <p>
 * Here is the setup model:
 * {@link #setupGenModel()}
 * {@link #setupEcoreModel()}
 * {@link #oomphSetup()}
 * {@link #index()}
 * {@link #packageExplorer()}
 * </p>
 *
 * @number 2
 */
public abstract class Everything
{
  /**
   * @snippet tree org.eclipse.setup.tree /setups/org.eclipse.setup
   * @title org.eclipse.setup
   */
  protected abstract void index();

  /**
   * @snippet tree Oomph.setup.tree /setups/Oomph.setup?editor://org.eclipse.oomph.setup.presentation.SetupEditorID/Outline
   * @title Oomph.setup
   */
  protected abstract void oomphSetup();

  /**
   * @snippet tree Setup.genmodel.tree#/org.eclipse.oomph.setup/model/Setup.genmodel#//SetupTask /org.eclipse.oomph.setup/model/Setup.genmodel?editor://org.eclipse.emf.codegen.ecore.genmodel.presentation.GenModelEditorID
   * @title Setup.genmodel
   */
  protected abstract void setupGenModel();

  /**
   * @snippet tree Setup.ecore.tree /org.eclipse.oomph.setup/model/Setup.ecore?editor://org.eclipse.emf.ecore.presentation.EcoreEditorID
   * @title Setup.genmodel
   */
  protected abstract void setupEcoreModel();

  /**
   * @snippet tree PackageExplorer.tree viewer://org.eclipse.jdt.ui.PackageExplorer?/org.eclipse.jdt.core:org.eclipse.jdt.internal.core.JarPackageFragmentRoot/org.eclipse.jdt.core:org.eclipse.jdt.internal.core.ExternalPackageFragmentRoot
   * @title Package Explorer
   */
  protected abstract void packageExplorer();

  /**
   * Tasks
   * <p>
   * A setup {@link SetupTask task} is the fine-grained unit of work in the overall setup process.
   * A task is declarative in nature,
   * i.e., it describes what needs to be achieved rather than how it's achieved.
{'fraction_non_alphanumeric': 0.09837921276048367, 'fraction_numerical': 0.0013377926421404682, 'mean_word_length': 4.565864833906071, 'pattern_counts': {'":': 0, '<': 137, '<?xml version=': 0, '>': 137, 'https://': 0, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 14, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '422912', 'n_tokens_mistral': 5539, 'n_tokens_neox': 5341, 'n_words': 1855}