W3C home > Mailing lists > Public > www-webdav-dasl@w3.org > April to June 1998

Plain text version of current protocol draft.

From: Jim Davis <jdavis@parc.xerox.com>
Date: Sun, 14 Jun 1998 13:05:29 PDT
Message-Id: <3.0.3.32.19980614130529.007d2a90@mailback.parc.xerox.com>
To: www-webdav-dasl@w3.org
I have tried to get the current protocol draft from the internet drafts FTP
site without luck.  ds.internic.net (referenced from the DASL home page at
http://www.ics.uci.edu/pub/ietf/dasl/) never seems to answer, and
ftp.isi.edu only has an old copy of the protocol.

Saveen:  I think it would be good for the DASL web page to keep a local
copy of the relevant documents (IDs both submitted and still being edited)
in both Word and text, so we don't rely on the slow ISI FTP server.

For everyone else who might have tried, here is an UNOFFICIAL version of
the most recent version of the protocol draft, which I created myself from
a version in Word.  I am sure Saveen has a better version, so please do not
consider this one in any way official (even less official than Internet
Drafts, that's very unofficial).  It includes the changes I mentioned in
email earlier this weekend.

If you find this helpful, good.  If not, please ignore it.

DAV Searching & Locating protocol  UNOFFICIAL DRAFT

Saveen Reddy, Microsoft 
Del Jensen, Novell
Surendra Reddy, Oracle
Rick Henderson, Netscape
Jim Davis, Xerox
Alan Babich, Filenet 

May 3, 1998				Expires Nov 3, 1998

Created 14 June 1998 by Jim Davis from Word version 013.  This
document is not an internet draft because it does not conform to the
syntax requirements for such a draft.  I am providing it now only so
that those who cannot read Microsoft Word (which we have been using as
an internal editing format) can at least see a text version of the 
draft we've been talking about.  

Abstract

This document specifies a set of methods, headers, and content-types
composing DASL, an application of the HTTP/1.1 protocol to efficiently
search for DAV resources based upon a set of client-supplied criteria.

1.  Introduction

This document describes a set of methods, headers and content-types
forming DASL, an application of HTTP/1.1 that allows clients to
perform searching operations on the properties and content of DAV
resources. DASL is a lightweight search protocol to transport queries
and result sets and allows clients to make use of server-side search
facilities, the motivation for which is described by [DASLREQ].

DASL includes the SEARCH method, the DASL response header for use with
the OPTIONS method, the DAV:searchrequest XML element, and the
DAV:simplesearch query grammar.

It is an objective of DASL to minimize the complexity of clients so as
to facilitate widespread deployment of applications capable of
utilizing the DASL search mechanisms.

1.1 Relationship to DAV

DASL relies on the resource and property model defined by
[WEBDAV]. DASL does not alter this model. Instead, DASL allows clients
to access DAV-modeled resources through server-side search.

1.2 Terms

This draft uses the terms defined in [RFC2068], [WEBDAV], and [DASLREQ].

1.3 Notational Conventions

The augmented BNF used by this document to describe protocol elements
is exactly the same as the one described in Section 2.1 of
[RFC2068]. Because this augmented BNF uses the basic production rules
provided in Section 2.2 of [RFC2068], those rules apply to this
document as well.  The key words "MUST", "MUST NOT", "REQUIRED",
"SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
and "OPTIONAL" in this document are to be interpreted as described in
[RFC2119].

1.4 DASL in Operation 

The prototypical usage of DASL is the following series of steps.

1. The client issues the SEARCH method on a resource (the search
arbiter) and includes a text/xml entity that contains the query.

2. If the resource performs the query. 

3. The resource responds with a text/xml entity that represents the
result set for the query.

2. The SEARCH method

2.1 Overview

The client invokes the SEARCH method to initiate a server-side
search. The text/xml body of the request defines the query. A
successful response is a text/xml entity matching the [WEBDAV]
PROPFIND response.

2.2 Query Transport vs. Query Semantics and Query Grammar

The SEARCH method only provides a framework for the transmission of a
search request. It does not define the syntax or semantics of any
query that is transmitted. That is, the SEARCH method is a transport
mechanism for the query. Different query grammars can be transmitted,
each defining its own search semantics.

2.3 The Request

The client invokes the SEARCH method on the resource named by the
Request-URI.

2.3.1 The Request-URI as Search Arbiter

The Request-URI identifies a resource that acts as an arbiter for the
search.  The SEARCH method defines no relationship between the
Request-URI and the scope of the search. Such a relationship MUST be
defined by the query grammar. For example, query grammars may force
the request-URI to correspond exactly to the search scope.

2.3.2 The Request Body

The client MUST include a text/xml request body containing the
DAV:searchrequest XML element.  The name of the contained XML element
identifies the query grammar being used and defines the criteria, the
result record, and any other details needed to perform the search.

2.4 The Response 

2.4.1 217 Multistatus

The search proceeded successfully. The response matches that of a
PROPFIND. Each resource listed in the Multistatus response MUST meet
the criteria defined by the corresponding search request.  The server
MAY limit the size of the response, for example because the query
might match more items than the server was willing to process.  See
section 2.4.6.

2.4.2 400 Bad Request

The search query was unable to be processed. The search was not
initiated.  The server MAY provide a text/xml body that describes the
cause for the error. The server MAY include the DAV:searchredirect XML
element to provide for redirection of the search to other search
arbiters.

2.4.3 422 Unprocessable entity

The query could not be processed. The DAV:searchrequest element may be
missing, may contain an unrecognized query grammar, or the query
itself may be malformed.

2.4.4 PROPFIND Response Extensions

Query grammars MUST define how the response matches the PROPFIND
response. Responses are free to include more information than PROPFIND
responses so long as the extra information does not invalidate the
PROPFIND response.

2.4.5 Example

This example demonstrates the request and response framework. 

>> Request
SEARCH / HTTP/1.1
Host: ryu.com
Content-Type: text/xml
Connection: Close
Content-Length: xxxxx

<?xml version="1.0"?>
<?xml:namespace ns="DAV:" prefix="D"?>
<D:searchrequest>
    <D:simplesearch>
        ... the query goes here ...
    </D:simplesearch>
</D:searchrequest>

>> Response
HTTP/1.1 207 Multi-Status
Content-Type: text/xml
Content-Length: xxxxx
<?xml version="1.0"?>
<?xml:namespace ns="DAV:" prefix="D"?>
<?xml:namespace ns="http://www.foo.bar/propschema" prefix="R"?>
<D:multistatus>
    <D:response>
        <D:href>http://ryu.com/whales.txt</D:href>
        <D:propstat>
            <D:prop>
                <R:bigbox>
                    <R:BoxType>Box type A</R:BoxType>
                </R:bigbox>
                <R:author>
                    <R:Name>J.J. Dingleheimerschmidt</R:Name>
                </R:author>
                <D:resourcetype/>
                <D:getcontentlength>259</D:getcontentlength>
                <D:getcontenttype>text/plain<D:getcontenttype>
            </D:prop>
            <D:status>HTTP/1.1 200 OK</D:status>
        </D:propstat>
    </D:response>
</D:multistatus>

2.4.6 Example of result set truncation

A server MAY limit the number of resources in a reply, for example to
limit the amount of resources expended in processing a query.  If it
does so, the reply MUST include a response element whose href is that
of the request URI and whose status is 425.

SEARCH / HTTP/1.1
Host: gdr.com
Content-Type: text/xml
Connection: Close
Content-Length: xxxxx

<?xml version="1.0"?>
<?xml:namespace ns="DAV:" prefix="D"?>
<D:searchrequest>
    <D:simplesearch>
        ... the query goes here ...
    </D:simplesearch>
</D:searchrequest>

>> Response

HTTP/1.1 207 Multi-Status
Content-Type: text/xml
Content-Length: xxxxx
<?xml version="1.0"?>
<?xml:namespace ns="DAV:" prefix="D"?>
<D:multistatus>
   <D:response>
      <D:href>http://www.gdr.com/sounds/unbrokenchain.au</D:href>
      <D:status>HTTP/1.1 200 OK</D:status>
   </D:response>
   <D:response>
      <D:href>http://tech.mit.edu/archive96/photos/Lesh1.jpg</D:href>
      <D:status>HTTP/1.1 200 OK</D:status> 
   </D:response>
   ...
   <D:response>
      <D:href>http://gdr.com/</D:href>
      <D:status>HTTP/1.1 425 Insufficient Space on Resource</D:status>
      <D:responsedescription>Too many hits</D:responsedescription>
   </D:response>
</D:multistatus>

3. The DAV:searchrequest XML Element

<!ELEMENT searchrequest (ANY) >

The value of DAV:searchrequest is a single element that defines the
query. The type of the query is identified by the element name. The
value of that element defines the query itself.  For example, the
following XML document shows a simple natural language query. The type
of the query is FOO:natural-language query. The actual query is "Find
the locations of good Thai restaurants in Los Angeles".

<?xml version="1.0"?>
<?xml:namespace ns="DAV:" prefix="D"?>
<?xml:namespace ns="FOO:" prefix="F"?>
<D:searchrequest>
    <F:natural-language-query>
        Find the locations of good Thai restaurants in Los Angeles
    </F:natural-language-query>
</D:searchrequest>

3.1 DAV:searchredirect

<!ELEMENT searchredirect        ( scope arbiter* ) >
<!ELEMENT scope                    (#PCDATA) >
<!ELEMENT arbiter                (#PCDATA) >

DAV:scope contains the URI identifying the scope. The optional
DAV:arbiter element contains a URI that identifies an arbiter that
will be able to handle the query for that scope. Multiple DAV:arbiter
elements can be used to show that multiple arbiters cans search on
that scope. If no DAV:arbiter appears then this indicate that the
scope cannot be searched by the search arbiter and that no the search
arbiter knows of no other arbiter to handle the query for the scope.

4. Discovery Mechanisms

4.1 Query Grammars

Servers MUST support discovery of the query grammars supported by a
resource.  Clients can determine which query grammars are supported by
an arbiter by invoking OPTIONS on the search arbiter. If the resource
supports SEARCH, then the DASL response header will appear in the
response. The DASL response header lists which grammars are supported.
Consult the section on the OPTIONS method and the DASL response header
for more information.

4.2 Query Grammar Schema Discovery

Servers MAY support the discovery of the schema for a query grammar.
The DASL response header provides means for clients to discover the
set of query grammars supported by a resource. This alone is not
sufficient information for a client to generate a query.  For example,
the DAV:simplesearch grammar defines a set of queries consisting of a
set of operators applied to a set of properties and values, but the
grammar itself does not specify which properties may be used in the
query.  Moreover, while the DAV:simplesearch grammar defines a minimal
set of operators, it is possible that a resource might support
additional operators.  Search schema discovery allows a client to
discover such information.  The schema for a given query grammar on a
resource is stored as a property of that resource.  The name of the
property is the same as the name of the query grammar itself.  The
property value is a DAV:queryschema XML element.  The contents of this
element depend upon the particular query grammar.

5. The OPTIONS Method

5.1 Overview

The OPTIONS method allows the client to discover if a resource
supports the SEARCH method and to determine the list of search
grammars supported for that resource.

5.2 Request

The client issues the OPTIONS method against a resource named by the
Request-URI. This is a normal invocation of OPTIONS defined in [RFC2068].

5.3 Response

If a resource supports the SEARCH method, then the server MUST list
SEARCH in the OPTIONS response as defined by [RFC2068].  DASL servers
MUST include the DASL header in the OPTIONS response. This header
identifies the search grammars supported by that resource.

5.4 Example

This example shows that the server supports search on the /somefolder
resource with the following query grammars: http://foo.bar.com/syntax1
and http://akuma.com/syntax2.

>> Request
OPTIONS /somefolder HTTP/1.1
Connection: Close
Host: ryu.com

>> Response
HTTP/1.1 200 OK
Date: Tue, 20 Jan 1998 20:52:29 GMT
Connection: close
Accept-Ranges: none
Allow: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE, MKCOL,
PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH
Public: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, COPY, MOVE, MKCOL,
PROPFIND, PROPPATCH, LOCK, UNLOCK, SEARCH
DASL: <http://foo.bar.com/syntax1> <http://akuma.com/syntax2>

6. New Headers

6.1 The DASL Response Header

6.1.1 Overview

The DASL response header indicates server support for query grammars
in the OPTIONS method. The value of this header is a list of
URLs. Each URL indicates support for a query grammar.

6.1.2 Syntax

DASLHeader = "DASL" ":" URL-List
URL-List = 1#Coded-URL ; defined in section 8.5 of [WEBDAV]

6.1.3 Example

DASL: <http://foo.bar.com/syntax1> <http://akuma.com/syntax2>

7. The DAV:simplesearch grammar

7.1 Introduction

DAV:simplesarch uses an extensible XML syntax that allows clients to
express search requests that are generally useful for WEBDAV
scenarios. DASL-extended servers MUST accept this grammar.
DAV:simplesearch has several major components: DAV:select, DAV:from,
DAV:where, and DAV:sortby. DAV:select provides the result record
definition. DAV:from defines the scope. DAV:where defines the
criteria. DAV:sortby defines the sort order of the result set.

7.2 Typing

DAV:simplesearch uses [XML-DATA] a typing mechanism for literal values.

7.3 DTD

<!ELEMENT simplesearch        (select, from, where?, sortby?, limit?) >

<!ELEMENT select                (allprop | prop) >

<!ELEMENT from                (scope+) >
<!ELEMENT scope                (uri, depth?) >

<!ELEMENT where                (and | or | not | eq | lt | gt 
                                | lte | gte | contains | extension ) >
<!ELEMENT and                ( (and | or | not | eq | lt | gt 
                                | lte | gte | contains | extension) +) >
<!ELEMENT or                    ( (and | or | not | eq | lt | gt 
                                | lte | gte | contains | extension) +) >
<!ELEMENT lt                    ( prop , literal ) >
<!ELEMENT lte                ( prop , literal ) >
<!ELEMENT gt                    ( prop , literal) >
<!ELEMENT gte                ( prop , literal ) >
<!ELEMENT eq                    ( prop , literal ) >
<!ELEMENT literal            (#PCDATA)>
<!ELEMENT contains            ( prop?, literal ) >

<!ELEMENT sortby                (prop)*>

<!ELEMENT limit                (nresults)
<!ELEMENT nresults            (#PCDATA)7.3.1 Example

This query will retrieves the content length values for all resources
located under the server's "/container1/" URI namespace whose length
exceeds 10000.

<d:searchrequest>
    <d:simplesearch>
        <d:select>
            <d:prop><d:getcontentlength/></d:prop>
        </d:select>
    <d:from>
        <d:scope>
            <d:href>/container1/</d:href>
            <d:depth>infinity</d:depth>
        </d:scope>
    </d:from>
    <d:where>
        <d:gt> 
            <d:prop><d:getcontentlength/></d:prop>
            <d:literal>10000</d:literal>
        </d:gt>
    </d:where>
    <d:sortby>
        <d:prop><d:getcontentlength/><d:prop>
    </d:sortby>
    </d:simplesearch>
</d:searchrequest>

7.4 DAV:select 

DAV:select defines the result record. This document defines two
possible values: DAV:allprop and DAV:prop, both defined in [WEBDAV].
If the value is DAV:allprop, the result record for a given resource
includes all the properties for that resource.  If the value is
DAV:prop, then the result record for a given resource includes only
those properties named by the DAV:prop element. Each property named by
the DAV:prop element must be referenced in the Multistatus response.
The rules governing the status codes for each property match those of
the PROPFIND method defined in [WEBDAV].

7.5 DAV:from

DAV:from defines the query scope. This a list of one or more DAV:scope
elements. Each scope element contains a mandatory DAV:uri element and
an optional DAV:depth element.  DAV:href indicates the URI for a
collection to use as a scope.  DAV:depth has the value of "1" or
"infinity" indicating non-recursive and recursive searching of a
scope, respectively.

7.5.1 Relationship to the Request URI

For each absolute URI in a DAV:scope element, the scope is exactly
that URI For each relative URI in a DAV:scope element, the scope is
taken to be relative to the request-URI.

7.6 DAV:where 

DAV:where defines the criteria for inclusion in the result set. The
value of this element is a XML element that defines a search operator
that evaluates to True, False, or Unknown. The search operator
contained by DAV:where may itself contain and evaluate additional
search operators.  Each search operator defined for use in the where
clause MUST evaluate True, False, or Unknown.  If and only if the
criteria evaluate to True for a resource, then the resource is
included as a member of the result set.

7.6.1 Example

The example shows a single operator (DAV:eq) applied in the criteria. 
<D:where>
    <D:eq>
        <d:prop> <d:getcontenlength/> </d:prop>
        <d:literal> 100 </d:literal>
    </D:eq>
</D:where>

7.6.2 

7.6.2 Example

The example shows a more complex operation involving several operators
(DAV:and, DAV:eq, DAV:gt) applied in the criteria. This DAV:where
expression matches those resources that are "image/gifs" over 4K in
size.  <D:where> <D:and> <D:eq> <D:prop> <D:getcontenttype/> </D:prop>
<D:literal> image/gif </D:literal> </D:eq> <D:gt> <D:prop>
<D:getcontentlength/> </D:prop> <D:literal> 4096 </D:literal> </D:gt>
</D:and> </D:where>

7.7 DAV:sortby 

DAV:sortby specifies the ordering of the result set. This contains a
list of properties for each resource in the result set upon which to
sort

7.8 DAV:and

The DAV:and operator performs a logical AND operation on the
expressions it contains.

7.9 DAV:or

The DAV:or operator performs a logical OR operation on the values it
contains.  The DAV:casesensitive attribute may be used with this
element.

7.10 DAV:not

The DAV:not operator performs a logical NOT operation on the values it
contains.  The DAV:casesensitive attribute may be used with this
element.

7.11 DAV:eq

The DAV:eq operator provides simple equality matching on property
values.  The DAV:casesensitive attribute may be used with this
element.

7.12 DAV:lt, DAV:lte, DAV:gt, DAV:gte

The DAV:lt, DAV:lte, DAV:gt, and DAV:gte operators provide comparisons
on property values. For string values the comparison is
case-sensitive.  The DAV:casesensitive attribute may be used with this
element.

7.13 DAV:contains

The DAV:contains operator provides a content-based comparisons on
property values or the text-content of a resource.  If a DAV:prop is
given, then the operation applies to the single property named by
DAV:prop. Otherwise, the operation applies to text content of the
resource.  The DAV:casesensitive attribute may be used with this
element.

7.13.1 Example

The example below matches those text resources that contain the phrase
"playoff hockey".

<D:contains>
    <D:literal>playoff hockey</D:literal>
</D:contains>

7.13.2 Example

The example below matches those text resources where the foo:author
property contains the word "Orr" with case-sensitivity enabled.

<D:contains d:cassensitive="t">
    <D:prop><foo:author/></D:prop>
    <D:literal>Orr</D:literal>
</D:contains>

7.14 DAV:literal 

DAV:literal allows typed, literal values to be placed in an
expression.  Typing is specified through [XMLDATA]. If no typing is
specified, then the type string defined by [XMLDATA] is assumed.

7.15

7.15 DAV:limit

Name:        limit
Namespace:    DAV
Purpose:        Contains requested limits from the client to limit the size
of the reply or amount of effort expended by the server.
Description:     

<!ELEMENT limit (nresults)

7.15.1 DAV:nresults

Name:        nresults
Namespace:    DAV
Purpose:        Contains a requested maximum number of records to be
returned in a reply.  The server MAY disregard this limit.
Description:    Contains an integer

 <!ELEMENT nresults (#PCDATA) ;only digits

7.16 XML Attributes

7.16.1 DAV:casesensitive 

The DAV:casesensitive attribute allows clients to specify
case-sensitive or case-insensitive behavior for DAV:simplesearch
operators.  Operators used in DAV:extension MAY also use this
attribute to indicate case-sensitive behavior.  The possible values
for DAV:casesensitive are "t" or "f". The "t" value indicates
case-sensitivity. The "f" value indicates case-insensitivity.

7.17 Properties 

7.17.1 DAV:rank

<!ELEMENT rank    EMPTY>

The rank XML element is a pseudo property whose value is defined only
in the context of a query result where the server computes a ranking,
e.g. based on relevance.

7.18 Query Schema for DAV:simplesearch 

<!ELEMENT simplesearchschema (searchable selectable sortable operators)>
<!ELEMENT searchable (propdesc)*>
<!ELEMENT selectable (prop)*>
<!ELEMENT sortable (rank|prop|allprop)*>
<!ELEMENT operators (opdesc)*>

<!ELEMENT propdesc (prop (datatype)? (indexed)? (equivalents)?>
<!ELEMENT indexed EMPTY>
<!ELEMENT equivalents (prop)*>

<!ELEMENT opdesc op arglist>
<!ELEMENT arglist (argdesc*)>
<!ELEMENT argdesc datatype (prop)*>

7.19 Internationalized Content

All literal strings in the query are encoded in XML and take on the
character set of the text/xml document containing the literal.  If the
character set of the text/xml request cannot be understood, then the
server MUST respond with a 400 (Bad Request).

8. Security Considerations 

This section is provided to detail issues concerning security
implications of which DASL applications need to be aware. All of the
security consideration of HTTP/1.1 also apply to DASL. In addition,
this section will include security risks inherent in searching and
retrieval of resource properties and content.

9. Authentication

Authentication mechanisms defined in WEBDAV will also apply to DASL.

10. IANA Considerations

This document uses the namespace defined by [WEBDAV] for XML
elements. All other IANA considerations mentioned in [WEBDAV] also
applicable to DASL.

11. Change History

Feb, 14    
- Initial Draft
Feb, 28 
- Referring to DASL as an extension to HTTP/1.1 rather than DAV
- Added new sections "Notational Conventions", "Protocol Model", "Security
Considerations"
- Changed section 3 to "Elements of Protocol"
- Added some stuff to introduction
- Added "result set" terminology
- Added "IANA Considerations".
Mar, 9
- Moved sub-headings of "Elements of Protocol" to first level and removed
"Elements of Protocol" Heading.
- Added an sentence in introduction explaining that this is a "sketch" of a
protocol.
Mar, 11
- Added sortby, datatyping, three valued logic, query schema property, and
element definitions for schema for simplesearch.
April 8
- made changes based on last week's DASL BOF.
May 8
- Removed most of DAV:searcherror; converted to DAV:searchredirect
- Altered DAV:simplesearch grammar to use avoid use of ANY in DTD
June 12 (Jim Davis)
* added result set truncation and limit tag
* Removed elements DAV already defined (e.g. depth)
* Typo: allprops -> allprop
* Got rid of extension 
* updated references to DASLREQ and WEBDAV
* updated date in header to match date on title

12. References

[DASLREQ] S. Reddy, J.Slein, "Requirements for DAV Searching and
Locating", March 1998, internet-draft, work-in-progress,
draft-reddy-dasl-requirements-02.txt

[RFC2068] R. Fielding, J. Gettys, J. C. Mogul, H. Frystyk, and
T. Berners-Lee, "Hypertext Transfer Protocol -- HTTP/1.1", RFC 2068,
U.C. Irvine, DEC, MIT/LCS, January 1997.

[RFC2119] S. Bradner, "Key words for use in RFCs to Indicate
Requirement Levels." RFC 2119, BCP 14. Harvard University. March,
1997.

[WEBDAV] Y. Goland, E.J. Whitehead, A. Faizi, S.R. Carter, D.Jenson,
"Extensions for Distributed Authoring on the World Wide Web",
April. 1998, internet-draft, work-in-progress,
draft-ietf-webdav-protocol-08.

[XMLDATA] A. Layman, E. Jung, E. Maler, H.S. Thompson, J. Paoli,
J. Tiguw, N.H. Mikula, S. De Rose, "XML-DATA", Jan, 1998,
work-in-progress, http://www.w3.org/TR/1998/NOTE-XML-data/

13. Author's Addresses

Saveen Reddy
Microsoft
One Microsoft Way
Redmond WA, 9085-6933
Email:saveenr@microsoft.com

Del Jensen
Novell
1555 N. Technology Way
M/S ORM F111
Orem, UT 84097-2399
Email: dcjensen@novell.com

Surendra Reddy
Oracle Corporation
600 Oracle Parkway, M/S 6op3,
Redwoodshores, CA 94065
Email: skreddy@us.oracle.com
Phone:(650) 506 5441

Rick Henderson
Netscape
Email: rickh@netscape.com

Jim Davis
Xerox PARC
3333 Coyote Hill Road
Palo Alto CA 94304
650-812-4301
Email: jdavis@parc.xerox.com

Alan Babich
Filenet
Email: ababich@filenet.com
Received on Sunday, 14 June 1998 16:08:06 GMT

This archive was generated by hypermail 2.2.0+W3C-0.50 : Sunday, 22 March 2009 03:38:04 GMT