blob: 783296a8dddcfbae81456ad63716b468d5719767 [file] [log] [blame]
<!DOCTYPE HTML>
<!-- NewPage -->
<html lang="en">
<head>
<!-- Generated by javadoc (11.0.18) on Wed Mar 01 02:01:42 GMT 2023 -->
<title>RoundRobinPacking (Heron Java API)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="dc.created" content="2023-03-01">
<link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../jquery/jquery-ui.min.css" title="Style">
<link rel="stylesheet" type="text/css" href="../../../../../jquery-ui.overrides.css" title="Style">
<script type="text/javascript" src="../../../../../script.js"></script>
<script type="text/javascript" src="../../../../../jquery/jszip/dist/jszip.min.js"></script>
<script type="text/javascript" src="../../../../../jquery/jszip-utils/dist/jszip-utils.min.js"></script>
<!--[if IE]>
<script type="text/javascript" src="../../../../../jquery/jszip-utils/dist/jszip-utils-ie.min.js"></script>
<![endif]-->
<script type="text/javascript" src="../../../../../jquery/jquery-3.6.0.min.js"></script>
<script type="text/javascript" src="../../../../../jquery/jquery-ui.min.js"></script>
</head>
<body>
<script type="text/javascript"><!--
try {
if (location.href.indexOf('is-external=true') == -1) {
parent.document.title="RoundRobinPacking (Heron Java API)";
}
}
catch(err) {
}
//-->
var data = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10};
var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
var altColor = "altColor";
var rowColor = "rowColor";
var tableTab = "tableTab";
var activeTableTab = "activeTableTab";
var pathtoroot = "../../../../../";
var useModuleDirectories = true;
loadScripts(document, 'script');</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<header role="banner">
<nav role="navigation">
<div class="fixedNav">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="topNav"><a id="navbar.top">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.top" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.top.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_top">
<li><a href="../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<ul class="navListSearch">
<li><label for="search">SEARCH:</label>
<input type="text" id="search" value="search" disabled="disabled">
<input type="reset" id="reset" value="reset" disabled="disabled">
</li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_top");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.top">
<!-- -->
</a></div>
<!-- ========= END OF TOP NAVBAR ========= -->
</div>
<div class="navPadding">&nbsp;</div>
<script type="text/javascript"><!--
$('.navPadding').css('padding-top', $('.fixedNav').css("height"));
//-->
</script>
</nav>
</header>
<!-- ======== START OF CLASS DATA ======== -->
<main role="main">
<div class="header">
<div class="subTitle"><span class="packageLabelInType">Package</span>&nbsp;<a href="package-summary.html">org.apache.heron.packing.roundrobin</a></div>
<h2 title="Class RoundRobinPacking" class="title">Class RoundRobinPacking</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
<li>java.lang.Object</li>
<li>
<ul class="inheritance">
<li>org.apache.heron.packing.roundrobin.RoundRobinPacking</li>
</ul>
</li>
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
<dl>
<dt>All Implemented Interfaces:</dt>
<dd><code>java.lang.AutoCloseable</code>, <code><a href="../../spi/packing/IPacking.html" title="interface in org.apache.heron.spi.packing">IPacking</a></code>, <code><a href="../../spi/packing/IRepacking.html" title="interface in org.apache.heron.spi.packing">IRepacking</a></code></dd>
</dl>
<hr>
<pre>public class <span class="typeNameLabel">RoundRobinPacking</span>
extends java.lang.Object
implements <a href="../../spi/packing/IPacking.html" title="interface in org.apache.heron.spi.packing">IPacking</a>, <a href="../../spi/packing/IRepacking.html" title="interface in org.apache.heron.spi.packing">IRepacking</a></pre>
<div class="block">Round-robin packing algorithm
<p>
This IPacking implementation generates PackingPlan: instances of the component are assigned
to each container one by one in circular order, without any priority. Each container is expected
to take equal number of instances if # of instances is multiple of # of containers.
<p>
Following semantics are guaranteed:
1. Every container requires same size of resource, i.e. same CPU, RAM and disk.
Consider that instances in different containers can be different, the value of size
will be aligned to the max one.
<p>
2. The size of resource required by the whole topology is equal to
((# of container specified in config) + 1) * (size of resource required for a single container).
The extra 1 is considered for Heron internal container,
i.e. the one containing Scheduler and TManager.
<p>
3. The disk required for a container is calculated as:
value for org.apache.heron.api.Config.TOPOLOGY_CONTAINER_DISK_REQUESTED if exists, otherwise,
(disk for instances in container) + (disk padding for heron internal process)
<p>
4. The CPU required for a container is calculated as:
value for org.apache.heron.api.Config.TOPOLOGY_CONTAINER_CPU_REQUESTED if exists, otherwise,
(CPU for instances in container) + (CPU padding for heron internal process)
<p>
5. The RAM required for a container is calculated as:
value for org.apache.heron.api.Config.TOPOLOGY_CONTAINER_RAM_REQUESTED if exists, otherwise,
(RAM for instances in container) + (RAM padding for heron internal process)
<p>
6. The RAM required for one instance is calculated as:
value in org.apache.heron.api.Config.TOPOLOGY_COMPONENT_RAMMAP if exists, otherwise,
- if org.apache.heron.api.Config.TOPOLOGY_CONTAINER_RAM_REQUESTED not exists:
the default RAM value for one instance
- if org.apache.heron.api.Config.TOPOLOGY_CONTAINER_RAM_REQUESTED exists:
((TOPOLOGY_CONTAINER_RAM_REQUESTED) - (RAM padding for heron internal process)
- (RAM used by instances within TOPOLOGY_COMPONENT_RAMMAP config))) /
(the # of instances in container not specified in TOPOLOGY_COMPONENT_RAMMAP config)
7. The pack() return null if PackingPlan fails to pass the safe check, for instance,
the size of RAM for an instance is less than the minimal required value.</div>
</li>
</ul>
</div>
<div class="summary">
<ul class="blockList">
<li class="blockList">
<!-- ======== CONSTRUCTOR SUMMARY ======== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="constructor.summary">
<!-- -->
</a>
<h3>Constructor Summary</h3>
<table class="memberSummary">
<caption><span>Constructors</span><span class="tabEnd">&nbsp;</span></caption>
<tr>
<th class="colFirst" scope="col">Constructor</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr class="altColor">
<th class="colConstructorName" scope="row"><code><span class="memberNameLink"><a href="#%3Cinit%3E()">RoundRobinPacking</a></span>()</code></th>
<td class="colLast">&nbsp;</td>
</tr>
</table>
</li>
</ul>
</section>
<!-- ========== METHOD SUMMARY =========== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="method.summary">
<!-- -->
</a>
<h3>Method Summary</h3>
<table class="memberSummary">
<caption><span id="t0" class="activeTableTab"><span>All Methods</span><span class="tabEnd">&nbsp;</span></span><span id="t2" class="tableTab"><span><a href="javascript:show(2);">Instance Methods</a></span><span class="tabEnd">&nbsp;</span></span><span id="t4" class="tableTab"><span><a href="javascript:show(8);">Concrete Methods</a></span><span class="tabEnd">&nbsp;</span></span></caption>
<tr>
<th class="colFirst" scope="col">Modifier and Type</th>
<th class="colSecond" scope="col">Method</th>
<th class="colLast" scope="col">Description</th>
</tr>
<tr id="i0" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#close()">close</a></span>()</code></th>
<td class="colLast">
<div class="block">This is to for disposing or cleaning up any internal state accumulated by
the uploader</div>
</td>
</tr>
<tr id="i1" class="rowColor">
<td class="colFirst"><code>java.util.Map&lt;java.lang.String,&#8203;java.lang.Integer&gt;</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#getNewComponentParallelism(org.apache.heron.spi.packing.PackingPlan,java.util.Map)">getNewComponentParallelism</a></span>&#8203;(<a href="../../spi/packing/PackingPlan.html" title="class in org.apache.heron.spi.packing">PackingPlan</a>&nbsp;currentPackingPlan,
java.util.Map&lt;java.lang.String,&#8203;java.lang.Integer&gt;&nbsp;componentChanges)</code></th>
<td class="colLast">&nbsp;</td>
</tr>
<tr id="i2" class="altColor">
<td class="colFirst"><code>void</code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#initialize(org.apache.heron.spi.common.Config,org.apache.heron.api.generated.TopologyAPI.Topology)">initialize</a></span>&#8203;(<a href="../../spi/common/Config.html" title="class in org.apache.heron.spi.common">Config</a>&nbsp;config,
<a href="../../api/generated/TopologyAPI.Topology.html" title="class in org.apache.heron.api.generated">TopologyAPI.Topology</a>&nbsp;inputTopology)</code></th>
<td class="colLast">
<div class="block">Initialize the packing algorithm with the static config and the topology</div>
</td>
</tr>
<tr id="i3" class="rowColor">
<td class="colFirst"><code><a href="../../spi/packing/PackingPlan.html" title="class in org.apache.heron.spi.packing">PackingPlan</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#pack()">pack</a></span>()</code></th>
<td class="colLast">
<div class="block">Called by scheduler to generate container packing.</div>
</td>
</tr>
<tr id="i4" class="altColor">
<td class="colFirst"><code><a href="../../spi/packing/PackingPlan.html" title="class in org.apache.heron.spi.packing">PackingPlan</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#repack(org.apache.heron.spi.packing.PackingPlan,int,java.util.Map)">repack</a></span>&#8203;(<a href="../../spi/packing/PackingPlan.html" title="class in org.apache.heron.spi.packing">PackingPlan</a>&nbsp;currentPackingPlan,
int&nbsp;containers,
java.util.Map&lt;java.lang.String,&#8203;java.lang.Integer&gt;&nbsp;componentChanges)</code></th>
<td class="colLast">
<div class="block">Read the current packing plan with update parallelism and number of containers
to calculate a new packing plan.</div>
</td>
</tr>
<tr id="i5" class="rowColor">
<td class="colFirst"><code><a href="../../spi/packing/PackingPlan.html" title="class in org.apache.heron.spi.packing">PackingPlan</a></code></td>
<th class="colSecond" scope="row"><code><span class="memberNameLink"><a href="#repack(org.apache.heron.spi.packing.PackingPlan,java.util.Map)">repack</a></span>&#8203;(<a href="../../spi/packing/PackingPlan.html" title="class in org.apache.heron.spi.packing">PackingPlan</a>&nbsp;currentPackingPlan,
java.util.Map&lt;java.lang.String,&#8203;java.lang.Integer&gt;&nbsp;componentChanges)</code></th>
<td class="colLast">
<div class="block">Read the current packing plan with update parallelism to calculate a new packing plan.</div>
</td>
</tr>
</table>
<ul class="blockList">
<li class="blockList"><a id="methods.inherited.from.class.java.lang.Object">
<!-- -->
</a>
<h3>Methods inherited from class&nbsp;java.lang.Object</h3>
<code>clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</code></li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
<div class="details">
<ul class="blockList">
<li class="blockList">
<!-- ========= CONSTRUCTOR DETAIL ======== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="constructor.detail">
<!-- -->
</a>
<h3>Constructor Detail</h3>
<a id="&lt;init&gt;()">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>RoundRobinPacking</h4>
<pre>public&nbsp;RoundRobinPacking()</pre>
</li>
</ul>
</li>
</ul>
</section>
<!-- ============ METHOD DETAIL ========== -->
<section>
<ul class="blockList">
<li class="blockList"><a id="method.detail">
<!-- -->
</a>
<h3>Method Detail</h3>
<a id="initialize(org.apache.heron.spi.common.Config,org.apache.heron.api.generated.TopologyAPI.Topology)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>initialize</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;initialize&#8203;(<a href="../../spi/common/Config.html" title="class in org.apache.heron.spi.common">Config</a>&nbsp;config,
<a href="../../api/generated/TopologyAPI.Topology.html" title="class in org.apache.heron.api.generated">TopologyAPI.Topology</a>&nbsp;inputTopology)</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../spi/packing/IPacking.html#initialize(org.apache.heron.spi.common.Config,org.apache.heron.api.generated.TopologyAPI.Topology)">IPacking</a></code></span></div>
<div class="block">Initialize the packing algorithm with the static config and the topology</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../../spi/packing/IPacking.html#initialize(org.apache.heron.spi.common.Config,org.apache.heron.api.generated.TopologyAPI.Topology)">initialize</a></code>&nbsp;in interface&nbsp;<code><a href="../../spi/packing/IPacking.html" title="interface in org.apache.heron.spi.packing">IPacking</a></code></dd>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../../spi/packing/IRepacking.html#initialize(org.apache.heron.spi.common.Config,org.apache.heron.api.generated.TopologyAPI.Topology)">initialize</a></code>&nbsp;in interface&nbsp;<code><a href="../../spi/packing/IRepacking.html" title="interface in org.apache.heron.spi.packing">IRepacking</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>config</code> - topology config</dd>
<dd><code>inputTopology</code> - topology to repack</dd>
</dl>
</li>
</ul>
<a id="pack()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>pack</h4>
<pre class="methodSignature">public&nbsp;<a href="../../spi/packing/PackingPlan.html" title="class in org.apache.heron.spi.packing">PackingPlan</a>&nbsp;pack()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../spi/packing/IPacking.html#pack()">IPacking</a></code></span></div>
<div class="block">Called by scheduler to generate container packing.
Packing algorithm output generates instance id and container id.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../../spi/packing/IPacking.html#pack()">pack</a></code>&nbsp;in interface&nbsp;<code><a href="../../spi/packing/IPacking.html" title="interface in org.apache.heron.spi.packing">IPacking</a></code></dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>PackingPlan describing the job to schedule.</dd>
</dl>
</li>
</ul>
<a id="close()">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>close</h4>
<pre class="methodSignature">public&nbsp;void&nbsp;close()</pre>
<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../spi/packing/IPacking.html#close()">IPacking</a></code></span></div>
<div class="block">This is to for disposing or cleaning up any internal state accumulated by
the uploader
<p>
Closes this stream and releases any system resources associated
with it. If the stream is already closed then invoking this
method has no effect.</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code>close</code>&nbsp;in interface&nbsp;<code>java.lang.AutoCloseable</code></dd>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../../spi/packing/IPacking.html#close()">close</a></code>&nbsp;in interface&nbsp;<code><a href="../../spi/packing/IPacking.html" title="interface in org.apache.heron.spi.packing">IPacking</a></code></dd>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../../spi/packing/IRepacking.html#close()">close</a></code>&nbsp;in interface&nbsp;<code><a href="../../spi/packing/IRepacking.html" title="interface in org.apache.heron.spi.packing">IRepacking</a></code></dd>
</dl>
</li>
</ul>
<a id="repack(org.apache.heron.spi.packing.PackingPlan,java.util.Map)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>repack</h4>
<pre class="methodSignature">public&nbsp;<a href="../../spi/packing/PackingPlan.html" title="class in org.apache.heron.spi.packing">PackingPlan</a>&nbsp;repack&#8203;(<a href="../../spi/packing/PackingPlan.html" title="class in org.apache.heron.spi.packing">PackingPlan</a>&nbsp;currentPackingPlan,
java.util.Map&lt;java.lang.String,&#8203;java.lang.Integer&gt;&nbsp;componentChanges)
throws <a href="../../spi/packing/PackingException.html" title="class in org.apache.heron.spi.packing">PackingException</a></pre>
<div class="block">Read the current packing plan with update parallelism to calculate a new packing plan.
This method should determine a new number of containers based on the updated parallism
while remaining the number of instances per container <= that of the old packing plan.
The packing algorithm packInternal() is shared with pack()
delegate to packInternal() with the new container count and component parallelism</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../../spi/packing/IRepacking.html#repack(org.apache.heron.spi.packing.PackingPlan,java.util.Map)">repack</a></code>&nbsp;in interface&nbsp;<code><a href="../../spi/packing/IRepacking.html" title="interface in org.apache.heron.spi.packing">IRepacking</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>currentPackingPlan</code> - Existing packing plan</dd>
<dd><code>componentChanges</code> - Map &lt; componentName, new component parallelism &gt;
that contains the parallelism for each component whose parallelism has changed.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>new packing plan</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="../../spi/packing/PackingException.html" title="class in org.apache.heron.spi.packing">PackingException</a></code></dd>
</dl>
</li>
</ul>
<a id="getNewComponentParallelism(org.apache.heron.spi.packing.PackingPlan,java.util.Map)">
<!-- -->
</a>
<ul class="blockList">
<li class="blockList">
<h4>getNewComponentParallelism</h4>
<pre class="methodSignature">public&nbsp;java.util.Map&lt;java.lang.String,&#8203;java.lang.Integer&gt;&nbsp;getNewComponentParallelism&#8203;(<a href="../../spi/packing/PackingPlan.html" title="class in org.apache.heron.spi.packing">PackingPlan</a>&nbsp;currentPackingPlan,
java.util.Map&lt;java.lang.String,&#8203;java.lang.Integer&gt;&nbsp;componentChanges)</pre>
</li>
</ul>
<a id="repack(org.apache.heron.spi.packing.PackingPlan,int,java.util.Map)">
<!-- -->
</a>
<ul class="blockListLast">
<li class="blockList">
<h4>repack</h4>
<pre class="methodSignature">public&nbsp;<a href="../../spi/packing/PackingPlan.html" title="class in org.apache.heron.spi.packing">PackingPlan</a>&nbsp;repack&#8203;(<a href="../../spi/packing/PackingPlan.html" title="class in org.apache.heron.spi.packing">PackingPlan</a>&nbsp;currentPackingPlan,
int&nbsp;containers,
java.util.Map&lt;java.lang.String,&#8203;java.lang.Integer&gt;&nbsp;componentChanges)
throws <a href="../../spi/packing/PackingException.html" title="class in org.apache.heron.spi.packing">PackingException</a></pre>
<div class="block">Read the current packing plan with update parallelism and number of containers
to calculate a new packing plan.
The packing algorithm packInternal() is shared with pack()
delegate to packInternal() with the new container count and component parallelism</div>
<dl>
<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
<dd><code><a href="../../spi/packing/IRepacking.html#repack(org.apache.heron.spi.packing.PackingPlan,int,java.util.Map)">repack</a></code>&nbsp;in interface&nbsp;<code><a href="../../spi/packing/IRepacking.html" title="interface in org.apache.heron.spi.packing">IRepacking</a></code></dd>
<dt><span class="paramLabel">Parameters:</span></dt>
<dd><code>currentPackingPlan</code> - Existing packing plan</dd>
<dd><code>containers</code> - &lt; the new number of containers for the topology
specified by the user</dd>
<dd><code>componentChanges</code> - Map &lt; componentName, new component parallelism &gt;
that contains the parallelism for each component whose parallelism has changed.</dd>
<dt><span class="returnLabel">Returns:</span></dt>
<dd>new packing plan</dd>
<dt><span class="throwsLabel">Throws:</span></dt>
<dd><code><a href="../../spi/packing/PackingException.html" title="class in org.apache.heron.spi.packing">PackingException</a></code></dd>
</dl>
</li>
</ul>
</li>
</ul>
</section>
</li>
</ul>
</div>
</div>
</main>
<!-- ========= END OF CLASS DATA ========= -->
<footer role="contentinfo">
<nav role="navigation">
<!-- ======= START OF BOTTOM NAVBAR ====== -->
<div class="bottomNav"><a id="navbar.bottom">
<!-- -->
</a>
<div class="skipNav"><a href="#skip.navbar.bottom" title="Skip navigation links">Skip navigation links</a></div>
<a id="navbar.bottom.firstrow">
<!-- -->
</a>
<ul class="navList" title="Navigation">
<li><a href="../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
<li><a href="../../../../../index-all.html">Index</a></li>
<li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<ul class="navList" id="allclasses_navbar_bottom">
<li><a href="../../../../../allclasses.html">All&nbsp;Classes</a></li>
</ul>
<div>
<script type="text/javascript"><!--
allClassesLink = document.getElementById("allclasses_navbar_bottom");
if(window==top) {
allClassesLink.style.display = "block";
}
else {
allClassesLink.style.display = "none";
}
//-->
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
</div>
<div>
<ul class="subNavList">
<li>Summary:&nbsp;</li>
<li>Nested&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.summary">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.summary">Method</a></li>
</ul>
<ul class="subNavList">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li><a href="#constructor.detail">Constr</a>&nbsp;|&nbsp;</li>
<li><a href="#method.detail">Method</a></li>
</ul>
</div>
<a id="skip.navbar.bottom">
<!-- -->
</a></div>
<!-- ======== END OF BOTTOM NAVBAR ======= -->
</nav>
</footer>
</body>
</html>