You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@thrift.apache.org by bu...@apache.org on 2018/03/05 17:18:44 UTC

svn commit: r1026304 - in /websites/staging/thrift/trunk/content: ./ lib/cl.html lib/index.html sitemap.html

Author: buildbot
Date: Mon Mar  5 17:18:44 2018
New Revision: 1026304

Log:
Staging update by buildbot for thrift

Added:
    websites/staging/thrift/trunk/content/lib/cl.html
Modified:
    websites/staging/thrift/trunk/content/   (props changed)
    websites/staging/thrift/trunk/content/lib/index.html
    websites/staging/thrift/trunk/content/sitemap.html

Propchange: websites/staging/thrift/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Mon Mar  5 17:18:44 2018
@@ -1 +1 @@
-1825916
+1825919

Added: websites/staging/thrift/trunk/content/lib/cl.html
==============================================================================
--- websites/staging/thrift/trunk/content/lib/cl.html (added)
+++ websites/staging/thrift/trunk/content/lib/cl.html Mon Mar  5 17:18:44 2018
@@ -0,0 +1,320 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
+    <meta content="en-us" http-equiv="Content-Language" />
+    <meta name="viewport" content="width=device-width, initial-scale=1.0">
+
+    <link href="/static/images/favicon.ico" rel="shortcut icon" />
+    <link href="/static/css/style.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/codehilite.css" rel="stylesheet" type="text/css" />
+    <link href="/static/css/bootstrap.css" media="screen, projection" rel="stylesheet" type="text/css" />
+
+    <script src="/static/js/jquery.min.js"></script>
+	  <script src="/static/js/bootstrap-dropdown.js"></script>
+    <script src="/static/js/bootstrap-tab.js"></script>
+	
+    <title>Apache Thrift - Common Lisp Library README</title>
+  </head>
+  <body>
+  	<div class="navbar">
+	<div class="navbar-inner">
+		<div class="container">
+			<a class="brand" href="/">Apache Thrift &trade;</a>
+			<div class="nav-collapse">
+				<ul class="nav pull-right">
+					<li>
+						<a href="/download">Download</a>
+					</li>
+					<li>
+						<a href="/docs">Documentation</a>
+					</li>
+					<li>
+						<a href="/developers">Developers</a>
+					</li>
+					<li>
+						<a href="/lib">Libraries</a>
+					</li>
+					<li>
+						<a href="/tutorial">Tutorial</a>
+					</li>
+					<li>
+						<a href="/test">Test Suite</a>
+					</li>
+					<li>
+						<a href="/about">About</a>
+					</li>
+					<li class="dropdown">
+						<a href="#" class="dropdown-toggle" data-toggle="dropdown">
+							Apache <b class="caret"></b>
+						</a>
+						<ul class="dropdown-menu">
+							<li>
+								<a href="http://www.apache.org/" target="_blank">Apache Home</a>
+							</li>
+							<li>
+								<a href="http://www.apache.org/licenses/" target="_blank">Apache License v2.0</a>
+							</li>
+							<li>
+								<a href="http://www.apache.org/foundation/sponsorship.html" target="_blank">Donate</a>
+							</li>
+							<li>
+								<a href="http://www.apache.org/foundation/thanks.html" target="_blank">Thanks</a>
+							</li>
+							<li>
+								<a href="http://www.apache.org/security/" target="_blank">Security</a>
+							</li>
+						</ul>
+					</li>
+				</ul>
+			</div>
+		</div>
+	</div>
+</div>
+
+  	<div class="container">
+          <style type="text/css">
+/* The following code is added by mdx_elementid.py
+   It was originally lifted from http://subversion.apache.org/style/site.css */
+/*
+ * Hide class="elementid-permalink", except when an enclosing heading
+ * has the :hover property.
+ */
+.headerlink, .elementid-permalink {
+  visibility: hidden;
+}
+h2:hover > .headerlink, h3:hover > .headerlink, h1:hover > .headerlink, h6:hover > .headerlink, h4:hover > .headerlink, h5:hover > .headerlink, dt:hover > .elementid-permalink { visibility: visible }</style>
+<h1 id="using-thrift-with-common-lisp">Using Thrift with Common Lisp<a class="headerlink" href="#using-thrift-with-common-lisp" title="Permanent link">&para;</a></h1>
+<p>Thrift is a protocol and library for language-independent communication between cooperating
+ processes. The communication takes the form of request and response messages, of which the forms
+ are specified in advance throufh a shared interface definition. A Thrift definition file is translated
+ into Lisp source files, which comprise several definitions:</p>
+<ul>
+<li>Three packages, one for the namespace of the implementation operators, and one each for request and
+  response operators.</li>
+<li>Various type definitions as implementations for Thrift typedef and enum definitions.</li>
+<li>DEF-STRUCT and DEF-EXCEPTION forms for Thrift struct and exception definitions.</li>
+<li>DEF-SERVICE forms for thrift service definitions.</li>
+</ul>
+<p>Each service definition expands in a collection of generic function definitions. For each <code>op</code>
+ in the service definition, two functions are defined</p>
+<ul>
+<li><code>op</code>-request is defined for use by a client. It accepts an additional initial <code>protocol</code> argument,
+    to act as the client proxy for the operation and mediate the interaction with a remote process
+    through a Thrift-encoded transport stream.</li>
+<li><code>op</code>-response is defined for use by a server. It accepts a single <code>protocol</code> argument. A server
+    uses it to decode the request message, invoke the base <code>op</code> function with the message arguments,
+    encode and send the the result as a response, and handles exceptions.</li>
+</ul>
+<p>The client interface is one operator</p>
+<ul>
+<li><code>with-client (variable location) . body</code> : creates a connection in a dynamic context and closes it
+    upon exit. The variable is bound to a client proxy stream/protocol instance, which wraps the
+    base i/o stream - socket, file, etc, with an operators which implement the Thrift protocol
+    and transport mechanisms.</li>
+</ul>
+<p>The server interface combines server and service objects</p>
+<ul>
+<li><code>serve (location service)</code> : accepts connections on the designated port and responds to
+    requests of the service's operations.</li>
+</ul>
+<h2 id="building">Building<a class="headerlink" href="#building" title="Permanent link">&para;</a></h2>
+<p>The Thrift Common Lisp library is packaged as the ASDF[[1]] system <code>thrift</code>.
+It depends on the systems</p>
+<ul>
+<li>puri[[2]] : for the thrift uri class</li>
+<li>closer-mop[[3]] : for class metadata</li>
+<li>trivial-utf-8[[4]] : for string codecs</li>
+<li>usocket[[5]] : for the socket transport</li>
+<li>ieee-floats[[6]] : for conversion between ints and floats</li>
+<li>trivial-gray-streams[[7]] : an abstraction layer for gray streams</li>
+<li>alexandria[[8]] : handy utilities</li>
+</ul>
+<p>The dependencies are bundled for local builds of tests and tutorial binaries - 
+it is possible to use those bundles to load the library, too.</p>
+<p>In order to build it, register those systems with ASDF and evaluate:</p>
+<div class="codehilite"><pre><span class="p">(</span><span class="n">asdf</span><span class="p">:</span><span class="n">load</span><span class="o">-</span><span class="n">system</span> <span class="p">:</span><span class="n">thrift</span><span class="p">)</span>
+</pre></div>
+
+
+<p>This will compile and load the Lisp compiler for Thrift definition files, the
+transport and protocol implementations, and the client and server interface
+functions. In order to use Thrift in an application, one must also author and/or
+load the interface definitions for the remote service.[[9]] If one is implementing a service,
+one must also define the actual functions to which Thrift is to act as the proxy
+interface. The remainder of this document follows the Thrift tutorial to illustrate how
+to perform the steps</p>
+<ul>
+<li>implement the service</li>
+<li>translate the Thrift IDL</li>
+<li>load the Lisp service interfaces</li>
+<li>run a server for the service</li>
+<li>use a client to access the service remotely</li>
+</ul>
+<p>Note that, if one is to implement a new service, one will also need to author the
+IDL files, as there is no facility to generate them from a service implementation.</p>
+<h2 id="implement-the-service">Implement the Service<a class="headerlink" href="#implement-the-service" title="Permanent link">&para;</a></h2>
+<p>The tutorial comprises serveral functions: <code>add</code>, <code>ping</code>, <code>zip</code>, and <code>calculate</code>.
+Each translated IDL file generates three packages for every service. In the case of
+the tutorial file, the relevant packages are:</p>
+<ul>
+<li>tutorial.calculator</li>
+<li>tutorial.calculator-implementation</li>
+<li>tutorial.calculator-response</li>
+</ul>
+<p>This is to separate the request (generated), response (generated) and implementation
+(meant to be implemented by the programmer) functions for defined Thrift methods.</p>
+<p>It is suggested to work in the <code>tutorial-implementation</code> package while implementing
+the services - it imports the <code>common-lisp</code> package, while the service-specific ones
+don't (to avoid conflicts between Thrift method names and function names in <code>common-lisp</code>).</p>
+<div class="codehilite"><pre><span class="p">;;</span> <span class="n">define</span> <span class="n">the</span> <span class="n">base</span> <span class="n">operations</span>
+
+<span class="p">(</span><span class="n">in</span><span class="o">-</span><span class="n">package</span> <span class="p">:</span><span class="n">tutorial</span><span class="o">-</span><span class="n">implementation</span><span class="p">)</span>
+
+<span class="p">(</span><span class="n">defun</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">calculator</span><span class="o">-</span><span class="n">implementation</span><span class="p">:</span><span class="n">add</span> <span class="p">(</span><span class="n">num1</span> <span class="n">num2</span><span class="p">)</span>
+  <span class="p">(</span><span class="n">format</span> <span class="n">t</span> &quot;<span class="o">~&amp;</span><span class="n">Asked</span> <span class="n">to</span> <span class="n">add</span> <span class="o">~</span><span class="n">A</span> <span class="n">and</span> <span class="o">~</span><span class="n">A</span><span class="p">.</span>&quot; <span class="n">num1</span> <span class="n">num2</span><span class="p">)</span>
+  <span class="p">(</span><span class="o">+</span> <span class="n">num1</span> <span class="n">num2</span><span class="p">))</span>
+
+<span class="p">(</span><span class="n">defun</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">calculator</span><span class="o">-</span><span class="n">implementation</span><span class="p">:</span><span class="n">ping</span> <span class="p">()</span>
+  <span class="p">(</span><span class="n">print</span> <span class="p">:</span><span class="n">ping</span><span class="p">))</span>
+
+<span class="p">(</span><span class="n">defun</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">calculator</span><span class="o">-</span><span class="n">implementation</span><span class="p">:</span><span class="n">zip</span> <span class="p">()</span>
+  <span class="p">(</span><span class="n">print</span> <span class="p">:</span><span class="n">zip</span><span class="p">))</span>
+
+<span class="p">(</span><span class="n">defun</span> <span class="n">tutorial</span><span class="p">.</span><span class="n">calculator</span><span class="o">-</span><span class="n">implementation</span><span class="p">:</span><span class="n">calculate</span> <span class="p">(</span><span class="n">logid</span> <span class="n">task</span><span class="p">)</span>
+  <span class="p">(</span><span class="n">calculate</span><span class="o">-</span><span class="n">op</span> <span class="p">(</span><span class="n">work</span><span class="o">-</span><span class="n">op</span> <span class="n">task</span><span class="p">)</span> <span class="p">(</span><span class="n">work</span><span class="o">-</span><span class="n">num1</span> <span class="n">task</span><span class="p">)</span> <span class="p">(</span><span class="n">work</span><span class="o">-</span><span class="n">num2</span> <span class="n">task</span><span class="p">)))</span>
+
+<span class="p">(</span><span class="n">defgeneric</span> <span class="n">calculate</span><span class="o">-</span><span class="n">op</span> <span class="p">(</span><span class="n">op</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">)</span>
+  <span class="p">(:</span><span class="n">method</span> <span class="p">:</span><span class="n">around</span> <span class="p">(</span><span class="n">op</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">)</span>
+    <span class="p">(</span><span class="n">let</span> <span class="p">((</span><span class="n">result</span> <span class="p">(</span><span class="n">call</span><span class="o">-</span><span class="n">next</span><span class="o">-</span><span class="n">method</span><span class="p">)))</span>
+      <span class="p">(</span><span class="n">format</span> <span class="n">t</span> &quot;<span class="o">~&amp;</span><span class="n">Asked</span> <span class="n">to</span> <span class="n">calculate</span><span class="p">:</span> <span class="o">~</span><span class="n">d</span> <span class="n">on</span>  <span class="o">~</span><span class="n">A</span> <span class="n">and</span> <span class="o">~</span><span class="n">A</span> <span class="p">=</span> <span class="o">~</span><span class="n">d</span><span class="p">.</span>&quot; <span class="n">op</span> <span class="n">arg1</span> <span class="n">arg2</span> <span class="n">result</span><span class="p">)</span>
+      <span class="n">result</span><span class="p">))</span>
+
+  <span class="p">(:</span><span class="n">method</span> <span class="p">((</span><span class="n">op</span> <span class="p">(</span><span class="n">eql</span> <span class="n">operation</span><span class="p">.</span><span class="n">add</span><span class="p">))</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">)</span>
+    <span class="p">(</span><span class="o">+</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">))</span>
+  <span class="p">(:</span><span class="n">method</span> <span class="p">((</span><span class="n">op</span> <span class="p">(</span><span class="n">eql</span> <span class="n">operation</span><span class="p">.</span><span class="n">subtract</span><span class="p">))</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">)</span>
+    <span class="p">(</span><span class="o">-</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">))</span>
+  <span class="p">(:</span><span class="n">method</span> <span class="p">((</span><span class="n">op</span> <span class="p">(</span><span class="n">eql</span> <span class="n">operation</span><span class="p">.</span><span class="n">multiply</span><span class="p">))</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">)</span>
+    <span class="p">(</span><span class="o">*</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">))</span>
+  <span class="p">(:</span><span class="n">method</span> <span class="p">((</span><span class="n">op</span> <span class="p">(</span><span class="n">eql</span> <span class="n">operation</span><span class="p">.</span><span class="n">divide</span><span class="p">))</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">)</span>
+    <span class="p">(</span><span class="o">/</span> <span class="n">arg1</span> <span class="n">arg2</span><span class="p">)))</span>
+
+<span class="p">(</span><span class="n">defun</span> <span class="n">zip</span> <span class="p">()</span> <span class="p">(</span><span class="n">print</span> <span class="s">&#39;</span><span class="err">zip))</span>
+</pre></div>
+
+
+<h2 id="translate-the-thrift-idl">Translate the Thrift IDL<a class="headerlink" href="#translate-the-thrift-idl" title="Permanent link">&para;</a></h2>
+<p>IDL files employ the file extension <code>thrift</code>. In this case, there are two files to translate
+  * <code>tutorial.thrift</code>
+  * <code>shared.thrift</code>
+As the former includes the latter, one uses it to generate the interfaces:</p>
+<div class="codehilite"><pre>$<span class="n">THRIFT</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">thrift</span> <span class="o">-</span><span class="n">r</span> <span class="o">--</span><span class="n">gen</span> <span class="n">cl</span> $<span class="n">THRIFT</span><span class="o">/</span><span class="n">tutorial</span><span class="o">/</span><span class="n">tutorial</span><span class="p">.</span><span class="n">thrift</span>
+</pre></div>
+
+
+<p><code>-r</code> stands for recursion, while <code>--gen</code> lets one choose the language to translate to.</p>
+<h2 id="load-the-lisp-translated-service-interfaces">Load the Lisp translated service interfaces<a class="headerlink" href="#load-the-lisp-translated-service-interfaces" title="Permanent link">&para;</a></h2>
+<p>The translator generates three files for each IDL file. For example <code>tutorial-types.lisp</code>,
+<code>tutorial-vars.lisp</code> and an <code>.asd</code> file that can be used to load them both and pull in
+other includes (like <code>shared</code> within the tutorial) as dependencies.</p>
+<h2 id="run-a-server-for-the-service">Run a Server for the Service<a class="headerlink" href="#run-a-server-for-the-service" title="Permanent link">&para;</a></h2>
+<p>The actual service name, as specified in the <code>def-service</code> form in <code>tutorial.lisp</code>, is <code>calculator</code>. 
+Each service definition defines a global variable with the service name and binds it to a
+service instance whch describes the operations.</p>
+<p>In order to start a service, specify a location and the service instance. </p>
+<div class="codehilite"><pre><span class="p">(</span><span class="n">in</span><span class="o">-</span><span class="n">package</span> <span class="p">:</span><span class="n">tutorial</span><span class="p">)</span>
+<span class="p">(</span><span class="n">serve</span> #<span class="n">u</span>&quot;<span class="n">thrift</span><span class="p">:</span><span class="o">//</span>127<span class="p">.</span>0<span class="p">.</span>0<span class="p">.</span>1<span class="p">:</span>9091&quot; <span class="n">calculator</span><span class="p">)</span>
+</pre></div>
+
+
+<h2 id="use-a-client-to-access-the-service-remotely">Use a Client to Access the Service Remotely<a class="headerlink" href="#use-a-client-to-access-the-service-remotely" title="Permanent link">&para;</a></h2>
+<p>[in some other process] run the client</p>
+<div class="codehilite"><pre><span class="p">(</span><span class="n">in</span><span class="o">-</span><span class="n">package</span> <span class="p">:</span><span class="n">cl</span><span class="o">-</span><span class="n">user</span><span class="p">)</span>
+
+<span class="p">(</span><span class="n">macrolet</span> <span class="p">((</span><span class="n">show</span> <span class="p">(</span><span class="n">form</span><span class="p">)</span>
+             `<span class="p">(</span><span class="n">format</span> <span class="o">*</span><span class="n">trace</span><span class="o">-</span><span class="n">output</span><span class="o">*</span> &quot;<span class="o">~</span><span class="c">%~s =&gt;~{ ~s~}&quot;</span>
+                      <span class="s">&#39;,form</span>
+<span class="s">                      (multiple-value-list (ignore-errors ,form)))))</span>
+<span class="s">  (with-client (protocol #u&quot;thrift://127.0.0.1:9091&quot;)</span>
+<span class="s">    (show (tutorial.calculator:ping protocol))</span>
+<span class="s">    (show (tutorial.calculator:add protocol 1 2))</span>
+<span class="s">    (show (tutorial.calculator:add protocol 1 4))</span>
+
+<span class="s">    (let ((task (make-instance &#39;</span><span class="n">tutorial</span><span class="p">:</span><span class="n">work</span>
+                  <span class="p">:</span><span class="n">op</span> <span class="n">operation</span><span class="p">.</span><span class="n">subtract</span> <span class="p">:</span><span class="n">num1</span> 15 <span class="p">:</span><span class="n">num2</span> 10<span class="p">)))</span>
+      <span class="p">(</span><span class="n">show</span> <span class="p">(</span><span class="n">tutorial</span><span class="p">.</span><span class="n">calculator</span><span class="p">:</span><span class="n">calculate</span> <span class="n">protocol</span> 1 <span class="n">task</span><span class="p">))</span>
+
+      <span class="p">(</span><span class="n">setf</span> <span class="p">(</span><span class="n">tutorial</span><span class="p">:</span><span class="n">work</span><span class="o">-</span><span class="n">op</span> <span class="n">task</span><span class="p">)</span> <span class="n">operation</span><span class="p">.</span><span class="n">divide</span>
+            <span class="p">(</span><span class="n">tutorial</span><span class="p">:</span><span class="n">work</span><span class="o">-</span><span class="n">num1</span> <span class="n">task</span><span class="p">)</span> 1
+            <span class="p">(</span><span class="n">tutorial</span><span class="p">:</span><span class="n">work</span><span class="o">-</span><span class="n">num2</span> <span class="n">task</span><span class="p">)</span> 0<span class="p">)</span>
+      <span class="p">(</span><span class="n">show</span> <span class="p">(</span><span class="n">tutorial</span><span class="p">.</span><span class="n">calculator</span><span class="p">:</span><span class="n">calculate</span> <span class="n">protocol</span> 1 <span class="n">task</span><span class="p">)))</span>
+
+    <span class="p">(</span><span class="n">show</span> <span class="p">(</span><span class="n">shared</span><span class="p">.</span><span class="n">shared</span><span class="o">-</span><span class="n">service</span><span class="p">:</span><span class="n">get</span><span class="o">-</span><span class="n">struct</span> <span class="n">protocol</span> 1<span class="p">))</span>
+
+    <span class="p">(</span><span class="n">show</span> <span class="p">(</span><span class="n">zip</span> <span class="n">protocol</span><span class="p">))))</span>
+</pre></div>
+
+
+<h2 id="issues">Issues<a class="headerlink" href="#issues" title="Permanent link">&para;</a></h2>
+<h3 id="optional-fields">optional fields<a class="headerlink" href="#optional-fields" title="Permanent link">&para;</a></h3>
+<p>Where the IDL declares a field options, the def-struct form includes no
+ initform for the slot and the encoding operator skips an unbound slot. This leave some ambiguity
+ with bool fields.</p>
+<h3 id="instantiation-protocol">instantiation protocol :<a class="headerlink" href="#instantiation-protocol" title="Permanent link">&para;</a></h3>
+<p>struct classes are standard classes and exception classes are
+ whatever the implementation prescribes. decoders apply make-struct to an initargs list.
+ particularly at the service end, there are advantages to resourcing structs and decoding
+ with direct side-effects on slot-values</p>
+<h3 id="maps">maps:<a class="headerlink" href="#maps" title="Permanent link">&para;</a></h3>
+<p>Maps are now represented as hash tables. As data through the call/reply interface is all statically
+ typed, it is not necessary for the objects to themselves indicate the coding form. Association lists
+ would be sufficient. As the key type is arbitrary, property lists offer no additional convenience:
+ as <code>getf</code> operates with <code>eq</code> a new access interface would be necessary and they would not be
+ available for function application.</p>
+<ul>
+<li>usocket[[5]] : for the socket transport</li>
+<li>ieee-floats[[6]] : for conversion between ints and floats</li>
+<li>trivial-gray-streams[[7]] : an abstraction layer for gray streams</li>
+<li>alexandria[[8]] : handy utilities
+<p class='snippet_footer'>
+  This page was generated by Apache Thrift's <strong>source tree docs</strong>:
+  <a href="http://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob;f=lib/cl/README.md;hb=HEAD"</a>lib/cl/README.md</a>
+</p></li>
+</ul>
+	</div>
+	<div class="container">
+	<hr>
+	<footer class="footer">
+		<div class="row">
+			<div class="span3">
+				<h3>Links</h3>
+				<ul class="unstyled">
+					<li><a href="/download">Download</a></li>
+					<li><a href="/developers">Developers</a></li>
+					<li><a href="/tutorial">Tutorials</a></li>
+			    </ul>
+				<ul class="unstyled">
+					<li><a href="/sitemap">Sitemap</a></li>
+				</ul>
+			</div>
+			<div class="span3">
+				<h3>Get Involved</h3>
+				<ul class="unstyled">
+					<li><a href="/mailing">Mailing Lists</a></li>
+					<li><a href="http://issues.apache.org/jira/browse/THRIFT">Issue Tracking</a></li>
+					<li><a href="/docs/HowToContribute">How To Contribute</a></li>
+				</ul>	
+			</div>
+			<div class="span6">
+				<a href="http://www.apache.org/"><img src="/static/images/feather.svg" onerror="this.src='/static/images/feather.png';this.onerror=null;" /></a> 
+				Copyright &copy;2017 <a href="http://www.apache.org/">Apache Software Foundation</a>. 
+				Licensed under the <a href="http://www.apache.org/licenses/">Apache License v2.0</a>. 
+				Apache, Apache Thrift, and the Apache feather logo are trademarks of The Apache Software Foundation.
+			</div>
+		</div>
+		
+	</footer>
+</div>
+
+  </body>
+</html>

Modified: websites/staging/thrift/trunk/content/lib/index.html
==============================================================================
--- websites/staging/thrift/trunk/content/lib/index.html (original)
+++ websites/staging/thrift/trunk/content/lib/index.html Mon Mar  5 17:18:44 2018
@@ -91,6 +91,7 @@ h2:hover > .headerlink, h3:hover > .head
 <p>Some language specific documentation is for the Apache Thrift Libraries are generated from lib/${language}/README.md files:</p>
 <ul>
 <li><a href="/lib/c_glib">C GLib</a></li>
+<li><a href="/lib/cl">Common Lisp Library README</a></li>
 <li><a href="/lib/cpp">C++ library</a></li>
 <li><a href="/lib/csharp">C# library</a></li>
 <li><a href="/lib/d">D library</a></li>

Modified: websites/staging/thrift/trunk/content/sitemap.html
==============================================================================
--- websites/staging/thrift/trunk/content/sitemap.html (original)
+++ websites/staging/thrift/trunk/content/sitemap.html Mon Mar  5 17:18:44 2018
@@ -119,6 +119,7 @@ h2:hover > .headerlink, h3:hover > .head
 <li><a href="/download">Download</a></li>
 <li><a href="/lib/">Index of lib/</a><ul>
 <li><a href="/lib/c_glib">C GLib</a></li>
+<li><a href="/lib/cl">Common Lisp Library README</a></li>
 <li><a href="/lib/cpp">C++ library</a></li>
 <li><a href="/lib/csharp">C# library</a></li>
 <li><a href="/lib/d">D library</a></li>