blob: 315a6e4316099f07d831f7a6977c08ccfd0d1deb [file] [log] [blame]
<!DOCTYPE html>
<!--[if IE]><![endif]-->
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>Interface ICacheStore&lt;TK, TV&gt;
| Apache Ignite.NET </title>
<meta name="viewport" content="width=device-width">
<meta name="title" content="Interface ICacheStore&lt;TK, TV&gt;
| Apache Ignite.NET ">
<meta name="generator" content="docfx 2.58.4.0">
<link rel="shortcut icon" href="../images/favicon.ico">
<link rel="stylesheet" href="../styles/docfx.vendor.css">
<link rel="stylesheet" href="../styles/docfx.css">
<link rel="stylesheet" href="../styles/main.css">
<meta property="docfx:navrel" content="../toc.html">
<meta property="docfx:tocrel" content="toc.html">
<meta property="docfx:rel" content="../">
</head>
<body data-spy="scroll" data-target="#affix" data-offset="120">
<div id="wrapper">
<header>
<nav id="autocollapse" class="navbar navbar-inverse ng-scope" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="../index.html">
<img id="logo" class="svg" src="../images/logo_ignite_32_32.png" alt="">
</a>
</div>
<div class="collapse navbar-collapse" id="navbar">
<form class="navbar-form navbar-right" role="search" id="search">
<div class="form-group">
<input type="text" class="form-control" id="search-query" placeholder="Search" autocomplete="off">
</div>
</form>
</div>
</div>
</nav>
<div class="subnav navbar navbar-default">
<div class="container hide-when-search" id="breadcrumb">
<ul class="breadcrumb">
<li></li>
</ul>
</div>
</div>
</header>
<div class="container body-content">
<div id="search-results">
<div class="search-list">Search Results for <span></span></div>
<div class="sr-items">
<p><i class="glyphicon glyphicon-refresh index-loading"></i></p>
</div>
<ul id="pagination" data-first="First" data-prev="Previous" data-next="Next" data-last="Last"></ul>
</div>
</div>
<div role="main" class="container body-content hide-when-search">
<div class="sidenav hide-when-search">
<a class="btn toc-toggle collapse" data-toggle="collapse" href="#sidetoggle" aria-expanded="false" aria-controls="sidetoggle">Show / Hide Table of Contents</a>
<div class="sidetoggle collapse" id="sidetoggle">
<div id="sidetoc"></div>
</div>
</div>
<div class="article row grid-right">
<div class="col-md-10">
<article class="content wrap" id="_content" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2">
<h1 id="Apache_Ignite_Core_Cache_Store_ICacheStore_2" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2" class="text-break">Interface ICacheStore&lt;TK, TV&gt;
</h1>
<div class="markdown level0 summary"><p>API for cache persistent storage for read-through and write-through behavior.
<p>
Generic argument types depend on <a class="xref" href="Apache.Ignite.Core.Cache.Configuration.CacheConfiguration.html#Apache_Ignite_Core_Cache_Configuration_CacheConfiguration_KeepBinaryInStore">KeepBinaryInStore</a> property.
When <code>true</code> (default), cache store operates on <a class="xref" href="Apache.Ignite.Core.Binary.IBinaryObject.html">IBinaryObject</a> instances.
Otherwise, generic arguments should be the same as in corresponding <a class="xref" href="Apache.Ignite.Core.Cache.ICache-2.html">ICache&lt;TK, TV&gt;</a>.
<p>
Persistent store is configured in Ignite&apos;s Spring XML configuration file via
<code>CacheConfiguration.setStore()</code> property. If you have an implementation
of cache store in .NET, you should use special Java wrapper which accepts assembly name and
class name of .NET store implementation (both properties are mandatory).</p>
<p>Optionally, you may specify &quot;properies&quot; property to set any property values on an instance of your store.
<example>
Here is an example:<p>
<pre><code>&lt;bean class=&quot;org.apache.ignite.configuration.CacheConfiguration&quot;>
...
&lt;property name=&quot;cacheStoreFactory&quot;>
&lt;bean class=&quot;org.apache.ignite.platform.dotnet.PlatformDotNetCacheStoreFactory&quot;>
&lt;property name=&quot;assemblyName&quot; value=&quot;MyAssembly&quot;/>
&lt;property name=&quot;className&quot; value=&quot;MyApp.MyCacheStore&quot;/>
&lt;property name=&quot;properties&quot;>
&lt;map>
&lt;entry key=&quot;IntProperty&quot;>
&lt;value type=&quot;java.lang.Integer&quot;>42&lt;/value>
&lt;/entry>
&lt;entry key=&quot;StringProperty&quot; value=&quot;String value&quot;/>
&lt;/map>
&lt;/property>
&lt;/bean>
&lt;/property>
...
&lt;/bean></code></pre>
<p></example>
Assemply name and class name are passed to <a target="_blank" href="http://msdn.microsoft.com/en-us/library/d133hta4.aspx"><strong>System.Activator.CreateInstance(String, String)</strong></a>
method during node startup to create an instance of cache store. Refer to its documentation for details.
<p>
All transactional operations of this API are provided with ongoing <a class="xref" href="Apache.Ignite.Core.Transactions.ITransaction.html">ITransaction</a>,
if any. You can attach any metadata to transaction, e.g. to recognize if several operations
belong to the same transaction or not.
<example>
Here is an example of how attach a ODBC connection as transaction metadata:<p>
<pre><code>OdbcConnection conn = tx.Meta(&quot;some.name&quot;);
if (conn == null)
{
conn = ...; // Create or get connection.
// Store connection in transaction metadata, so it can be accessed
// for other operations on the same transaction.
tx.AddMeta(&quot;some.name&quot;, conn);
}</code></pre>
<p></example></p>
</div>
<div class="markdown level0 conceptual"></div>
<h6><strong>Namespace</strong>: <a class="xref" href="Apache.Ignite.Core.Cache.Store.html">Apache.Ignite.Core.Cache.Store</a></h6>
<h6><strong>Assembly</strong>: Apache.Ignite.Core.dll</h6>
<h5 id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_syntax">Syntax</h5>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">public interface ICacheStore&lt;TK, TV&gt; : ICacheStore</code></pre>
</div>
<h5 class="typeParameters">Type Parameters</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="parametername">TK</span></td>
<td><p>Key type.</p>
</td>
</tr>
<tr>
<td><span class="parametername">TV</span></td>
<td><p>Value type.</p>
</td>
</tr>
</tbody>
</table>
<h3 id="methods">Methods
</h3>
<a id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_Delete_" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.Delete*"></a>
<h4 id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_Delete__0_" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.Delete(`0)">Delete(TK)</h4>
<div class="markdown level1 summary"><p>Delete the cache entry from the external resource.
<p>
Expiry of a cache entry is not a delete hence will not cause this method to be invoked.
<p>
This method is invoked even if no mapping for the key exists.</p>
</div>
<div class="markdown level1 conceptual"></div>
<h5 class="decalaration">Declaration</h5>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">void Delete(TK key)</code></pre>
</div>
<h5 class="parameters">Parameters</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="xref">TK</span></td>
<td><span class="parametername">key</span></td>
<td><p>The key that is used for the delete operation.</p>
</td>
</tr>
</tbody>
</table>
<h5 class="exceptions">Exceptions</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Condition</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="Apache.Ignite.Core.Cache.Store.CacheStoreException.html">CacheStoreException</a></td>
<td></td>
</tr>
</tbody>
</table>
<a id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_DeleteAll_" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.DeleteAll*"></a>
<h4 id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_DeleteAll_IEnumerable__0__" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.DeleteAll(IEnumerable{`0})">DeleteAll(IEnumerable&lt;TK&gt;)</h4>
<div class="markdown level1 summary"><p>Remove data and keys from the external resource for the given collection of keys, if present.
<p>
The order that individual deletes occur is undefined.
<p>
If this operation fails (by throwing an exception) after a partial success,
the writer must remove any successfully written entries from the entries collection
so that the caching implementation knows what succeeded and can mutate the cache.
<p>
Expiry of a cache entry is not a delete hence will not cause this method to be invoked.
<p>
This method may include keys even if there is no mapping for that key,
in which case the data represented by that key should be removed from the underlying resource.</p>
</div>
<div class="markdown level1 conceptual"></div>
<h5 class="decalaration">Declaration</h5>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">void DeleteAll(IEnumerable&lt;TK&gt; keys)</code></pre>
</div>
<h5 class="parameters">Parameters</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="xref">IEnumerable</span>&lt;TK&gt;</td>
<td><span class="parametername">keys</span></td>
<td><p>a mutable collection of keys for entries to delete. Upon invocation,
it contains the keys to delete for write-through. Upon return the collection must only contain
the keys that were not successfully deleted.</p>
</td>
</tr>
</tbody>
</table>
<h5 class="exceptions">Exceptions</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Condition</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="Apache.Ignite.Core.Cache.Store.CacheStoreException.html">CacheStoreException</a></td>
<td></td>
</tr>
</tbody>
</table>
<a id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_Load_" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.Load*"></a>
<h4 id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_Load__0_" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.Load(`0)">Load(TK)</h4>
<div class="markdown level1 summary"><p>Loads an object. Application developers should implement this method to customize the loading
of a value for a cache entry.
This method is called by a cache when a requested entry is not in the cache.
If the object can&apos;t be loaded <code>null</code> should be returned.</p>
</div>
<div class="markdown level1 conceptual"></div>
<h5 class="decalaration">Declaration</h5>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">TV Load(TK key)</code></pre>
</div>
<h5 class="parameters">Parameters</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="xref">TK</span></td>
<td><span class="parametername">key</span></td>
<td><p>The key identifying the object being loaded.</p>
</td>
</tr>
</tbody>
</table>
<h5 class="returns">Returns</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="xref">TV</span></td>
<td><p>The value for the entry that is to be stored in the cache
or <code>null</code> if the object can&apos;t be loaded</p>
</td>
</tr>
</tbody>
</table>
<h5 class="exceptions">Exceptions</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Condition</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="Apache.Ignite.Core.Cache.Store.CacheStoreException.html">CacheStoreException</a></td>
<td></td>
</tr>
</tbody>
</table>
<a id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_LoadAll_" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.LoadAll*"></a>
<h4 id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_LoadAll_IEnumerable__0__" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.LoadAll(IEnumerable{`0})">LoadAll(IEnumerable&lt;TK&gt;)</h4>
<div class="markdown level1 summary"><p>Loads multiple objects. Application developers should implement this method to customize
the loading of cache entries. This method is called when the requested object is not in the cache.
If an object can&apos;t be loaded, it is not returned in the resulting map.</p>
</div>
<div class="markdown level1 conceptual"></div>
<h5 class="decalaration">Declaration</h5>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">IEnumerable&lt;KeyValuePair&lt;TK, TV&gt;&gt; LoadAll(IEnumerable&lt;TK&gt; keys)</code></pre>
</div>
<h5 class="parameters">Parameters</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="xref">IEnumerable</span>&lt;TK&gt;</td>
<td><span class="parametername">keys</span></td>
<td><p>Keys identifying the values to be loaded.</p>
</td>
</tr>
</tbody>
</table>
<h5 class="returns">Returns</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="xref">IEnumerable</span>&lt;<span class="xref">KeyValuePair</span>&lt;TK, TV&gt;&gt;</td>
<td><p>A map of key, values to be stored in the cache.</p>
</td>
</tr>
</tbody>
</table>
<h5 class="exceptions">Exceptions</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Condition</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="Apache.Ignite.Core.Cache.Store.CacheStoreException.html">CacheStoreException</a></td>
<td></td>
</tr>
</tbody>
</table>
<a id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_LoadCache_" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.LoadCache*"></a>
<h4 id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_LoadCache_Action__0__1__System_Object___" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.LoadCache(Action{`0,`1},System.Object[])">LoadCache(Action&lt;TK, TV&gt;, Object[])</h4>
<div class="markdown level1 summary"><p>Loads all values from underlying persistent storage. Note that keys are
not passed, so it is up to implementation to figure out what to load.
This method is called whenever <a class="xref" href="Apache.Ignite.Core.Cache.ICache-2.html#Apache_Ignite_Core_Cache_ICache_2_LocalLoadCache_Apache_Ignite_Core_Cache_ICacheEntryFilter__0__1__System_Object___">LocalLoadCache(ICacheEntryFilter&lt;TK, TV&gt;, Object[])</a>
method is invoked which is usually to preload the cache from persistent storage.
<p>
This method is optional, and cache implementation
does not depend on this method to do anything.
<p>
For every loaded value method provided action should be called.
The action will then make sure that the loaded value is stored in cache.</p>
</div>
<div class="markdown level1 conceptual"></div>
<h5 class="decalaration">Declaration</h5>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">void LoadCache(Action&lt;TK, TV&gt; act, params object[] args)</code></pre>
</div>
<h5 class="parameters">Parameters</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="xref">Action</span>&lt;TK, TV&gt;</td>
<td><span class="parametername">act</span></td>
<td><p>Action for loaded values.</p>
</td>
</tr>
<tr>
<td><span class="xref">System.Object</span>[]</td>
<td><span class="parametername">args</span></td>
<td><p>Optional arguemnts passed to <a class="xref" href="Apache.Ignite.Core.Cache.ICache-2.html#Apache_Ignite_Core_Cache_ICache_2_LocalLoadCache_Apache_Ignite_Core_Cache_ICacheEntryFilter__0__1__System_Object___">LocalLoadCache(ICacheEntryFilter&lt;TK, TV&gt;, Object[])</a> method.</p>
</td>
</tr>
</tbody>
</table>
<h5 class="exceptions">Exceptions</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Condition</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="Apache.Ignite.Core.Cache.Store.CacheStoreException.html">CacheStoreException</a></td>
<td></td>
</tr>
</tbody>
</table>
<a id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_SessionEnd_" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.SessionEnd*"></a>
<h4 id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_SessionEnd_System_Boolean_" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.SessionEnd(System.Boolean)">SessionEnd(Boolean)</h4>
<div class="markdown level1 summary"><p>Tells store to commit or rollback a transaction depending on the value of the
<code>commit</code> parameter.</p>
</div>
<div class="markdown level1 conceptual"></div>
<h5 class="decalaration">Declaration</h5>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">void SessionEnd(bool commit)</code></pre>
</div>
<h5 class="parameters">Parameters</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="xref">System.Boolean</span></td>
<td><span class="parametername">commit</span></td>
<td><p><code>True</code> if transaction should commit, <code>false</code> for rollback.</p>
</td>
</tr>
</tbody>
</table>
<h5 class="exceptions">Exceptions</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Condition</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="Apache.Ignite.Core.Cache.Store.CacheStoreException.html">CacheStoreException</a></td>
<td></td>
</tr>
</tbody>
</table>
<a id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_Write_" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.Write*"></a>
<h4 id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_Write__0__1_" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.Write(`0,`1)">Write(TK, TV)</h4>
<div class="markdown level1 summary"><p>Write the specified value under the specified key to the external resource.
<p>
This method is intended to support both key/value creation and value update.</p>
</div>
<div class="markdown level1 conceptual"></div>
<h5 class="decalaration">Declaration</h5>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">void Write(TK key, TV val)</code></pre>
</div>
<h5 class="parameters">Parameters</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="xref">TK</span></td>
<td><span class="parametername">key</span></td>
<td><p>Key to write.</p>
</td>
</tr>
<tr>
<td><span class="xref">TV</span></td>
<td><span class="parametername">val</span></td>
<td><p>Value to write.</p>
</td>
</tr>
</tbody>
</table>
<h5 class="exceptions">Exceptions</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Condition</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="Apache.Ignite.Core.Cache.Store.CacheStoreException.html">CacheStoreException</a></td>
<td></td>
</tr>
</tbody>
</table>
<a id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_WriteAll_" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.WriteAll*"></a>
<h4 id="Apache_Ignite_Core_Cache_Store_ICacheStore_2_WriteAll_IEnumerable_KeyValuePair__0__1___" data-uid="Apache.Ignite.Core.Cache.Store.ICacheStore`2.WriteAll(IEnumerable{KeyValuePair{`0,`1}})">WriteAll(IEnumerable&lt;KeyValuePair&lt;TK, TV&gt;&gt;)</h4>
<div class="markdown level1 summary"><p>Write the specified entries to the external resource.
This method is intended to support both insert and update.
<p>
The order that individual writes occur is undefined.
<p>
If this operation fails (by throwing an exception) after a partial success,
the writer must remove any successfully written entries from the entries collection
so that the caching implementation knows what succeeded and can mutate the cache.</p>
</div>
<div class="markdown level1 conceptual"></div>
<h5 class="decalaration">Declaration</h5>
<div class="codewrapper">
<pre><code class="lang-csharp hljs">void WriteAll(IEnumerable&lt;KeyValuePair&lt;TK, TV&gt;&gt; entries)</code></pre>
</div>
<h5 class="parameters">Parameters</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><span class="xref">IEnumerable</span>&lt;<span class="xref">KeyValuePair</span>&lt;TK, TV&gt;&gt;</td>
<td><span class="parametername">entries</span></td>
<td><p>a mutable collection to write. Upon invocation, it contains the entries
to write for write-through. Upon return the collection must only contain entries
that were not successfully written. (see partial success above).</p>
</td>
</tr>
</tbody>
</table>
<h5 class="exceptions">Exceptions</h5>
<table class="table table-bordered table-striped table-condensed">
<thead>
<tr>
<th>Type</th>
<th>Condition</th>
</tr>
</thead>
<tbody>
<tr>
<td><a class="xref" href="Apache.Ignite.Core.Cache.Store.CacheStoreException.html">CacheStoreException</a></td>
<td></td>
</tr>
</tbody>
</table>
</article>
</div>
<div class="hidden-sm col-md-2" role="complementary">
<div class="sideaffix">
<nav class="bs-docs-sidebar hidden-print hidden-xs hidden-sm affix" id="affix">
<h5>In This Article</h5>
<div></div>
</nav>
</div>
</div>
</div>
</div>
<footer>
<div class="grad-bottom"></div>
<div class="footer">
<div class="container">
<span class="pull-right">
<a href="#top">Back to top</a>
</span>
© 2015 - 2019 The Apache Software Foundation
</div>
</div>
</footer>
</div>
<script type="text/javascript" src="../styles/docfx.vendor.js"></script>
<script type="text/javascript" src="../styles/docfx.js"></script>
<script type="text/javascript" src="../styles/main.js"></script>
</body>
</html>