<?php
/*******************************************************************************
 * Copyright (c) 2009, 2016 Eclipse Foundation 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:
*		Eclipse Foundation - Initial version
*		Anthony Hunter - changes for EMF Query
********************************************************************************/
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();
require_once('_projectCommon.php');

$pageTitle = "Eclipse EMF Query";
$pageKeywords = "Eclipse, Modeling, Framework, EMF, Query, Project";
$pageAuthor = "Anthony Hunter";

# Initialize custom solstice $variables.
$variables = array();

# Add classes to <body>. (String)
$variables['body_classes'] = '';

# Insert custom HTML in the breadcrumb region. (String)
$variables['breadcrumbs_html'] = "";

# Hide the breadcrumbs. (Bool)
$variables['hide_breadcrumbs'] = FALSE;

# Insert HTML before the left nav. (String)
$variables['leftnav_html'] = '';

# Update the main container class (String)
$variables['main_container_classes'] = 'container';

# Insert HTML after opening the main content container, before the left sidebar. (String)
$variables['main_container_html'] = '';

# Insert header navigation for project websites.
$links = array();
$links[] = array(
  'icon' => 'fa-download', // Required
  'url' => 'downloads.php', // Required
  'title' => 'Download', // Required
  'text' => 'Update Sites, P2 Repositories, SDK downloads, Nightly Builds, Translations' // Optional
);

$links[] = array(
  'icon' => 'fa-users', // Required
  'url' => 'getting_involved.php', // Required
  'title' => 'Geting Involved', // Required
  'text' => 'Git, Contributor Mailing List, Wiki, Committers' // Optional
);

$links[] = array(
  'icon' => 'fa-book', // Required
  'url' => 'documentation.php', // Required
  'title' => 'Documentation', // Required
  'text' => 'Online Reference, EMF Wiki' // Optional
);

$links[] = array(
  'icon' => 'fa-support', // Required
  'url' => 'support.php', // Required
  'title' => 'Support', // Required
  'text' => 'EMF Query FAQ, Forum, Newsgroup, Bugzilla' // Optional
);

$variables['header_nav'] = array(
  'links' =>  $links, // Required
  'logo' => array( // Required
    'src' => 'images/backgroundMain.png', // Required
    'alt' => 'EMF Query', // Optional
    'url' => 'http://www.eclipse.org/emf-query', // Optional
  ),
);

// CFA Link - Big orange button in header
$variables['btn_cfa'] = array(
  'hide' => FALSE, // Optional - Hide the CFA button.
  'html' => '', // Optional - Replace CFA html and insert custom HTML.
  'class' => 'btn btn-huge btn-warning', // Optional - Replace class on CFA link.
  'href' => '//www.eclipse.org/downloads/', // Optional - Replace href on CFA link.
  'text' => '<i class="fa fa-download"></i> Download' // Optional - Replace text of CFA link.
);

# Set Solstice theme variables. (Array)
$App->setThemeVariables($variables);

// 	# Paste your HTML content between the EOHTML markers!
$html = <<<EOHTML

<div id="midcolumn">
<h3>Eclipse Modeling Framework (EMF) Model Query</h3>

<div id="introText">

<p>EMF model query facilitates the process of search and retrieval of model elements of interest in a flexible yet controlled and structured manner. Provides API support for the basic EObject based Condition objects that are used to formulate queries for EMF models.</p>
<p>EMF model query provides the following classes/interfaces to support queries.</p>
<p><ol>
	<li>The IEObjectSource interface provides the search scope elements to be used in a query.</li>
	<li>The SELECT class implements a template-function that does the iteration over model elements and applies the search condition on each; it collects the resulting elements into a QueryResultSet object and returns it to the caller.</li>
	<li>The FROM class represents the elements to search. It is responsible of providing an appropriate iterator for the elements in the search space.</li>
	<li>The WHERE class applies the search conditions over the elements in the search set.</li>
	<li>The UPDATE class passes the elements who satisfy the search condition to a caller-supplied modification function. It collects the modified elements into a QueryResultSet object and returns it to the caller.</li>
	<li>The QueryResultSet class represents the set of elements returned by a given query.</li>
	<li>The EObjectCondition class is the abstract parent of all conditions that deal with model-elements (i.e., EObjects). It incorporates the services of a PruneHandler in order to answers whether or not to prune the element tree at a specific element and thus ignore its children.</li>
	<li>The ConditionPolicy class is used to allow the user to decide how to apply a given condition on a collection of a model-element EAttributes or EReferences values. Supports both the: exists (ANY) and for-all (ALL) semantics.</li>
	<li>The EObjectStructuralFeatureValueCondition class is the parent class for conditions that are responsible for checking the values held in model-elements attributes or references.</li>
</ol></p>

</div>

</div>

<div id="rightcolumn">

<div class="sideitem">
<h2>Current Status</h2>
<p>Development is underway for the proposed EMF Query 1.11.0 release for Eclipse Oxygen, due June 2017.</p>
</div>

<div class="sideitem">
<h2>EMF Query 1.10.0 Now Available</h2>
<p><i>June 22, 2016 -</i> EMF Query 1.10.0 for Eclipse Neon has been released. Check the <a href="downloads.php">Download</a> page.</p>
</div>

</div>
EOHTML;

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

?>
