Rule for making PDF from EPS.
[metaproxy-moved-to-github.git] / doc / book.xml
index d6e6f8d..8034eb8 100644 (file)
@@ -1,4 +1,4 @@
-<!-- $Id: book.xml,v 1.10 2006-04-20 12:42:47 adam Exp $ -->
+<!-- $Id: book.xml,v 1.22 2006-04-27 12:26:26 adam Exp $ -->
  <bookinfo>
   <title>Metaproxy - User's Guide and Reference</title>
   <author>
@@ -9,16 +9,20 @@
   </author>
   <copyright>
    <year>2006</year>
-   <holder>Index Data</holder>
+   <holder>Index Data ApS</holder>
   </copyright>
   <abstract>
    <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 ANSI/NISO Z39.50 (and in the future SRU
-    and SRW), as well as functioning as a limited
-    HTTP server.  Metaproxy is configured by an XML file which
+    standard protocols such as
+    <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
+    well as functioning as a limited
+    <ulink url="&url.http;">HTTP</ulink> server. 
+    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
     route being an instantiation of a filter.  Filters come in many
     should not at this stage redistribute the code without explicit
     written permission from the copyright holders, Index Data ApS.
    </simpara>
+   <simpara>
+    <inlinemediaobject>
+     <imageobject>
+      <imagedata fileref="common/id.png" format="PNG"/>
+     </imageobject>
+     <imageobject>
+      <imagedata fileref="common/id.eps" format="EPS"/>
+     </imageobject>
+    </inlinemediaobject>
+   </simpara>
   </abstract>
  </bookinfo>
 
   <title>Introduction</title>
   
   
-   <para>
-    <ulink url="http://www.indexdata.com/metaproxy/">Metaproxy</ulink>
-    is a standalone program that acts as a universal router, proxy and
-    encapsulated metasearcher for information retrieval protocols such
-    as Z39.50, and in the future SRU and SRW.  To clients, it acts as a
-    server of these
-    protocols: it can be searched, records can be retrieved from it,
-    etc.  To servers, it acts as a client: it searches in them,
-    retrieves records from them, etc.  it satisfies its clients'
-    requests by transforming them, multiplexing them, forwarding them
-    on to zero or more servers, merging the results, transforming
-    them, and delivering them back to the client.  In addition, it
-    acts as a simple HTTP server; support for further protocols can be
-    added in a modular fashion, through the creation of new filters.
-   </para>
-   <screen>
-    Anything goes in!
-    Anything goes out!
-    Cold bananas, fish, pyjamas,
-    Mutton, beef and trout!
+  <para>
+   <ulink url="&url.metaproxy;">Metaproxy</ulink>
+   is a standalone 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>.
+   To clients, it acts as a server of these protocols: it can be searched,
+   records can be retrieved from it, etc. 
+   To servers, it acts as a client: it searches in them,
+   retrieves records from them, etc.  it satisfies its clients'
+   requests by transforming them, multiplexing them, forwarding them
+   on to zero or more servers, merging the results, transforming
+   them, and delivering them back to the client.  In addition, it
+   acts as a simple <ulink url="&url.http;">HTTP</ulink> server; support
+   for further protocols can be added in a modular fashion, through the
+   creation of new filters.
+  </para>
+  <screen>
+   Anything goes in!
+   Anything goes out!
+   Fish, bananas, cold pyjamas,
+   Mutton, beef and trout!
        - attributed to Cole Porter.
-   </screen>
-   <para>
-    Metaproxy is a more capable alternative to
-    <ulink url="http://www.indexdata.com/yazproxy/">YAZ Proxy</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
-    files via HTTP.  Equally significant, its modular architecture
-    facilitites the creation of pluggable modules implementing further
-    functionality.
-   </para>
+  </screen>
+  <para>
+   Metaproxy is a more capable alternative to
+   <ulink url="&url.yazproxy;">YAZ Proxy</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
+   files via HTTP.  Equally significant, its modular architecture
+   facilitites the creation of pluggable modules implementing further
+   functionality.
+  </para>
+  <para>
+   This manual will briefly describe Metaproxy's licensing situation
+   before giving an overview of its architecture, then discussing the
+   key concept of a filter in some depth and giving an overview of
+   the various filter types, then discussing the configuration file
+   format.  After this come several optional chapters which may be
+   freely skipped: a detailed discussion of virtual databases and
+   multi-database searching, some notes on writing extensions
+   (additional filter types) and a high-level description of the
+   source code.  Finally comes the reference guide, which contains
+   instructions for invoking the <command>metaproxy</command>
+   program, and detailed information on each type of filter,
+   including examples.
+  </para>
  </chapter>
 
 
   <title>The Metaproxy Licence</title>
   <para>
    <emphasis role="strong">
-     No decision has yet been made on the terms under which
-     Metaproxy will be distributed.
+    No decision has yet been made on the terms under which
+    Metaproxy will be distributed.
    </emphasis>
    It is possible that, unlike
    other Index Data products, metaproxy may not be released under a
   </para>
  </chapter>
 
+ <chapter id="installation">
+  <title>Installation</title>
+  <para>
+   Metaproxy depends on the following tools/libraries:
+   <variablelist>
+    <varlistentry><term><ulink url="&url.yazplusplus;">YAZ++</ulink></term>
+     <listitem>
+      <para>
+       This is a C++ library based on <ulink url="&url.yaz;">YAZ</ulink>.
+      </para>
+     </listitem>
+    </varlistentry>
+    <varlistentry><term><ulink url="&url.libxslt;">Libxslt</ulink></term>
+     <listitem>
+      <para>This is an XSLT processor - based on 
+       <ulink url="&url.libxml2;">Libxml2</ulink>. Both Libxml2 and
+       Libxslt must be installed with the development components
+       (header files, etc.) as well as the run-time libraries.
+      </para>
+     </listitem>
+    </varlistentry>
+    <varlistentry><term><ulink url="&url.boost;">Boost</ulink></term>
+     <listitem>
+      <para>
+       The popular C++ library. Initial versions of Metaproxy
+       was built with 1.33.0. Version 1.33.1 works too.
+      </para>
+     </listitem>
+    </varlistentry>
+   </variablelist>
+  </para>
+  <para>
+   In order to compile Metaproxy a modern C++ compiler is
+   required. Boost, in particular, requires the C++ compiler
+   to facilitate the newest features. Refer to Boost
+   <ulink url="&url.boost.compilers.status;">Compiler Status</ulink>
+   for more information.
+  </para>
+  <para>
+   We have succesfully used Metaproxy with Boost using the compilers
+   <ulink url="&url.gcc;">GCC</ulink> version 4.0 and
+   <ulink url="&url.vstudio;">Microsoft Visual Studio</ulink> 2003/2005.
+  </para>
 
+  <section id="installation.unix">
+   <title>Installation on Unix (from Source)</title>
+   <para>
+    Here is a quick step-by-step guide on how to compile all the
+    tools that Metaproxy uses. Only few systems have none of the required
+    tools binary packages. If, for example, Libxml2/libxslt are already
+    installed as development packages use those (and omit compilation).
+   </para>
+   
+   <para>
+    Libxml2/libxslt:
+   </para>
+   <screen>
+    gunzip -c libxml2-version.tar.gz|tar xf -
+    cd libxml2-version
+    ./configure
+    make
+    su
+    make install
+   </screen>
+   <screen>
+    gunzip -c libxslt-version.tar.gz|tar xf -
+    cd libxslt-version
+    ./configure
+    make
+    su
+    make install
+   </screen>
+   <para>
+    YAZ/YAZ++:
+   </para>
+   <screen>
+    gunzip -c yaz-version.tar.gz|tar xf -
+    cd yaz-version
+    ./configure
+    make
+    su
+    make install
+   </screen>
+   <screen>
+    gunzip -c yazpp-version.tar.gz|tar xf -
+    cd yazpp-version
+    ./configure
+    make
+    su
+    make install
+   </screen>
+   <para>
+    Boost:
+   </para>
+   <screen>
+    gunzip -c boost-version.tar.gz|tar xf -
+    cd boost-version
+    ./configure
+    make
+    su
+    make install
+   </screen>
+   <para>
+    Metaproxy:
+   </para>
+   <screen>
+    gunzip -c metaproxy-version.tar.gz|tar xf -
+    cd metaproxy-version
+    ./configure
+    make
+    su
+    make install
+   </screen>
+  </section>
+
+  <section id="installation.debian">
+   <title>Installation on Debian</title>
+   <para>
+    ### To be written
+   </para>
+   </section>
 
+  <section id="installation.windows">
+   <title>Installation on Windows</title>
+   <para>
+    Compilation of Metaproxy can be done using
+    Microsoft <ulink url="&url.vstudio;">Visual Studio</ulink>.
+    We know Version 2003 works. We expect Version 2005 to
+    work as well.
+   </para>
+   <section id="installation.windows.boost">
+    <title>Boost</title>
+    <para>
+     Get Boost from its <ulink url="&url.boost;">home page</ulink>.
+     You also need Boost Jam (an alternative to make).
+     That's also available from this
+     home page. The files download are called something like:
+     <literal>boost_1_33-1.exe</literal>
+     and
+     <literal>boost-jam-3.1.12-1-ntx86.zip</literal>.
+     Unpack Boost Jam first. Put <literal>bjam.exe</literal>
+     in your system path. Make a command prompt and ensure
+     it can be found automatically. If not check the PATH.
+     The Boost .exe is a self-extracting exe with
+     complete source for Boost. Compile that source with
+     Boost Jam (An alternative to Make).
+     The compilation takes a while.
+     By default, the Boost build process puts the resulting
+     libraries + header files in
+     <literal>\boost\lib</literal>, <literal>\boost\include</literal>.
+    </para>
+    <para>
+     For more informatation about installing Boost refer to the
+     <ulink url="&url.boost.getting.started;">getting started</ulink>
+     pages.
+    </para>
+   </section>
+
+   <section id="installation.windows.libxslt">
+    <title>Libxslt</title>
+    <para>
+     <ulink url="&url.libxslt;">Libxslt</ulink> can be downloaded
+     for Windows from
+     <ulink url="&url.libxml2.download.win32;">here</ulink>.
+    </para>
+    <para>
+     Libxslt has other dependencies, but thes can all be downloaded
+     from the same site. Get the following:
+     iconv, zlib, libxml2, libxslt.
+    </para>
+   </section>
+
+   <section id="installation.windows.yaz">
+    <title>YAZ</title>
+    <para>
+     <ulink url="&url.yaz;">YAZ</ulink> can be downloaded
+     for Windows from
+     <ulink url="&url.yaz.download.win32;">here</ulink>.
+    </para>
+   </section>
+
+   <section id="installation.windows.yazplusplus">
+    <title>YAZ++</title>
+    <para>
+     Get <ulink url="&url.yazplusplus;">YAZ++</ulink> as well.
+     Version 1.0 or later is required. For now get it from
+     Index Data's
+     <ulink url="&url.snapshot.download;">Snapshot area</ulink>.
+    </para>
+    <para>
+     YAZ++ includes NMAKE makefiles, similar to those found in the
+     YAZ package.
+    </para>
+   </section>
+
+   <section id="installation.windows.metaproxy">
+    <title>Metaproxy</title>
+    <para>
+     Metaproxy is shipped with NMAKE makfiles 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.
+    </para>
+    <para>
+     After succesful compilation you'll find
+     <literal>metaproxy.exe</literal> in the
+     <literal>bin</literal> directory.
+    </para>
+   </section>
+
+  </section>
+ </chapter>
  <chapter id="architecture">
   <title>The Metaproxy Architecture</title>
   <para>
 
   <section>
    <title>Introductory notes</title>
+   <warning>
+    <title>Lark's vomit</title>
+    <para>
+     This chapter goes into a level of technical detail that is
+     probably not necessary in order to configure and use Metaproxy.
+     It is provided only for those who like to know how things work.
+     You should feel free to skip on to the next section if this one
+     doesn't seem like fun.
+    </para>
+   </warning>
    <para>
     Two of Metaproxy's filters are concerned with multiple-database
     operations.  Of these, <literal>virt_db</literal> can work alone
     while <literal>multi</literal> can work with the output of
     <literal>virt_db</literal> to perform multicast searching, merging
     the results into a unified result-set.  The interaction between
-    these two filters is necessarily complex, reflecting the real
-    complexity of multicast searching in a protocol such as Z39.50
-    that separates initialisation from searching, with the database to
-    search known only during the latter operation.
+    these two filters is necessarily complex: it reflecting the real,
+    irreducible complexity of multicast 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
+    time.
+   </para>
+   <para>
+    Hold on tight - this may get a little hairy.
+   </para>
+  </section>
+
+
+  <section id="multidb.virt_db">
+   <title>Virtual databases with the <literal>virt_db</literal> filter</title>
+   <para>
+    In the general course of things, a Z39.50 Init request may carry
+    with it an otherInfo packet of type <literal>VAL_PROXY</literal>,
+    whose value indicates the address of a Z39.50 server to which the
+    ultimate connection is to be made.  (This otherInfo packet is
+    supported by YAZ-based Z39.50 clients and servers, but has not yet
+    been ratified by the Maintenance Agency and so is not widely used
+    in non-Index Data software.  We're working on it.)
+    The <literal>VAL_PROXY</literal> packet functions
+    analogously to the absoluteURI-style Request-URI used with the GET
+    method when a web browser asks a proxy to forward its request: see
+    the
+    <ulink url="http://www.w3.org/Protocols/rfc2616/rfc2616-sec5.html#sec5.1.2"
+          >Request-URI</ulink>
+    section of
+    <ulink url="http://www.w3.org/Protocols/rfc2616/rfc2616.html"
+          >the HTTP 1.1 specification</ulink>.
+   </para>
+   <para>
+    The role of the <literal>virt_db</literal> filter is to rewrite
+    this otherInfo packet dependent on the virtual database that the
+    client wants to search.  For example, a <literal>virt_db</literal>
+    filter could be set up so that searches in the virtual database
+    ``lc'' are forwarded to the Library of Congress server, and
+    searches in the virtual database ``id'' are forwarded to the toy
+    GILS database that Index Data hosts for testing purposes.  A
+    <literal>virt_db</literal> configuration to make this switch would
+    look like this:
+   </para>
+   <screen><![CDATA[
+    <filter type="virt_db">
+      <virtual>
+        <database>lc</database>
+        <target>z3950.loc.gov:7090/Voyager</target>
+      </virtual>
+      <virtual>
+        <database>id</database>
+        <target>indexdata.dk/gils</target>
+      </virtual>
+    </filter>]]></screen>
+   <para>
+    When Metaproxy receives a Z39.50 Init request from a client, it
+    doesn't immediately forward that request to the back-end server.
+    Why not?  Because it doesn't know <emphasis>which</emphasis>
+    back-end server to forward it to until the client sends a search
+    request that specifies the database that it wants to search in.
+    Instead, it just treasures the Init request up in its heart; and,
+    later, the first time the client does a search on one of the
+    specified virtual databases, a connection is forged to the
+    appropriate server and the Init request is forwarded to it.  If,
+    later in the session, the same client searches in a different
+    virtual database, then a connection is forged to the server that
+    hosts it, and the same cached Init request is forwarded there,
+    too.
    </para>
    <para>
-    ### Much, much more to say!
+    All of this clever Init-delaying is done by the
+    <literal>frontend_net</literal> filter.  The
+    <literal>virt_db</literal> filter knows nothing about it; in
+    fact, because the Init request that is received from the client
+    doesn't get forwarded until a Search reqeust is received, the
+    <literal>virt_db</literal> filter (and the
+    <literal>z3950_client</literal> filter behind it) doesn't even get
+    invoked at Init time.  The <emphasis>only</emphasis> thing that a
+    <literal>virt_db</literal> filter ever does is rewrite the
+    <literal>VAL_PROXY</literal> otherInfo in the requests that pass
+    through it.
    </para>
   </section>
+
+  <section id="multidb.picture">
+   <title>A picture is worth a thousand words (but only five hundred on 64-bit architectures)</title>
+   <simpara>
+    <inlinemediaobject>
+     <imageobject>
+      <imagedata fileref="multi.png" format="PNG"/>
+     </imageobject>
+     <imageobject>
+      <imagedata fileref="multi.eps" format="EPS"/>
+     </imageobject>
+     <textobject>
+      <!-- Fall back if none of the images can be used -->
+      <phrase>
+       Diagram showing the progress of packages through the filters
+       during a simple virtual-database search and a multi-database
+       search.
+      </phrase>
+     </textobject>
+<!-- ### This used to work with an older version of DocBook
+     <caption>
+      <para>Caption: progress of packages through filters.</para>
+     </caption>
+-->
+    </inlinemediaobject>
+   </simpara>
+  </section>
  </chapter>
 
 
  sgml-parent-document: "main.xml"
  sgml-local-catalogs: nil
  sgml-namecase-general:t
- nxml-child-indent: 1
  End:
  -->