blob: 0d26cf5ed8e87983e9431ef5d7e217cc57ad23e2 [file] [log] [blame]
<!DOCTYPE HTML>
<html lang="en">
<head>
<!-- Generated by javadoc (17) -->
<title>SaslClientContext (Qpid ProtonJ2 Parent 1.0.0-M19 API)</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="description" content="declaration: package: org.apache.qpid.protonj2.engine.sasl, interface: SaslClientContext">
<meta name="generator" content="javadoc/ClassWriterImpl">
<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
<script type="text/javascript" src="../../../../../../script.js"></script>
</head>
<body class="class-declaration-page">
<script type="text/javascript">var evenRowColor = "even-row-color";
var oddRowColor = "odd-row-color";
var tableTab = "table-tab";
var activeTableTab = "active-table-tab";
</script>
<noscript>
<div>JavaScript is disabled on your browser.</div>
</noscript>
<div class="flex-box">
<header role="banner" class="flex-header">
<nav role="navigation">
<!-- ========= START OF TOP NAVBAR ======= -->
<div class="top-nav" id="navbar-top">
<div class="skip-nav"><a href="#skip-navbar-top" title="Skip navigation links">Skip navigation links</a></div>
<ul id="navbar-top-firstrow" class="nav-list" title="Navigation">
<li><a href="../../../../../../index.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="nav-bar-cell1-rev">Class</li>
<li><a href="class-use/SaslClientContext.html">Use</a></li>
<li><a href="package-tree.html">Tree</a></li>
<li><a href="../../../../../../help-doc.html#class">Help</a></li>
</ul>
</div>
<div class="sub-nav">
<div>
<ul class="sub-nav-list">
<li>Summary:&nbsp;</li>
<li><a href="#nested-class-summary">Nested</a>&nbsp;|&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method-summary">Method</a></li>
</ul>
<ul class="sub-nav-list">
<li>Detail:&nbsp;</li>
<li>Field&nbsp;|&nbsp;</li>
<li>Constr&nbsp;|&nbsp;</li>
<li><a href="#method-detail">Method</a></li>
</ul>
</div>
</div>
<!-- ========= END OF TOP NAVBAR ========= -->
<span class="skip-nav" id="skip-navbar-top"></span></nav>
</header>
<div class="flex-content">
<main role="main">
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
<div class="sub-title"><span class="package-label-in-type">Package</span>&nbsp;<a href="package-summary.html">org.apache.qpid.protonj2.engine.sasl</a></div>
<h1 title="Interface SaslClientContext" class="title">Interface SaslClientContext</h1>
</div>
<section class="class-description" id="class-description">
<dl class="notes">
<dt>All Superinterfaces:</dt>
<dd><code><a href="SaslContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslContext</a></code></dd>
</dl>
<hr>
<div class="type-signature"><span class="modifiers">public interface </span><span class="element-name type-name-label">SaslClientContext</span><span class="extends-implements">
extends <a href="SaslContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslContext</a></span></div>
<div class="block">SASL Client operating context used by an <a href="../Engine.html" title="interface in org.apache.qpid.protonj2.engine"><code>Engine</code></a> that has been
configured as a SASL client or that has initialed the SASL exchange by
being the first to initiate the AMQP header exchange.</div>
</section>
<section class="summary">
<ul class="summary-list">
<!-- ======== NESTED CLASS SUMMARY ======== -->
<li>
<section class="nested-class-summary" id="nested-class-summary">
<h2>Nested Class Summary</h2>
<div class="inherited-list">
<h2 id="nested-classes-inherited-from-class-org.apache.qpid.protonj2.engine.sasl.SaslContext">Nested classes/interfaces inherited from interface&nbsp;org.apache.qpid.protonj2.engine.sasl.<a href="SaslContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslContext</a></h2>
<code><a href="SaslContext.Role.html" title="enum in org.apache.qpid.protonj2.engine.sasl">SaslContext.Role</a></code></div>
</section>
</li>
<!-- ========== METHOD SUMMARY =========== -->
<li>
<section class="method-summary" id="method-summary">
<h2>Method Summary</h2>
<div id="method-summary-table">
<div class="table-tabs" role="tablist" aria-orientation="horizontal"><button id="method-summary-table-tab0" role="tab" aria-selected="true" aria-controls="method-summary-table.tabpanel" tabindex="0" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table', 3)" class="active-table-tab">All Methods</button><button id="method-summary-table-tab2" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab2', 3)" class="table-tab">Instance Methods</button><button id="method-summary-table-tab3" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab3', 3)" class="table-tab">Abstract Methods</button><button id="method-summary-table-tab5" role="tab" aria-selected="false" aria-controls="method-summary-table.tabpanel" tabindex="-1" onkeydown="switchTab(event)" onclick="show('method-summary-table', 'method-summary-table-tab5', 3)" class="table-tab">Default Methods</button></div>
<div id="method-summary-table.tabpanel" role="tabpanel">
<div class="summary-table three-column-summary" aria-labelledby="method-summary-table-tab0">
<div class="table-header col-first">Modifier and Type</div>
<div class="table-header col-second">Method</div>
<div class="table-header col-last">Description</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="SaslClientListener.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientListener</a></code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="#getListener()" class="member-name-link">getListener</a>()</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3">&nbsp;</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="SaslClientContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientContext</a></code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="#saslFailure(javax.security.sasl.SaslException)" class="member-name-link">saslFailure</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.security.sasl/javax/security/sasl/SaslException.html" title="class or interface in javax.security.sasl" class="external-link">SaslException</a>&nbsp;failure)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3">
<div class="block">Allows the client implementation to fail the SASL negotiation process due to some
unrecoverable error.</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab5"><code>default <a href="SaslClientContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientContext</a></code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab5"><code><a href="#sendChosenMechanism(java.lang.String,java.lang.String,org.apache.qpid.protonj2.buffer.ProtonBuffer)" class="member-name-link">sendChosenMechanism</a><wbr>(<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;mechanism,
<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;host,
<a href="../../buffer/ProtonBuffer.html" title="interface in org.apache.qpid.protonj2.buffer">ProtonBuffer</a>&nbsp;initialResponse)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab5">
<div class="block">Sends a response to the SASL server indicating the chosen mechanism for this
client and the host name that this client is identifying itself as.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="SaslClientContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientContext</a></code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="#sendChosenMechanism(org.apache.qpid.protonj2.types.Symbol,java.lang.String,org.apache.qpid.protonj2.buffer.ProtonBuffer)" class="member-name-link">sendChosenMechanism</a><wbr>(<a href="../../types/Symbol.html" title="class in org.apache.qpid.protonj2.types">Symbol</a>&nbsp;mechanism,
<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;host,
<a href="../../buffer/ProtonBuffer.html" title="interface in org.apache.qpid.protonj2.buffer">ProtonBuffer</a>&nbsp;initialResponse)</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3">
<div class="block">Sends a response to the SASL server indicating the chosen mechanism for this
client and the host name that this client is identifying itself as.</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="SaslClientContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientContext</a></code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="#sendResponse(org.apache.qpid.protonj2.buffer.ProtonBuffer)" class="member-name-link">sendResponse</a><wbr>(<a href="../../buffer/ProtonBuffer.html" title="interface in org.apache.qpid.protonj2.buffer">ProtonBuffer</a>&nbsp;response)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3">
<div class="block">Sends a response to a server side challenge that comprises the challenge / response
exchange for the chosen SASL mechanism.</div>
</div>
<div class="col-first odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="SaslClientContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientContext</a></code></div>
<div class="col-second odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="#sendSASLHeader()" class="member-name-link">sendSASLHeader</a>()</code></div>
<div class="col-last odd-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3">
<div class="block">Sends the AMQP Header indicating the desire for SASL negotiations to be commenced on
this connection.</div>
</div>
<div class="col-first even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="SaslClientContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientContext</a></code></div>
<div class="col-second even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3"><code><a href="#setListener(org.apache.qpid.protonj2.engine.sasl.SaslClientListener)" class="member-name-link">setListener</a><wbr>(<a href="SaslClientListener.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientListener</a>&nbsp;listener)</code></div>
<div class="col-last even-row-color method-summary-table method-summary-table-tab2 method-summary-table-tab3">
<div class="block">Sets the <a href="SaslClientListener.html" title="interface in org.apache.qpid.protonj2.engine.sasl"><code>SaslClientListener</code></a> that will be used to driver the client side SASL
negotiations with a connected "server".</div>
</div>
</div>
</div>
</div>
<div class="inherited-list">
<h3 id="methods-inherited-from-class-org.apache.qpid.protonj2.engine.sasl.SaslContext">Methods inherited from interface&nbsp;org.apache.qpid.protonj2.engine.sasl.<a href="SaslContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslContext</a></h3>
<code><a href="SaslContext.html#getAttachments()">getAttachments</a>, <a href="SaslContext.html#getChosenMechanism()">getChosenMechanism</a>, <a href="SaslContext.html#getHostname()">getHostname</a>, <a href="SaslContext.html#getLinkedResource()">getLinkedResource</a>, <a href="SaslContext.html#getLinkedResource(java.lang.Class)">getLinkedResource</a>, <a href="SaslContext.html#getRole()">getRole</a>, <a href="SaslContext.html#getSaslOutcome()">getSaslOutcome</a>, <a href="SaslContext.html#getSaslState()">getSaslState</a>, <a href="SaslContext.html#getServerMechanisms()">getServerMechanisms</a>, <a href="SaslContext.html#isClient()">isClient</a>, <a href="SaslContext.html#isDone()">isDone</a>, <a href="SaslContext.html#isServer()">isServer</a>, <a href="SaslContext.html#setLinkedResource(java.lang.Object)">setLinkedResource</a></code></div>
</section>
</li>
</ul>
</section>
<section class="details">
<ul class="details-list">
<!-- ============ METHOD DETAIL ========== -->
<li>
<section class="method-details" id="method-detail">
<h2>Method Details</h2>
<ul class="member-list">
<li>
<section class="detail" id="setListener(org.apache.qpid.protonj2.engine.sasl.SaslClientListener)">
<h3>setListener</h3>
<div class="member-signature"><span class="return-type"><a href="SaslClientContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientContext</a></span>&nbsp;<span class="element-name">setListener</span><wbr><span class="parameters">(<a href="SaslClientListener.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientListener</a>&nbsp;listener)</span></div>
<div class="block">Sets the <a href="SaslClientListener.html" title="interface in org.apache.qpid.protonj2.engine.sasl"><code>SaslClientListener</code></a> that will be used to driver the client side SASL
negotiations with a connected "server". As the server initiates or responds to the
various phases of the SASL negotiation the <a href="SaslClientListener.html" title="interface in org.apache.qpid.protonj2.engine.sasl"><code>SaslClientListener</code></a> will be notified
and allowed to respond.</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>listener</code> - The <a href="SaslClientListener.html" title="interface in org.apache.qpid.protonj2.engine.sasl"><code>SaslClientListener</code></a> to use for SASL negotiations, cannot be null.</dd>
<dt>Returns:</dt>
<dd>this client context.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="getListener()">
<h3>getListener</h3>
<div class="member-signature"><span class="return-type"><a href="SaslClientListener.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientListener</a></span>&nbsp;<span class="element-name">getListener</span>()</div>
<dl class="notes">
<dt>Returns:</dt>
<dd>the currently set <a href="SaslClientListener.html" title="interface in org.apache.qpid.protonj2.engine.sasl"><code>SaslClientListener</code></a> instance.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="sendSASLHeader()">
<h3>sendSASLHeader</h3>
<div class="member-signature"><span class="return-type"><a href="SaslClientContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientContext</a></span>&nbsp;<span class="element-name">sendSASLHeader</span>()
throws <span class="exceptions"><a href="../exceptions/EngineStateException.html" title="class in org.apache.qpid.protonj2.engine.exceptions">EngineStateException</a></span></div>
<div class="block">Sends the AMQP Header indicating the desire for SASL negotiations to be commenced on
this connection. The hosting application my wish to start SASL negotiations prior to
opening a <a href="../Connection.html" title="interface in org.apache.qpid.protonj2.engine"><code>Connection</code></a> in order to validation authentication state out of band
of the normal open process.</div>
<dl class="notes">
<dt>Returns:</dt>
<dd>this client context.</dd>
<dt>Throws:</dt>
<dd><code><a href="../exceptions/EngineStateException.html" title="class in org.apache.qpid.protonj2.engine.exceptions">EngineStateException</a></code> - if the <a href="../Engine.html" title="interface in org.apache.qpid.protonj2.engine"><code>Engine</code></a> has been shut down or a failure occurs processing this header.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="sendChosenMechanism(org.apache.qpid.protonj2.types.Symbol,java.lang.String,org.apache.qpid.protonj2.buffer.ProtonBuffer)">
<h3>sendChosenMechanism</h3>
<div class="member-signature"><span class="return-type"><a href="SaslClientContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientContext</a></span>&nbsp;<span class="element-name">sendChosenMechanism</span><wbr><span class="parameters">(<a href="../../types/Symbol.html" title="class in org.apache.qpid.protonj2.types">Symbol</a>&nbsp;mechanism,
<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;host,
<a href="../../buffer/ProtonBuffer.html" title="interface in org.apache.qpid.protonj2.buffer">ProtonBuffer</a>&nbsp;initialResponse)</span>
throws <span class="exceptions"><a href="../exceptions/EngineStateException.html" title="class in org.apache.qpid.protonj2.engine.exceptions">EngineStateException</a></span></div>
<div class="block">Sends a response to the SASL server indicating the chosen mechanism for this
client and the host name that this client is identifying itself as.</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>mechanism</code> - The chosen mechanism selected from the list the server provided.</dd>
<dd><code>host</code> - The host name that the client is identified as or null if none selected.</dd>
<dd><code>initialResponse</code> - The initial response data sent as defined by the chosen mechanism or null if none required.</dd>
<dt>Returns:</dt>
<dd>this client context.</dd>
<dt>Throws:</dt>
<dd><code><a href="../exceptions/EngineStateException.html" title="class in org.apache.qpid.protonj2.engine.exceptions">EngineStateException</a></code> - if the <a href="../Engine.html" title="interface in org.apache.qpid.protonj2.engine"><code>Engine</code></a> has been shut down or a failure occurs processing this mechanism.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="sendChosenMechanism(java.lang.String,java.lang.String,org.apache.qpid.protonj2.buffer.ProtonBuffer)">
<h3>sendChosenMechanism</h3>
<div class="member-signature"><span class="modifiers">default</span>&nbsp;<span class="return-type"><a href="SaslClientContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientContext</a></span>&nbsp;<span class="element-name">sendChosenMechanism</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;mechanism,
<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html" title="class or interface in java.lang" class="external-link">String</a>&nbsp;host,
<a href="../../buffer/ProtonBuffer.html" title="interface in org.apache.qpid.protonj2.buffer">ProtonBuffer</a>&nbsp;initialResponse)</span>
throws <span class="exceptions"><a href="../exceptions/EngineStateException.html" title="class in org.apache.qpid.protonj2.engine.exceptions">EngineStateException</a></span></div>
<div class="block">Sends a response to the SASL server indicating the chosen mechanism for this
client and the host name that this client is identifying itself as.</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>mechanism</code> - The chosen mechanism selected from the list the server provided.</dd>
<dd><code>host</code> - The host name that the client is identified as or null if none selected.</dd>
<dd><code>initialResponse</code> - The initial response data sent as defined by the chosen mechanism or null if none required.</dd>
<dt>Returns:</dt>
<dd>this client context.</dd>
<dt>Throws:</dt>
<dd><code><a href="../exceptions/EngineStateException.html" title="class in org.apache.qpid.protonj2.engine.exceptions">EngineStateException</a></code> - if the <a href="../Engine.html" title="interface in org.apache.qpid.protonj2.engine"><code>Engine</code></a> has been shut down or a failure occurs processing this mechanism.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="sendResponse(org.apache.qpid.protonj2.buffer.ProtonBuffer)">
<h3>sendResponse</h3>
<div class="member-signature"><span class="return-type"><a href="SaslClientContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientContext</a></span>&nbsp;<span class="element-name">sendResponse</span><wbr><span class="parameters">(<a href="../../buffer/ProtonBuffer.html" title="interface in org.apache.qpid.protonj2.buffer">ProtonBuffer</a>&nbsp;response)</span>
throws <span class="exceptions"><a href="../exceptions/EngineStateException.html" title="class in org.apache.qpid.protonj2.engine.exceptions">EngineStateException</a></span></div>
<div class="block">Sends a response to a server side challenge that comprises the challenge / response
exchange for the chosen SASL mechanism. The server may response with another challenge
or complete the SASL exchange by sending an outcome.</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>response</code> - The response bytes to be sent to the server for this cycle.</dd>
<dt>Returns:</dt>
<dd>this client context.</dd>
<dt>Throws:</dt>
<dd><code><a href="../exceptions/EngineStateException.html" title="class in org.apache.qpid.protonj2.engine.exceptions">EngineStateException</a></code> - if the <a href="../Engine.html" title="interface in org.apache.qpid.protonj2.engine"><code>Engine</code></a> has been shut down or a failure occurs processing this response.</dd>
</dl>
</section>
</li>
<li>
<section class="detail" id="saslFailure(javax.security.sasl.SaslException)">
<h3>saslFailure</h3>
<div class="member-signature"><span class="return-type"><a href="SaslClientContext.html" title="interface in org.apache.qpid.protonj2.engine.sasl">SaslClientContext</a></span>&nbsp;<span class="element-name">saslFailure</span><wbr><span class="parameters">(<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.security.sasl/javax/security/sasl/SaslException.html" title="class or interface in javax.security.sasl" class="external-link">SaslException</a>&nbsp;failure)</span></div>
<div class="block">Allows the client implementation to fail the SASL negotiation process due to some
unrecoverable error. Failing the process will signal the engine that the SASL process
has failed and place the engine in a failed state as well as notify the registered error
handler for the <a href="../Engine.html" title="interface in org.apache.qpid.protonj2.engine"><code>Engine</code></a>.
<p>
Once the SASL negotiation completes after an outcome has arrived calling this method
will not produce any effect as the SASL layer will be shutdown at this point, this
method is for failing negotiations that are ongoing. If a failed SASL outcome arrives
the client should take action by shutting down the engine or failing it to trigger
an event that is handled or by closing the I/O channel in use.</div>
<dl class="notes">
<dt>Parameters:</dt>
<dd><code>failure</code> - The exception to report to the <a href="../Engine.html" title="interface in org.apache.qpid.protonj2.engine"><code>Engine</code></a> that describes the failure.</dd>
<dt>Returns:</dt>
<dd>this client context.</dd>
</dl>
</section>
</li>
</ul>
</section>
</li>
</ul>
</section>
<!-- ========= END OF CLASS DATA ========= -->
</main>
<footer role="contentinfo">
<hr>
<p class="legal-copy"><small>Copyright &#169; 2024 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
</footer>
</div>
</div>
</body>
</html>