Fix link
[metaproxy-moved-to-github.git] / doc / book.xml
index 03e08cf..dffd474 100644 (file)
@@ -2,7 +2,8 @@
 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1//EN"
     "http://www.oasis-open.org/docbook/xml/4.1/docbookx.dtd" 
 [
-     <!ENTITY local SYSTEM "local.ent">
+     <!ENTITY % local SYSTEM "local.ent">
+     %local;
      <!ENTITY manref SYSTEM "manref.xml">
      <!ENTITY progref SYSTEM "progref.xml">
      <!ENTITY % common SYSTEM "common/common.ent">
      -->
      <!NOTATION PDF SYSTEM "PDF">
 ]>
-<!-- $Id: book.xml,v 1.41 2006-10-12 11:34:07 marc Exp $ -->
+<!-- $Id: book.xml,v 1.55 2007-01-25 10:34:27 adam Exp $ -->
 <book id="metaproxy">
  <bookinfo>
   <title>Metaproxy - User's Guide and Reference</title>
-  <author>
-   <firstname>Adam</firstname><surname>Dickmeiss</surname>
-  </author>
-  <author>
-   <firstname>Marc</firstname><surname>Cromme</surname>
-  </author>
-  <author>
-   <firstname>Mike</firstname><surname>Taylor</surname>
-  </author>
+  <authorgroup>
+   <author>
+    <firstname>Adam</firstname><surname>Dickmeiss</surname>
+   </author>
+   <author>
+    <firstname>Marc</firstname><surname>Cromme</surname>
+   </author>
+   <author>
+    <firstname>Mike</firstname><surname>Taylor</surname>
+   </author>
+  </authorgroup>
+  <releaseinfo>&version;</releaseinfo>
   <copyright>
-   <year>2006</year>
+   <year>2005-2007</year>
    <holder>Index Data ApS</holder>
   </copyright>
   <abstract>
    <simpara>
+    This manual is part of Metaproxy version &version;.
+    </simpara>
+   <simpara>
     Metaproxy is a universal router, proxy and encapsulated
     metasearcher for information retrieval protocols.  It accepts,
     processes, interprets and redirects requests from IR clients using
-    standard protocols such as
+    standard protocols such as the binary
     <ulink url="&url.z39.50;">ANSI/NISO Z39.50</ulink>
-    (and in the future <ulink url="&url.sru;">SRU</ulink>
-    and <ulink url="&url.srw;">SRW</ulink>), as
+    and  the information search and retireval 
+    web services <ulink url="&url.sru;">SRU</ulink>
+    and <ulink url="&url.srw;">SRW</ulink>, as
     well as functioning as a limited
     <ulink url="&url.http;">HTTP</ulink> server. 
+   </simpara>
+   <simpara>
     Metaproxy is configured by an XML file which
     specifies how the software should function in terms of routes that
     the request packets can take through the proxy, each step on a
@@ -79,7 +89,7 @@
   
   <para>
    <ulink url="&url.metaproxy;">Metaproxy</ulink>
-   is a standalone program that acts as a universal router, proxy and
+   is a stand alone program that acts as a universal router, proxy and
    encapsulated metasearcher for information retrieval protocols such
    as <ulink url="&url.z39.50;">Z39.50</ulink>, and in the future
    <ulink url="&url.sru;">SRU</ulink> and <ulink url="&url.srw;">SRW</ulink>.
    being more powerful, flexible, configurable and extensible.  Among
    its many advantages over the older, more pedestrian work are
    support for multiplexing (encapsulated metasearching), routing by
-   database name, authentication and authorisation and serving local
+   database name, authentication and authorization and serving local
    files via HTTP.  Equally significant, its modular architecture
    facilitites the creation of pluggable modules implementing further
    functionality.
      You may modify your copy of the software (fix bugs, add features)
      if you need to.  We encourage you to send your changes back to us for
      integration into the master copy, but you are not obliged to do so.  You
-      may NOT pass your changes on to any other party.
+     may NOT pass your changes on to any other party.
     </para>
    </listitem>
    <listitem>
    for more information.
   </para>
   <para>
-   We have succesfully built Metaproxy using the compilers
+   We have successfully built Metaproxy using the compilers
    <ulink url="&url.gcc;">GCC</ulink> version 4.0 and
    <ulink url="&url.vstudio;">Microsoft Visual Studio</ulink> 2003/2005.
   </para>
      <literal>\boost\lib</literal>, <literal>\boost\include</literal>.
     </para>
     <para>
-     For more informatation about installing Boost refer to the
+     For more information about installing Boost refer to the
      <ulink url="&url.boost.getting.started;">getting started</ulink>
      pages.
     </para>
      <ulink url="&url.libxml2.download.win32;">here</ulink>.
     </para>
     <para>
-     Libxslt has other dependencies, but thes can all be downloaded
+     Libxslt has other dependencies, but these can all be downloaded
      from the same site. Get the following:
      iconv, zlib, libxml2, libxslt.
     </para>
    <section id="installation.windows.metaproxy">
     <title>Metaproxy</title>
     <para>
-     Metaproxy is shipped with NMAKE makfiles as well - similar
+     Metaproxy is shipped with NMAKE makefiles as well - similar
      to those found in the YAZ++/YAZ packages. Adjust this Makefile
      to point to the proper locations of Boost, Libxslt, Libxml2,
      zlib, iconv, yaz and yazpp.
     </variablelist>
     
     <para>
-     After succesful compilation you'll find
+     After successful compilation you'll find
      <literal>metaproxy.exe</literal> in the
      <literal>bin</literal> directory.
     </para>
      <para>
       In general, packages are doctored as they pass through
       Metaproxy.  For example, when the proxy performs authentication
-      and authorisation on a Z39.50 Init request, it removes the
+      and authorization on a Z39.50 Init request, it removes the
       authentication credentials from the package so that they are not
       passed onto the back-end server; and when search-response
       packages are obtained from multiple servers, they are merged
       plugins that provide new filters.  The filter API is small and
       conceptually simple, but there are many details to master.  See
       the section below on
-      <link linkend="extensions">extensions</link>.
+      <link linkend="filters">Filters</link>.
      </para>
     </listitem>
    </varlistentry>
     packages
     (<literal>frontend_net</literal>);
     others are sinks: they consume packages and return a result
-    (<literal>z3950_client</literal>,
-    <literal>backend_test</literal>,
+    (<literal>backend_test</literal>,
     <literal>bounce</literal>,
-    <literal>http_file</literal>);
+    <literal>http_file</literal>, 
+    <literal>z3950_client</literal>);
     the others are true filters, that read, process and pass on the
     packages they are fed
     (<literal>auth_simple</literal>,
    <para>
     We now briefly consider each of the types of filter supported by
     the core Metaproxy binary.  This overview is intended to give a
-    flavour of the available functionality; more detailed information
+    flavor of the available functionality; more detailed information
     about each type of filter is included below in
-    <link linkend="filterref"
-         >the reference guide to Metaproxy filters</link>.
+    <xref linkend="reference"/>.
    </para>
    <para>
     The filters are here named by the string that is used as the
@@ -696,7 +705,7 @@ Figure out what additional information we need in:
     <title><literal>auth_simple</literal>
      (mp::filter::AuthSimple)</title>
     <para>
-     Simple authentication and authorisation.  The configuration
+     Simple authentication and authorization.  The configuration
      specifies the name of a file that is the user register, which
      lists <varname>username</varname>:<varname>password</varname>
      pairs, one per line, colon separated. When a session begins, it
@@ -732,8 +741,8 @@ Figure out what additional information we need in:
      sets Z39.50 packages to Z_Close, and HTTP_Request packages to
      HTTP_Response err code 400 packages, and adds a suitable bounce
      message. 
-     The bounce filter is usually added at end of each filter chain
-     config.xml to prevent infinite hanging of for example HTTP
+     The bounce filter is usually added at end of each filter chain route
+     to prevent infinite hanging of for example HTTP
      requests packages when only the Z39.50 client partial sink 
      filter is found in the
      route.  
@@ -741,13 +750,26 @@ Figure out what additional information we need in:
    </section>
    
    <section>
+    <title><literal>cql_rpn</literal>
+    (mp::filter::CQLtoRPN)</title>
+    <para>
+     A query language transforming filter which catches Z39.50 
+     <literal>searchRequest</literal>
+     packages containing <literal>CQL</literal> queries, transforms
+     those to <literal>RPN</literal> queries,
+     and sends the <literal>searchRequests</literal> on to the next
+     filters. It is among other things useful in a SRU context. 
+    </para>
+   </section>
+   
+   <section>
     <title><literal>frontend_net</literal>
      (mp::filter::FrontendNet)</title>
     <para>
      A source that accepts Z39.50 connections from a port
      specified in the configuration, reads protocol units, and
      feeds them into the next filter in the route.  When the result is
-     revceived, it is returned to the original origin.
+     received, it is returned to the original origin.
     </para>
    </section>
 
@@ -755,7 +777,8 @@ Figure out what additional information we need in:
     <title><literal>http_file</literal>
      (mp::filter::HttpFile)</title>
     <para>
-     A partial sink which swallows only HTTP_Request packages, and 
+     A partial sink which swallows only 
+     <literal>HTTP_Request</literal> packages, and 
      returns the contents of files from the local
      filesystem in response to HTTP requests.  
      It lets Z39.50 packages and all other forthcoming package types
@@ -768,6 +791,26 @@ Figure out what additional information we need in:
    </section>
    
    <section>
+    <title><literal>load_balance</literal>
+     (mp::filter::LoadBalance)</title>
+    <para>
+     Performs load balancing for incoming Z39.50 init requests.
+     It is used together with the <literal>virt_db</literal> filter,
+     but unlike the <literal>multi</literal> filter it does send an
+     entire session to only one of the virtual backends. The 
+     <literal>load_balance</literal> filter is assuming that
+     all backend targets have equal content, and chooses the backend
+     with least load cost for a new session.
+    <warning>
+     <para>
+      This filter is experimental and yet not mature for heavy load
+      production sites.
+     </para>
+    </warning>
+   </para>
+   </section>
+      
+   <section>
     <title><literal>log</literal>
      (mp::filter::Log)</title>
     <para>
@@ -776,7 +819,7 @@ Figure out what additional information we need in:
      as multiple different logging formats.
    </para>
    </section>
-   
+
    <section>
    <title><literal>multi</literal>
      (mp::filter::Multi)</title>
@@ -792,7 +835,9 @@ Figure out what additional information we need in:
    <title><literal>query_rewrite</literal>
      (mp::filter::QueryRewrite)</title>
     <para>
-     Rewrites Z39.50 Type-1 and Type-101 (``RPN'') queries by a
+     Rewrites Z39.50 <literal>Type-1</literal> 
+     and <literal>Type-101</literal> (``<literal>RPN</literal>'') 
+     queries by a
      three-step process: the query is transliterated from Z39.50
      packet structures into an XML representation; that XML
      representation is transformed by an XSLT stylesheet; and the
@@ -809,9 +854,9 @@ Figure out what additional information we need in:
      This filter acts only on Z3950 present requests, and let all
      other types of packages and requests pass untouched. It's use is
      twofold: blocking Z3950  present requests, which the backend
-     server does not understand and can not honour, and transforming
+     server does not understand and can not honor, and transforming
      the present syntax and elementset name according to the rules
-     specified, to fetch only exisitng record formats, and transform
+     specified, to fetch only existing record formats, and transform
      them on the fly to requested record syntaxes.
     </para>
    </section>
@@ -820,18 +865,11 @@ Figure out what additional information we need in:
     <title><literal>session_shared</literal>
      (mp::filter::SessionShared)</title>
     <para>
-     When this is finished, it will implement global sharing of
+     This filter implements global sharing of
      result sets (i.e. between threads and therefore between
-     clients), yielding performance improvements especially when
-     incoming requests are from a stateless environment such as a
-     web-server, in which the client process representing a session
-     might be any one of many.  However:
+     clients), yielding performance improvements by clever resource
+     pooling. 
     </para>
-    <warning>
-     <para>
-      This filter is not yet completed.
-     </para>
-    </warning>
    </section>
 
    <section>
@@ -839,8 +877,20 @@ Figure out what additional information we need in:
     (mp::filter::SRUtoZ3950)</title>
     <para>
      This filter transforms valid
-     SRU/GET or SRU/SOAP requests to Z3950 requests, and wraps the
-     recieved hit counts and XML records into suitable SRU response messages.
+     SRU GET/POST/SOAP searchRetrieve requests to Z3950 init, search,
+     and present requests, and wraps the
+     received hit counts and XML records into suitable SRU response
+     messages.
+     The <literal>sru_z3950</literal> filter  processes also  SRU
+     GET/POST/SOAP explain requests, returning
+     either the absolute minimum required by the standard, or a  full 
+     pre-defined ZeeReX explain record.
+     See the 
+     <ulink url="&url.zeerex.explain;">ZeeReX Explain</ulink>
+     standard pages and the 
+     <ulink url="&url.sru.explain;">SRU Explain</ulink> pages
+     for more information on the correct explain syntax.
+     SRU scan requests are not supported yet.
     </para>
    </section>
    
@@ -888,6 +938,29 @@ Figure out what additional information we need in:
      are passed untouched. 
     </para>
   </section>
+
+
+   <section>
+    <title><literal>zeerex_explain</literal>
+     (mp::filter::ZeerexExplain)</title>
+    <para>
+     This filter acts as a sink for
+     Z39.50 explain requests, returning a static ZeeReX
+     Explain XML record from the config section. All other packages
+     are passed through.
+     See the 
+     <ulink url="&url.zeerex.explain;">ZeeReX Explain</ulink>
+     standard pages
+     for more information on the correct explain syntax.
+    </para>
+    <warning>
+     <para>
+      This filter is not yet completed.
+     </para>
+    </warning>
+   </section>
+   
+
   </section>
   
   
@@ -910,34 +983,10 @@ Figure out what additional information we need in:
      </listitem>
     </varlistentry>
     <varlistentry>
-     <term><literal>frontend_sru</literal> (source)</term>
-     <listitem>
-      <para>
-       Receive SRU (and perhaps SRW) requests.
-     </para>
-     </listitem>
-    </varlistentry>
-    <varlistentry>
-     <term><literal>sru2z3950</literal> (filter)</term>
-     <listitem>
-      <para>
-       Translate SRU requests into Z39.50 requests.
-     </para>
-     </listitem>
-    </varlistentry>
-    <varlistentry>
      <term><literal>sru_client</literal> (sink)</term>
      <listitem>
       <para>
-       SRU searching and retrieval.
-      </para>
-     </listitem>
-    </varlistentry>
-    <varlistentry>
-     <term><literal>srw_client</literal> (sink)</term>
-     <listitem>
-      <para>
-       SRW searching and retrieval.
+       SRU/GET and SRU/SOAP searching and retrieval.
       </para>
      </listitem>
     </varlistentry>
@@ -964,16 +1013,11 @@ Figure out what additional information we need in:
    <para>
     If Metaproxy is an interpreter providing operations on packages, then
     its configuration file can be thought of as a program for that
-    interpreter.  Configuration is by means of a single file, the name
+    interpreter.  Configuration is by means of a single XML file, the name
     of which is supplied as the sole command-line argument to the
     <command>metaproxy</command> program.  (See
-    <link linkend="progref">the reference guide</link>
-    below for more information on invoking Metaproxy.)
-   </para>
-   <para>
-    The configuration files are written in XML.  (But that's just an
-    implementation detail - they could just as well have been written
-    in YAML or Lisp-like S-expressions, or in a custom syntax.)
+    <xref linkend="reference"/> below for more information on invoking
+    Metaproxy.)
    </para>
   </section>
   
@@ -981,15 +1025,15 @@ Figure out what additional information we need in:
    <title>Overview of the config file XML structure</title>
    <para>
     All elements and attributes are in the namespace
-    <ulink url="http://indexdata.dk/yp2/config/1"/>.
+    <ulink url="http://indexdata.com/metaproxy"/>.
      This is most easily achieved by setting the default namespace on
      the top-level element, as here:
    </para>
    <screen>
-    &lt;yp2 xmlns="http://indexdata.dk/yp2/config/1"&gt;
+    &lt;metaproxy xmlns="http://indexdata.com/metaproxy" version="1.0"&gt;
    </screen>
    <para>
-    The top-level element is &lt;yp2&gt;.  This contains a
+    The top-level element is &lt;metaproxy&gt;.  This contains a
     &lt;start&gt; element, a &lt;filters&gt; element and a
     &lt;routes&gt; element, in that order.  &lt;filters&gt; is
     optional; the other two are mandatory.  All three are
@@ -1009,7 +1053,7 @@ Figure out what additional information we need in:
     and contain various elements that provide suitable configuration
     for a filter of its type.  The filter-specific elements are
     described in
-    <link linkend="filterref">the reference guide below</link>.
+    <xref linkend="reference"/>.
     Filters defined in this part of the file must carry an
     <literal>id</literal> attribute so that they can be referenced
     from elsewhere.
@@ -1045,7 +1089,7 @@ Figure out what additional information we need in:
     client-server dialogues.
    </para>
    <screen><![CDATA[<?xml version="1.0"?>
-<yp2 xmlns="http://indexdata.dk/yp2/config/1">
+<metaproxy xmlns="http://indexdata.com/metaproxy" version="1.0">
   <start route="start"/>
   <filters>
     <filter id="frontend" type="frontend_net">
@@ -1062,7 +1106,7 @@ Figure out what additional information we need in:
       <filter type="bounce"/>
     </route>
   </routes>
-</yp2>
+</metaproxy>
 ]]></screen>
    <para>
     It works by defining a single route, called
@@ -1084,7 +1128,7 @@ Figure out what additional information we need in:
     <literal>z3950_client</literal> filter, with the response data
     filled by the external Z39.50 server targeted.
     All non-Z39.50 packages are passed through to the
-    <literal>bounce</literal> filter, which defitely bounces
+    <literal>bounce</literal> filter, which definitely bounces
     everything, including fish, bananas, cold pyjamas,
     mutton, beef and trout packages.
     When the response arrives, it is handed
@@ -1093,12 +1137,31 @@ Figure out what additional information we need in:
     which returns the response to the client.
    </para>
   </section>
-  <section id="checking.xml.syntax">
+
+  <section id="config-file-modularity">
+   <title>Config file modularity</title>
+   <para>
+    Metaproxy XML configuration snippets can be reused by other
+    filters using the <literal>XInclude</literal> standard, as seen in
+    the <literal>/etc/config-sru-to-z3950.xml</literal> example SRU 
+    configuration.
+   <screen><![CDATA[
+    <filter id="sru" type="sru_z3950">
+      <database name="Default">
+       <xi:include xmlns:xi="http://www.w3.org/2001/XInclude"
+                    href="explain.xml"/>
+      </database>
+    </filter>
+]]></screen>
+    </para>
+  </section>
+
+  <section id="config-file-syntax-check">
    <title>Config file syntax checking</title>
    <para>
     The distribution contains RelaxNG Compact and XML syntax checking
     files, as well as XML Schema files. These are found in the
-    distribution pathes 
+    distribution paths 
    <screen>
     xml/schema/metaproxy.rnc
     xml/schema/metaproxy.rng
@@ -1141,14 +1204,14 @@ Figure out what additional information we need in:
     The interaction between
     these two filters is necessarily complex: it reflects the real,
     irreducible complexity of multi-database searching in a protocol such
-    as Z39.50 that separates initialisation from searching, and in
-    which the database to be searched is not known at initialisation
+    as Z39.50 that separates initialization from searching, and in
+    which the database to be searched is not known at initialization
     time.
    </para>
    <para>
     It's possible to use these filters without understanding the
     details of their functioning and the interaction between them; the
-    next two sections of this chapter are ``HOWTO'' guides for doing
+    next two sections of this chapter are ``HOW-TO'' guides for doing
     just that.  However, debugging complex configurations will require
     a deeper understanding, which the last two sections of this
     chapters attempt to provide.
@@ -1186,7 +1249,7 @@ Figure out what additional information we need in:
   </virtual>
   <virtual>
     <database>marc</database>
-    <target>indexdata.dk/marc</target>
+    <target>indexdata.com/marc</target>
   </virtual>
 </filter>]]></screen>
    <para>
@@ -1211,7 +1274,7 @@ Figure out what additional information we need in:
     Index Data's tiny testing database of MARC records:
    </para>
    <screen><![CDATA[<?xml version="1.0"?>
-<yp2 xmlns="http://indexdata.dk/yp2/config/1">
+<metaproxy xmlns="http://indexdata.com/metaproxy" version="1.0">
   <start route="start"/>
   <routes>
     <route id="start">
@@ -1226,12 +1289,12 @@ Figure out what additional information we need in:
         </virtual>
         <virtual>
           <database>marc</database>
-          <target>indexdata.dk/marc</target>
+          <target>indexdata.com/marc</target>
         </virtual>
         <virtual>
           <database>all</database>
           <target>z3950.loc.gov:7090/voyager</target>
-          <target>indexdata.dk/marc</target>
+          <target>indexdata.com/marc</target>
         </virtual>
       </filter>
       <filter type="multi"/>
@@ -1241,7 +1304,7 @@ Figure out what additional information we need in:
       <filter type="bounce"/>
     </route>
   </routes>
-</yp2>]]></screen>
+</metaproxy>]]></screen>
    <para>
     (Using a
     <literal>virt_db</literal>
@@ -1345,7 +1408,7 @@ Z>
     can be inconvenient in deployment, when users typically don't want
     to be bothered with problems of this kind and prefer just to get
     the records from the databases that are available.  To obtain this
-    latter behaviour add an empty
+    latter behavior add an empty
     <literal>&lt;hideunavailable&gt;</literal>
     element inside the
     <literal>multi</literal> filter:
@@ -1480,9 +1543,8 @@ Z>
        [Here there should be a diagram showing the progress of
        packages through the filters during a simple virtual-database
        search and a multi-database search, but is seems that your
-       toolchain has not been able to include the diagram in this
-       document.  This is because of LaTeX suckage.  Time to move to
-       OpenOffice.  Yes, really.]
+       tool chain has not been able to include the diagram in this
+       document.]
       </phrase>
      </textobject>
 <!-- ### This used to work with an older version of DocBook
  </chapter>
 
 
+ <chapter id="sru-server">
+  <title>Combined SRU webservice and Z39.50 server configuration</title>
+  <para>
+   Metaproxy can act as 
+   <ulink url="&url.sru;">SRU</ulink> and 
+   <ulink url="&url.srw;">SRW</ulink> 
+   web service server, which translates web service requests to 
+   <ulink url="&url.z39.50;">ANSI/NISO Z39.50</ulink> packages and
+   sends them off to common available targets.
+  </para>
+  <para>
+  A typical setup for this operation needs a filter route including the
+  following modules: 
+  </para>
+   
+  <table id="sru-server-table-config" frame="top">
+   <title>SRU/Z39.50 Server Filter Route Configuration</title>
+   <tgroup cols="3">
+    <thead>
+     <row>
+      <entry>Filter</entry>
+      <entry>Importance</entry>
+      <entry>Purpose</entry>
+     </row>
+    </thead>
+    
+    <tbody>
+     <row>
+      <entry><literal>frontend_net</literal></entry>
+      <entry>required</entry>
+      <entry>Accepting HTTP connections and passing them to following
+      filters. Since this filter also accepts Z39.50 connections, the
+      server works as SRU and Z39.50 server on the same port.</entry>
+     </row>
+     <row>
+      <entry><literal>sru_z3950</literal></entry>
+      <entry>required</entry>
+      <entry>Accepting SRU GET/POST/SOAP explain and
+       searchRetrieve requests for the the configured databases.
+       Explain requests are directly served from the static XML configuration.
+       SearchRetrieve requests are
+       transformed  to Z39.50 search and present packages.
+       All other HTTP and Z39.50 packages are passed unaltered.</entry>
+     </row>
+     <row>
+      <entry><literal>http_file</literal></entry>
+      <entry>optional</entry>
+      <entry>Serving HTTP requests from the filesystem. This is only
+      needed if the server should serve XSLT stylesheets, static HTML
+      files or Java Script for thin browser based clients.
+       Z39.50 packages are passed unaltered.</entry>
+     </row>
+     <row>
+      <entry><literal>cql_rpn</literal></entry>
+      <entry>required</entry>
+      <entry>Usually, Z39.50 servers do not talk CQL, hence the
+      translation of the CQL query language to RPN is mandatory in
+      most cases. Affects only  Z39.50 search packages.</entry>
+     </row>
+     <row>
+      <entry><literal>record_transform</literal></entry>
+      <entry>optional</entry>
+      <entry>Some Z39.50 backend targets can not present XML record
+      syntaxes in common wanted element sets. using this filter, one
+      can transform binary MARC records to MARCXML records, and
+      further transform those to any needed XML schema/format by XSLT
+      transformations. Changes only  Z39.50 present packages.</entry>
+     </row>
+     <row>
+      <entry><literal>session_shared</literal></entry>
+      <entry>optional</entry>
+      <entry>The stateless nature of web services requires frequent
+      re-searching of the same targets for display of paged result set
+      records. This might be an unacceptable burden for the accessed
+      backend Z39.50 targets, and this mosule can be added for
+      efficient backend target resource pooling.</entry>
+     </row>
+     <row>
+      <entry><literal>z3950_client</literal></entry>
+      <entry>required</entry>
+      <entry>Finally, a Z39.50 package sink is needed in the filter
+      chain to provide the response packages. The Z39.50 client module
+      is used to access external targets over the network, but any
+      coming local Z39.50 package sink could be used instead of.</entry>
+     </row>
+     <row>
+      <entry><literal>bounce</literal></entry>
+      <entry>required</entry>
+      <entry>Any Metaproxy package arriving here did not do so by
+      purpose, and is bounced back with connection closure. this
+      prevents inifinite package hanging inside the SRU server.</entry>
+     </row>
+    </tbody>
+   </tgroup>
+  </table>
+  <para> 
+   A typical minimal example  <ulink url="&url.sru;">SRU</ulink> and 
+   <ulink url="&url.srw;">SRW</ulink> server configuration file is found
+   in the tarball distribution at 
+   <literal>etc/config-sru-to-z3950.xml</literal>.
+  </para> 
+  <para>
+   Off course, any other metaproxy modules can be integrated into a
+   SRU server solution, including, but not limited to, load balancing, 
+   multiple target querying 
+   (see  <xref linkend="multidb"/>), and complex RPN query rewrites. 
+  </para>
 
+
+ </chapter>
+
+ <!--
  <chapter id="extensions">
   <title>Writing extensions for Metaproxy</title>
   <para>### To be written</para>
  </chapter>
-
+ -->
 
 
 
@@ -1514,7 +1687,7 @@ Z>
    <para>
     <emphasis>Stop!  Do not read this!</emphasis>
     You won't enjoy it at all.  You should just skip ahead to
-    <link linkend="refguide">the reference guide</link>,
+    <xref linkend="reference"/>,
     which tells
     <!-- The remainder of this paragraph is lifted verbatim from
     Douglas Adams' _Hitch Hiker's Guide to the Galaxy_, chapter 8 -->
@@ -1529,7 +1702,7 @@ Z>
    <para>
     This chapter contains documentation of the Metaproxy source code, and is
     of interest only to maintainers and developers.  If you need to
-    change Metaproxy's behaviour or write a new filter, then you will most
+    change Metaproxy's behavior or write a new filter, then you will most
     likely find this chapter helpful.  Otherwise it's a waste of your
     good time.  Seriously: go and watch a film or something.
     <citetitle>This is Spinal Tap</citetitle> is particularly good.
@@ -1595,7 +1768,7 @@ Z>
      that part of the configuration file that pertains to this filter
      instance, and is expected to walk that tree extracting relevant
      information.  And <literal>process()</literal> processes a
-     package (see below).  That surface simplicitly is a bit
+     package (see below).  That surface simplicity is a bit
      misleading, as <literal>process()</literal> needs to know a lot
      about the <literal>Package</literal> class in order to do
      anything useful.
@@ -1613,12 +1786,7 @@ Z>
      <filename>filter_*.cpp</filename> respectively.  All the header
      files should be pretty much identical, in that they declare the
      class, including a private <literal>Rep</literal> class and a
-     member pointer to it, and the two public methods.  The only extra
-     information in any filter header is additional private types and
-     members (which should really all be in the <literal>Rep</literal>
-     anyway) and private methods (which should also remain known only
-     to the source file, but C++'s brain-damaged design requires this
-     dirty laundry to be exhibited in public.  Thanks, Bjarne!)
+     member pointer to it, and the two public methods.
     </para>
     <para>
      The source file for each filter needs to supply:
@@ -1768,9 +1936,9 @@ Z>
  </chapter>
  
  
- <reference id="refguide">
-  <title>Reference guide</title>
+ <reference id="reference">
+  <title>Reference</title>
+   <partintro>
     <para>
      The material in this chapter is drawn directly from the individual
      manual entries.  In particular, the Metaproxy invocation section is
@@ -1778,7 +1946,8 @@ Z>
      on each individual filter is available using the name of the filter
      as the argument to the <command>man</command> command.
     </para>
-    &manref;
+   </partintro>
+   &manref;
  </reference>
 </book>