Saturday, September 12, 2009

EXPath Packaging System prototype implementation for eXist

During the past few weeks, I have been working on the Packaging System for EXPath (see also this blog
entry for more info.) The concept is quite simple: defining a
package format to enable users to install libraries in their processor
with just a few clicks, and to enable library authors to provide a
single package to be installed on every processors, without the need
to document (and maintain) the installation process for each of
them.

Of course, this system should be supported right into the
processors themselves, as this is intimately related to the way each
processor manages its queries and/or stylesheets. But to convince
vendors, we first have to show something that does work, and to show
that users are actually interested. So I have written a prototype
implementation for eXist (as well as one for Saxon, but it still needs
some cosmetic work in order to be released.)

The package manager for eXist is a graphical application (a textual
front-end will be provided soon,) and is provided as a single JAR
file. Go to the implementations
page, or use this following direct
link to get the JAR. Run it as usual, for instance by
double-clicking on it or by executing the command java -jar
expath-pkg-exist-0.1.jar. That will launch the package manager
window.

The manager acts on an eXist instance, that is, the
directory where you installed eXist on your machine (the one that
contains the conf.xml file.) You can have several
instances installed on a same computer, but the package manager only
acts on a single one at a time. You can select it via the
File menu, item Open instance. Just select
the correct directory. By default, if the environment variable
EXIST_HOME is set, the manager will use this directory.
If not, it will display a warning and wait for you to select an
instance:

The manger stores some info in a file created in the instance
directory. If this file does not exist, the manager asks you to
confirm to create it. That is kind of initializing this instance for
the EXPath Packaging system. You can safely answer yes:

Once an eXist instance is selected, the manager shows a list of the
packages installed in this instance. Using the menu, you can deleting
a package previously installed, or install a new one. To install a
new package, you have to select it through the file selection dialog.
Package files have the *.xar extension.

In order to test the system, you can use the following packages.
The first
one is actually nothing else than Priscilla Walmsley's FunctX for XQuery, that I packaged
(just because this is a more interesting and useful example of a
library written in standard XQuery than a simple hello world
example...) The second
one is a simple XQuery module that use eXist extension functions
(remember that a XAR is simply a ZIp file, so you can open it and see
the actual XQuery file within it.) Technically, it is deployed
exactly as a standard XQuery file, but in the package it is flagged as
dependent on eXist. And the last
one is a simple module written in Java. It provides a simple
function that says hello.

If you want to test the installation, start your eXist instance (or
restart it, but I would say it is safer to stop it to install
packages) and try one of those queries:

How does it work? The easiest is maybe to open the XAR files and
see what they contain. For instance, the package for FunctX contains
(when opened as a ZIP file) a file expath-pkg.xml and a
file functx/functx-1.0-doc-2007-01.xq. The later is
simply the XQuery file, exactly as you can find it on the FunctX website. The former is the
package descriptor. This is a little XML file describing the
content of the package. In this case, it contains:

You can see that this descriptor contains the name of the library
(here functx) as well as a user-friendly title, and its
version number. Then the XQuery file is registered with its target
namespace. This info is used by the manager to update the eXist's
conf.xml file. The actual XQuery file is wrapped in a
JAR file that is put in the eXist classpath, to enable eXist to find
it as a resource. If you open the package descriptor of the 2 other
packages, you will discover that they are slightly different (to
differenciate the different kinds of libraries, in particular those
written in Java.)

If you have any comment, idea or criticism, please tell us on the
EXPath mailing list. I
hope to release the package manager for Saxon quite soon, I will
announce it on the list.