blob: b63e8ba2141939afbd0009699313b68744af8861 [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="en-US">
<head>
<meta http-equiv="CACHE-CONTROL" content="NO-CACHE">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Code Usage</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="generator" content="Jekyll v4.1.1">
<link rel="stylesheet" href="/css/font-awesome.min.css">
<link rel="stylesheet" href="/css/screen.css">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<script src="/js/jquery-3.2.1.min.js"></script>
<!--[if lt IE 9]>
<script src="/js/html5shiv.min.js"></script>
<script src="/js/respond.min.js"></script>
<![endif]-->
<script src="/js/screen.js"></script>
<script type="text/javascript" src="/assets/javascripts/bundle.js" charset="utf-8"></script>
</head>
<body>
<header role="banner">
<nav class="mobile-nav show-on-mobiles">
<ul>
<li class="">
<a href="/">Home</a>
</li>
<li class="current">
<a href="/docs/">Doc<span class="show-on-mobiles">s</span><span class="hide-on-mobiles">umentation</span></a>
</li>
</li>
<li class="">
<a href="/downloads/">Downloads</a>
</li>
<li class="">
<a href="/talks/">Talks</a>
</li>
<li class="">
<a href="/news/">News</a>
</li>
<li class="">
<a href="/develop/">Develop</a>
</li>
<li class="">
<a href="/help/">Help</a>
</li>
</ul>
</nav>
<div class="grid">
<div class="unit one-third center-on-mobiles">
<h1>
<a href="/">
<span class="sr-only">Apache Mnemonic</span>
<img src="/img/mnemonic_logo_v2.png" width="289" alt="Mnemonic Logo" class="logo">
</a>
<a href="https://www.apache.org/events/current-event.html">
<img src="https://www.apache.org/events/current-event-234x60.png"/>
</a>
</h1>
</div>
<nav class="main-nav unit two-thirds hide-on-mobiles">
<ul>
<li class="">
<a href="/">Home</a>
</li>
<li class="current">
<a href="/docs/">Doc<span class="show-on-mobiles">s</span><span class="hide-on-mobiles">umentation</span></a>
</li>
</li>
<li class="">
<a href="/downloads/">Downloads</a>
</li>
<li class="">
<a href="/talks/">Talks</a>
</li>
<li class="">
<a href="/news/">News</a>
</li>
<li class="">
<a href="/develop/">Develop</a>
</li>
<li class="">
<a href="/help/">Help</a>
</li>
</ul>
</nav>
</div>
<!-- Return to Top -->
<a href="#top" id="return-to-top"><i class="fa fa-chevron-up"></i></a>
</header>
<section class="docs">
<div class="grid">
<div class="docs-nav-mobile unit whole show-on-mobiles">
<select onchange="if (this.value) window.location.href=this.value">
<option value="">Navigate the docs…</option>
<optgroup label="Overview">
<option value="/docs/arch.html">Architecture</option>
<option value="/docs/features.html">Features</option>
<option value="/docs/modes.html">Mnemonic Modes</option>
<option value="/docs/memsrvcmp.html">Durable Memory Service Comparison</option>
<option value="/docs/integration.html">Integration with other projects</option>
<option value="/docs/domusecases.html">DOM Use Cases</option>
<option value="/docs/dcmusecases.html">DCM Use Cases</option>
<option value="/docs/msusecases.html">MS Use Cases</option>
<option value="/docs/sparkusecases.html">Apache Spark Integration Use Cases</option>
<option value="/docs/hadoopusecases.html">Apache Hadoop Integration Use Cases</option>
<option value="/docs/gcdata.html">Java GC data</option>
<option value="/docs/security.html">Security</option>
</optgroup>
<optgroup label="Usage">
<option value="/docs/getstarted.html">Get Started</option>
<option value="/docs/devsetup.html">Development Setup</option>
<option value="/docs/submitchanges.html">Submit Changes</option>
<option value="/docs/build.html">Project Build</option>
<option value="/docs/runtest.html">Run tests</option>
<option value="/docs/docker.html">Docker usage</option>
</optgroup>
</select>
</div>
<div class="unit four-fifths">
<article>
<h1>Code Usage</h1>
<h3 id="how-to-use-it-">How to use it ?</h3>
<h4 id="define-a-non-volatile-class">Define a Non-Volatile class:</h4>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cm">/**
* a durable class should be abstract, implement Durable interface and marked with @DurableEntity annotation
*/</span>
<span class="nd">@DurableEntity</span>
<span class="kd">public</span> <span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">Person</span><span class="o">&lt;</span><span class="no">E</span><span class="o">&gt;</span> <span class="kd">implements</span> <span class="nc">Durable</span><span class="o">,</span> <span class="nc">Comparable</span><span class="o">&lt;</span><span class="nc">Person</span><span class="o">&lt;</span><span class="no">E</span><span class="o">&gt;&gt;</span> <span class="o">{</span>
<span class="no">E</span> <span class="n">element</span><span class="o">;</span> <span class="c1">// Generic Type</span>
<span class="cm">/**
* callback for this durable object creation
*/</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">initializeAfterCreate</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Initializing After Created"</span><span class="o">);</span>
<span class="o">}</span>
<span class="cm">/**
* callback for this durable object recovery
*/</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">initializeAfterRestore</span><span class="o">()</span> <span class="o">{</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Initializing After Restored"</span><span class="o">);</span>
<span class="o">}</span>
<span class="cm">/**
* setup generic info manually to avoid performance penalty
*/</span>
<span class="nd">@Override</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setupGenericInfo</span><span class="o">(</span><span class="nc">EntityFactoryProxy</span><span class="o">[]</span> <span class="n">efproxies</span><span class="o">,</span> <span class="nc">GenericField</span><span class="o">.</span><span class="na">GType</span><span class="o">[]</span> <span class="n">gftypes</span><span class="o">)</span> <span class="o">{</span>
<span class="o">}</span>
<span class="nd">@Test</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">testOutput</span><span class="o">()</span> <span class="kd">throws</span> <span class="nc">RetrieveDurableEntityError</span> <span class="o">{</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">printf</span><span class="o">(</span><span class="s">"Person %s, Age: %d ( %s ) \n"</span><span class="o">,</span> <span class="n">getName</span><span class="o">(),</span> <span class="n">getAge</span><span class="o">(),</span>
<span class="kc">null</span> <span class="o">==</span> <span class="n">getMother</span><span class="o">()?</span> <span class="s">"No Recorded Mother"</span> <span class="o">:</span> <span class="s">"Has Recorded Mother"</span><span class="o">);</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">compareTo</span><span class="o">(</span><span class="nc">Person</span><span class="o">&lt;</span><span class="no">E</span><span class="o">&gt;</span> <span class="n">anotherPerson</span><span class="o">)</span> <span class="o">{</span>
<span class="kt">int</span> <span class="n">ret</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="k">if</span> <span class="o">(</span><span class="mi">0</span> <span class="o">==</span> <span class="n">ret</span><span class="o">)</span> <span class="n">ret</span> <span class="o">=</span> <span class="n">getAge</span><span class="o">().</span><span class="na">compareTo</span><span class="o">(</span><span class="n">anotherPerson</span><span class="o">.</span><span class="na">getAge</span><span class="o">());</span>
<span class="k">if</span> <span class="o">(</span><span class="mi">0</span> <span class="o">==</span> <span class="n">ret</span><span class="o">)</span> <span class="n">ret</span> <span class="o">=</span> <span class="n">getName</span><span class="o">().</span><span class="na">compareTo</span><span class="o">(</span><span class="n">anotherPerson</span><span class="o">.</span><span class="na">getName</span><span class="o">());</span>
<span class="k">return</span> <span class="n">ret</span><span class="o">;</span>
<span class="o">}</span>
<span class="cm">/**
* Getters and Setters for non-volatile fields marked with @DurableGetter and @DurableSetter
*/</span>
<span class="nd">@DurableGetter</span><span class="o">(</span><span class="nc">Id</span> <span class="o">=</span> <span class="mi">1L</span><span class="o">)</span>
<span class="kd">abstract</span> <span class="kd">public</span> <span class="nc">Short</span> <span class="nf">getAge</span><span class="o">();</span>
<span class="nd">@DurableSetter</span>
<span class="kd">abstract</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setAge</span><span class="o">(</span><span class="nc">Short</span> <span class="n">age</span><span class="o">);</span>
<span class="nd">@DurableGetter</span><span class="o">(</span><span class="nc">Id</span> <span class="o">=</span> <span class="mi">2L</span><span class="o">)</span>
<span class="kd">abstract</span> <span class="kd">public</span> <span class="nc">String</span> <span class="nf">getName</span><span class="o">()</span> <span class="kd">throws</span> <span class="nc">RetrieveDurableEntityError</span><span class="o">;</span>
<span class="nd">@DurableSetter</span>
<span class="kd">abstract</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setName</span><span class="o">(</span><span class="nc">String</span> <span class="n">name</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">destroy</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">OutOfPersistentMemory</span><span class="o">,</span> <span class="nc">RetrieveDurableEntityError</span><span class="o">;</span>
<span class="nd">@DurableGetter</span><span class="o">(</span><span class="nc">Id</span> <span class="o">=</span> <span class="mi">3L</span><span class="o">)</span>
<span class="kd">abstract</span> <span class="kd">public</span> <span class="nc">Person</span><span class="o">&lt;</span><span class="no">E</span><span class="o">&gt;</span> <span class="nf">getMother</span><span class="o">()</span> <span class="kd">throws</span> <span class="nc">RetrieveDurableEntityError</span><span class="o">;</span>
<span class="nd">@DurableSetter</span>
<span class="kd">abstract</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setMother</span><span class="o">(</span><span class="nc">Person</span><span class="o">&lt;</span><span class="no">E</span><span class="o">&gt;</span> <span class="n">mother</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">destroy</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">RetrieveDurableEntityError</span><span class="o">;</span>
<span class="nd">@DurableGetter</span><span class="o">(</span><span class="nc">Id</span> <span class="o">=</span> <span class="mi">4L</span><span class="o">)</span>
<span class="kd">abstract</span> <span class="kd">public</span> <span class="nc">Person</span><span class="o">&lt;</span><span class="no">E</span><span class="o">&gt;</span> <span class="nf">getFather</span><span class="o">()</span> <span class="kd">throws</span> <span class="nc">RetrieveDurableEntityError</span><span class="o">;</span>
<span class="nd">@DurableSetter</span>
<span class="kd">abstract</span> <span class="kd">public</span> <span class="kt">void</span> <span class="nf">setFather</span><span class="o">(</span><span class="nc">Person</span><span class="o">&lt;</span><span class="no">E</span><span class="o">&gt;</span> <span class="n">mother</span><span class="o">,</span> <span class="kt">boolean</span> <span class="n">destroy</span><span class="o">)</span> <span class="kd">throws</span> <span class="nc">RetrieveDurableEntityError</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>
<h4 id="use-a-non-volatile-class">Use a non-volatile class:</h4>
<h5 id="setup-an-allocator-for-non-volatile-object-graphs">Setup an allocator for non-volatile object graphs.</h5>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1">// create an allocator instance</span>
<span class="nc">NonVolatileMemAllocator</span> <span class="n">act</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">NonVolatileMemAllocator</span><span class="o">(</span><span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">8</span><span class="o">,</span> <span class="s">"./pobj_person.dat"</span><span class="o">,</span> <span class="kc">true</span><span class="o">);</span>
<span class="c1">// fetch handler store capacity from this non-volatile storage managed by this allocator</span>
<span class="no">KEYCAPACITY</span> <span class="o">=</span> <span class="n">act</span><span class="o">.</span><span class="na">handlerCapacity</span><span class="o">();</span>
<span class="o">....</span>
<span class="c1">// close it after use</span>
<span class="n">act</span><span class="o">.</span><span class="na">close</span><span class="o">();</span>
</code></pre></div></div>
<h5 id="generate-structured-non-volatile-objects">Generate structured non-volatile objects.</h5>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1">// create a new non-volatile person object from this specific allocator</span>
<span class="n">person</span> <span class="o">=</span> <span class="nc">PersonFactory</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">act</span><span class="o">);</span>
<span class="c1">// set attributes</span>
<span class="n">person</span><span class="o">.</span><span class="na">setAge</span><span class="o">((</span><span class="kt">short</span><span class="o">)</span><span class="n">rand</span><span class="o">.</span><span class="na">nextInt</span><span class="o">(</span><span class="mi">50</span><span class="o">));</span>
<span class="n">person</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="nc">String</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">"Name: [%s]"</span><span class="o">,</span> <span class="no">UUID</span><span class="o">.</span><span class="na">randomUUID</span><span class="o">().</span><span class="na">toString</span><span class="o">()),</span> <span class="kc">true</span><span class="o">);</span>
<span class="c1">// keep this person on non-volatile handler store</span>
<span class="n">act</span><span class="o">.</span><span class="na">setHandler</span><span class="o">(</span><span class="n">keyidx</span><span class="o">,</span> <span class="n">person</span><span class="o">.</span><span class="na">getHandler</span><span class="o">());</span>
<span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">deep</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">deep</span> <span class="o">&lt;</span> <span class="n">rand</span><span class="o">.</span><span class="na">nextInt</span><span class="o">(</span><span class="mi">100</span><span class="o">);</span> <span class="o">++</span><span class="n">deep</span><span class="o">)</span> <span class="o">{</span>
<span class="c1">// create another person as mother</span>
<span class="n">mother</span> <span class="o">=</span> <span class="nc">PersonFactory</span><span class="o">.</span><span class="na">create</span><span class="o">(</span><span class="n">act</span><span class="o">);</span>
<span class="n">mother</span><span class="o">.</span><span class="na">setAge</span><span class="o">((</span><span class="kt">short</span><span class="o">)(</span><span class="mi">50</span> <span class="o">+</span> <span class="n">rand</span><span class="o">.</span><span class="na">nextInt</span><span class="o">(</span><span class="mi">50</span><span class="o">)));</span>
<span class="n">mother</span><span class="o">.</span><span class="na">setName</span><span class="o">(</span><span class="nc">String</span><span class="o">.</span><span class="na">format</span><span class="o">(</span><span class="s">"Name: [%s]"</span><span class="o">,</span> <span class="no">UUID</span><span class="o">.</span><span class="na">randomUUID</span><span class="o">().</span><span class="na">toString</span><span class="o">()),</span> <span class="kc">true</span><span class="o">);</span>
<span class="c1">// set the person's mother</span>
<span class="n">person</span><span class="o">.</span><span class="na">setMother</span><span class="o">(</span><span class="n">mother</span><span class="o">,</span> <span class="kc">true</span><span class="o">);</span>
<span class="n">person</span> <span class="o">=</span> <span class="n">mother</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>
<h5 id="use-the-non-volatile-objects">Use the non-volatile objects</h5>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">for</span> <span class="o">(</span><span class="kt">long</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="no">KEYCAPACITY</span><span class="o">;</span> <span class="o">++</span><span class="n">i</span><span class="o">)</span> <span class="o">{</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">printf</span><span class="o">(</span><span class="s">"----------Key %d--------------\n"</span><span class="o">,</span> <span class="n">i</span><span class="o">);</span>
<span class="c1">// iterate non-volatile handlers from handler store of this specific allocator</span>
<span class="n">val</span> <span class="o">=</span> <span class="n">act</span><span class="o">.</span><span class="na">getHandler</span><span class="o">(</span><span class="n">i</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(</span><span class="mi">0L</span> <span class="o">==</span> <span class="n">val</span><span class="o">)</span> <span class="o">{</span>
<span class="k">break</span><span class="o">;</span>
<span class="o">}</span>
<span class="c1">// restore person objects from this specific allocator</span>
<span class="nc">Person</span><span class="o">&lt;</span><span class="nc">Integer</span><span class="o">&gt;</span> <span class="n">person</span> <span class="o">=</span> <span class="nc">PersonFactory</span><span class="o">.</span><span class="na">restore</span><span class="o">(</span><span class="n">act</span><span class="o">,</span> <span class="n">val</span><span class="o">,</span> <span class="kc">true</span><span class="o">);</span>
<span class="k">while</span> <span class="o">(</span><span class="kc">null</span> <span class="o">!=</span> <span class="n">person</span><span class="o">)</span> <span class="o">{</span>
<span class="n">person</span><span class="o">.</span><span class="na">testOutput</span><span class="o">();</span>
<span class="c1">// iterate all mother's ancestors</span>
<span class="n">person</span> <span class="o">=</span> <span class="n">person</span><span class="o">.</span><span class="na">getMother</span><span class="o">();</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<h5 id="perform-the-durable-native-computing-eg-printing-wo-packingunpacking-massive-object-graphs">Perform the durable native computing (e.g. printing) w/o packing/unpacking massive object graphs</h5>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1">// fetch print service</span>
<span class="nc">GeneralComputingService</span> <span class="n">gcsvr</span> <span class="o">=</span> <span class="nc">Utils</span><span class="o">.</span><span class="na">getGeneralComputingService</span><span class="o">(</span><span class="s">"print"</span><span class="o">);</span>
<span class="c1">// instantiate a value info for a value matrix</span>
<span class="nc">ValueInfo</span> <span class="n">vinfo</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ValueInfo</span><span class="o">();</span>
<span class="c1">// instantiate a object stack</span>
<span class="nc">List</span><span class="o">&lt;</span><span class="kt">long</span><span class="o">[][]&gt;</span> <span class="n">objstack</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o">&lt;</span><span class="kt">long</span><span class="o">[][]&gt;();</span>
<span class="c1">// fill up with all durable object info in order</span>
<span class="n">objstack</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">firstnv</span><span class="o">.</span><span class="na">getNativeFieldInfo</span><span class="o">());</span>
<span class="n">objstack</span><span class="o">.</span><span class="na">add</span><span class="o">(</span><span class="n">person</span><span class="o">.</span><span class="na">getNativeFieldInfo</span><span class="o">());</span>
<span class="c1">// configure the Id stack for each level of durable objects</span>
<span class="kt">long</span><span class="o">[][]</span> <span class="n">fidinfostack</span> <span class="o">=</span> <span class="o">{{</span><span class="mi">2L</span><span class="o">,</span> <span class="mi">1L</span><span class="o">},</span> <span class="o">{</span><span class="mi">0L</span><span class="o">,</span> <span class="mi">1L</span><span class="o">}};</span>
<span class="c1">// configure the handler of a value matrix</span>
<span class="n">vinfo</span><span class="o">.</span><span class="na">handler</span> <span class="o">=</span> <span class="n">handler</span><span class="o">;</span>
<span class="c1">// set translate table from handler's allocator</span>
<span class="n">vinfo</span><span class="o">.</span><span class="na">transtable</span> <span class="o">=</span> <span class="n">m_act</span><span class="o">.</span><span class="na">getTranslateTable</span><span class="o">();</span>
<span class="c1">// specify the durable type of value</span>
<span class="n">vinfo</span><span class="o">.</span><span class="na">dtype</span> <span class="o">=</span> <span class="nc">DurableType</span><span class="o">.</span><span class="na">SHORT</span><span class="o">;</span>
<span class="c1">// generate frames for this value matri from both stacks</span>
<span class="n">vinfo</span><span class="o">.</span><span class="na">frames</span> <span class="o">=</span> <span class="nc">Utils</span><span class="o">.</span><span class="na">genNativeParamForm</span><span class="o">(</span><span class="n">objstack</span><span class="o">,</span> <span class="n">fidinfostack</span><span class="o">);</span>
<span class="c1">// form an array of value infos</span>
<span class="nc">ValueInfo</span><span class="o">[]</span> <span class="n">vinfos</span> <span class="o">=</span> <span class="o">{</span><span class="n">vinfo</span><span class="o">};</span>
<span class="c1">// perform the print operation</span>
<span class="n">gcsvr</span><span class="o">.</span><span class="na">perform</span><span class="o">(</span><span class="n">vinfos</span><span class="o">);</span>
</code></pre></div></div>
</article>
</div>
<div class="unit one-fifth hide-on-mobiles">
<aside>
<h4>Overview</h4>
<ul>
<li class=""><a href="/docs/arch.html">Architecture</a></li>
<li class=""><a href="/docs/features.html">Features</a></li>
<li class=""><a href="/docs/modes.html">Mnemonic Modes</a></li>
<li class=""><a href="/docs/memsrvcmp.html">Durable Memory Service Comparison</a></li>
<li class=""><a href="/docs/integration.html">Integration with other projects</a></li>
<li class=""><a href="/docs/domusecases.html">DOM Use Cases</a></li>
<li class=""><a href="/docs/dcmusecases.html">DCM Use Cases</a></li>
<li class=""><a href="/docs/msusecases.html">MS Use Cases</a></li>
<li class=""><a href="/docs/sparkusecases.html">Apache Spark Integration Use Cases</a></li>
<li class=""><a href="/docs/hadoopusecases.html">Apache Hadoop Integration Use Cases</a></li>
<li class=""><a href="/docs/gcdata.html">Java GC data</a></li>
<li class=""><a href="/docs/security.html">Security</a></li>
</ul>
<h4>Usage</h4>
<ul>
<li class=""><a href="/docs/getstarted.html">Get Started</a></li>
<li class=""><a href="/docs/devsetup.html">Development Setup</a></li>
<li class=""><a href="/docs/submitchanges.html">Submit Changes</a></li>
<li class=""><a href="/docs/build.html">Project Build</a></li>
<li class=""><a href="/docs/runtest.html">Run tests</a></li>
<li class=""><a href="/docs/docker.html">Docker usage</a></li>
</ul>
</aside>
</div>
<div class="clear"></div>
</div>
</section>
<footer role="contentinfo">
<p><div align="center">Apache Mnemonic, Mnemonic, Apache, and the Mnemonic logo are trademarks of The Apache Software Foundation.</div>
<div align="center"> Copyright &copy;&nbsp;2020 <a href="https://www.apache.org/">The Apache Software Foundation</a></div></p>
</footer>
<script>
var anchorForId = function (id) {
var anchor = document.createElement("a");
anchor.className = "header-link";
anchor.href = "#" + id;
anchor.innerHTML = "<span class=\"sr-only\">Permalink</span><i class=\"fa fa-link\"></i>";
anchor.title = "Permalink";
return anchor;
};
var linkifyAnchors = function (level, containingElement) {
var headers = containingElement.getElementsByTagName("h" + level);
for (var h = 0; h < headers.length; h++) {
var header = headers[h];
if (typeof header.id !== "undefined" && header.id !== "") {
header.appendChild(anchorForId(header.id));
}
}
};
document.onreadystatechange = function () {
if (this.readyState === "complete") {
var contentBlock = document.getElementsByClassName("docs")[0] || document.getElementsByClassName("news")[0];
if (!contentBlock) {
return;
}
for (var level = 1; level <= 6; level++) {
linkifyAnchors(level, contentBlock);
}
}
};
</script>
</body>
</html>