INTERNET-DRAFT                                                 K. Swenson
 <draft-swenson-swap-prot-00.txt>             Netscape Communications Corp
 Expires February, 1999                                     August 7, 1998

                   Simple Workflow Access Protocol (SWAP)

This document is an Internet-Draft.  Internet-Drafts are working
documents of the Internet Engineering Task Force (IETF), its
areas, and its working groups.  Note that other groups may also
distribute working documents as Internet-Drafts.

Internet-Drafts are draft documents valid for a maximum of six
months and may be updated, replaced, or obsoleted by other
documents at any time.  It is inappropriate to use Internet-
Drafts as reference material or to cite them other than as
"work in progress."

To view the entire list of current Internet-Drafts, please check
the "1id-abstracts.txt" listing contained in the Internet-Drafts
Shadow Directories on ftp.is.co.za (Africa), ftp.nordu.net
(Northern Europe), ftp.nis.garr.it (Southern Europe), munnari.oz.au
(Pacific Rim), ftp.ietf.org (US East Coast), or ftp.isi.edu
(US West Coast).

Abstract

A standard protocol is needed to integrate work providers, asynchronous
services, across the intranet/internet and provide for their interaction.
The integration and interactions consist of control and monitoring of the
work.  Control means creating the work, setting up the work, starting the
work, stopping the work, being informed of exceptions, being informed of
the completion of the work and getting the results of the work  Monitoring
means checking on the current status of the work and getting a history of
the execution of the work. The protocol should be light weight and easy to
implement, so that a variety of devices and situations can be covered.

The Simple Workflow Access Protocol is a proposed way to solve this problem
through use of HTTP protocol, and by transferring structured information
encoded in XML.  A new set of HTTP methods is defined, as well as the
information to be supplied and the information returned in XML, that
accomplish the control of generic asynchronous services.  This has
applicability to workflow because a workflow is itself an asynchronous
service, and it also has the need to be able to call asynchronous services
aoutside of itself.

This document will

  1. give an Executive Overview
  2. specify the goals of SWAP
  3. explain how resource (object) model works and how URIs are used to
     invoke methods of those resources.
  4. explain how data is encoded to be sent or received.
  5. specify preliminary details of the interface methods and parameters

1.0  Executive Overview

This protocol offers a way to start an instance of a generic asynchronous
service, monitor it, control it, and be notified when it is complete.  To
clarify the discussion an instance of a service is called a process
instance.  This process instance can perform just about anything for any
purpose.  The key aspect is that the process instance is something that one
would like to start remotely, and it will take a long time to run to
completion.  Short lived services would be invoked synchronously and one
would simply wait for completion, but because these process instances last
anywhere from a few minutes to a few months, they must be invoked
asynchronously.

What does this have to do with workflow?  While this protocol is useful for
starting and controlling process instances of any type, the need for this
capability is of high demand in the workflow community.  A workflow process
is a process instance that may run for days, months, or even years, so this
protocol will be useful for starting workflow processes.  It is also the
case that workflow services provide sequencing of other services, and
thereby need a way to start an external generic asynchronous service, and
to be told when it completes.  So this protocol is emmensely useful to the
workflow community, but has little actual specific to workflow.

How does it work?:  You must start with the URI of a process definition.
An HTTP request to this URI will cause this process definition to generate
a process instance, and return the URI of this new service instance which
is used for all the rest of the requests.  The process instance can be
provided with data (name/value pairs) by another HTTP request.  The current
state of the process instance can be retrieved with another HTTP request.
The process instance can be paused or resumed with another HTTP request.
There is also a pair of requests that may be used to give input data to the
process instance, and to ask for the current value of the output data.

When it is done?  The process instance runs asynchronously and takes
whatever time it needs to complete.  The originating program can, if it
chooses, keep polling the state of the process instance in order to find
out when it is complete.  This will consume resources unnecessarily both on
the originating side as well as the performing side.  Instead, the
originator may provide the process instance with the URI of an observer.
When the process instance is completed it will do an HTTP request back to
this URI in order to notify the originator.  This allows the originator to
be put to sleep, freeing up operating system as well as network resources
while waiting for the process instance to complete.

1.1 Discussion of this Draft

Discussions on this draft are carried out on a mailing list:

    swap-wg@netscape.com

Comments on the draft should be sent to that email address.  Please check
the following web site for instructions on how to join the mailing list and
for information on other documents from the same working group:

    http://www.ics.uci.edu/pub/ietf/swap/

2.0 Goals

2.1 Problem Statement

A standard protocol is needed to integrate work providers, asynchronous
services, across the intranet/internet and provide for their interaction.
The integration and interactions consist of control and monitoring of the
work.  Control means creating the work, setting up the work, starting the
work, stopping the work, being informed of exceptions, being informed of
the completion of the work and getting the results of the work  Monitoring
means checking on the current status of the work and getting a history of
the execution of the work.

The protocol should be light weight and easy to implement, so that a
variety of devices and situations can be covered.

2.2 Things to Achieve

In order to have a realizable agreement on useful capabilities in a short
amount of time, it is important to be very clear about the goals of this
effort.

   * The protocol should not reinvent anything unnecessarily.  If a
     suitable standard exists, it should be used rather than reimplemented
     a different way.
   * The protocol should be consistent with the HTTP 1.1 extension
     mechanisms.
   * The protocol should be the minimal necessary to support a generic
     asynchronous service.  This means being able to start, monitor,
     exchange data with, and control a generic asynchrounous service on a
     different  system.
   * The protocol must be extensible.  The first version will define a very
     minimal set of functionality.  Yet a system must be able to extend the
     capability to fit the needs of a particular system, such that high
     level functionality can be communicated which gracefully degrades to
     interoperate with systems that do not handle those extensions.
   * Terseness of expression, or convenience for human readers,  is not a
     goal of this protocol.  Ease of generation and parsability should be
     favored over compactness.
   * Like other internet protocols, SWAP should not require or make any
     assumptions about the platform or the technology used to implement the
     generic asynchronous service.

2.3 Things not part of the goals

It is also good practice to clearly demark those things that are not to be
covered by the first generation of this effort:

   * The goals of SWAP 1.0 does not include a way to set up or to program
     the generic services in any way.  Especially for the case where the
     service is a workflow service, SWAP 1.0 does not provide a way to
     retrieve or submit process definitions.  The service can be considered
     to be a "black box" which has been pre-configured to do a particular
     process.  SWAP 1.0 does not provide a way to discover what it is that
     the service is really doing, only that it does it (given some data to
     start with) and some time later completes (providing some result data
     back).
   * SWAP 1.0 will not include the ability to perform maintenance of the
     process definition such as installation or configuration.
   * SWAP 1.0 will not provide any capability to search or locate process
     instances that are running on the system.  It will not support
     statistics or diagnostics of the running processes.
   * SWAP 1.0 is not designed to handle the transfer of large amounts of
     process relevant data.  The data associated with, and stored within, a
     service instance is not anticipated to be more than 64K Bytes, and in
     most cases will be quite a bit less than this.  If larger amounts of
     data than this are needed then it is anticipated that this data would
     be placed into some form of external service and that the SWAP will
     only need to carry the URI to that data.  For example, a document
     would be placed on a web server and given the URI would be retrieved
     through normal HTTP.

These may be added in a later revision, but there is no requirement to
support these from the first version, and so any discussion on these issue
should not be part of SWAP working group meetings.

2.4 Audience

This document is intended for vendor organizations who wish to implement
the SWAP protocol in workflow engines, and also for consultants, VARs, or
thrid party developers who wish to make a SWAP wrapper for an existing
system service in order to integrate that service into a workflow
environment.

2.5 Terminology

The terminology used in this document borrows from the terms standardized
by the Workflow Management Coalition.  A copy of this glossary is freely
available at:  [1] http://www.aiim.org/wfmc/standards/docs/glossary.pdf.
Important terms are listed below, some have refined definitions more
suitable to this specification.

 Process           The term "process" by itself is avoided in this
                   document because it can be used several ways.  Instead,
                   the more precise terms "process definition" and
                   "process instance" are used, which are defined below.
                   The term process will only be used when the statement
                   might apply equally to a process definition and a
                   process instance.
 Process DefinitionThis represents a "way of doing some work".  A process
                   might be a set of tasks carried out by a group of
                   individuals, or it might be set of machine instructions
                   that make up a executable program, or it might be any
                   combination of these.  The important point to remember
                   about a process definition is that while it embodies
                   the knowledge of how a work it performed, it does not
                   actually do the work.
 Process Instance  This is the actual "performance of work".  It embodies
                   the context information that distinguishes one
                   performance of a process from another.  If a process
                   definition represents a (software) program, then a
                   process instance represents an invocation of that
                   program.  If the process definition represents a large
                   workflow insurance claims process, then a process
                   instance represents a single case of that process -- a
                   particular insurance claim.



2.6 Related Documents

The Workflow Management Coalition (WfMC) has been working on the problem of
workflow interoperability for many years.  There are a number of WfMC
documents which may be useful (but not required) in understanding the
design rationale behind this document.  Most related is the the [2]
"Interoperability / Internet e-mail MIME Binding" document (WFMC-TC-1018)
which describes how to allow interoperation between workflow services using
SMTP/MIME mail.  Another useful document to understanding how such services
would fit together is the [3] Workflow Architural Reference Model where the
basic components of a workflow system is described.

This specification can be loosly viewed as a binding of the Interface 4
abstract specification to the HTTP protocol. An understanding of the HTTP
protocol and how it works is assumed in order to understand this document.
Information on HTTP can be retrieve from: [4] http://www.w3.org/Protocols/.
Particular, [5] RFC-2068 describes the HTTP/1.1 protocol used for SWAP can
be found at http://www.w3.org/Protocols/rfc2068/rfc2068.

3.0 Resource Model

The generic service appears externally as a small number of different
resources.  The term resource is used instead of object in order to avoid
discussion on whether the things being accessed are in fact OO style
objects.  The important aspect of a resource is that they are distinguished
by their web address, in the form of an URI.   How these resources are
implemented, whether using an OO language, or more traditional means, is
not of concern to the protocol.  What matters only is that when valid
requests are made to valid URIs a proper and consistent result is returned.

There will be a small number of different types of these resources that
will respond differently to different requests.  In order to organize this
document, the types of requests will be grouped together into interfaces.
Saying that an resource implements an interface means that it responds
appropriately to all of the requests contained by the interface.  It will
often be the case that a resource will implement 2 or more interfaces which
means simply that all of those requests can be used to that URI address.

3.1 Process Instance / Process Definition / Observer

There are three fundamental interfaces that one needs to understand
initially and which form the core of the resource model.  These are the
ProcessInstance, ProcessDefinition, and the Observer.

ProcessInstance: The process instance is the actual performer of the
service.  Every time the service is to be invoked, a new  process instance
is created.  A process instance resource can be used only once: it is
created, then it can be started, it can be paused, resumed, terminated.  If
things go normally, it will eventually complete.  For example, a company
may need to, at certain times, run a CICS transaction to accomplish some
financial function.  This could be started in a proprietary or platform
specific way, but the right client libraries and version would have to be
installed at every location that needed to be able to trigger the
transaction.    Alternately the service could be enabled for SWAP with a
relatively simple CGI wrapper that implemented the process instance
interface which would allow the transaction to be triggered by any tool
that supported SWAP.

ProcessDefinition:  Since each invocation of the service creates a new
process instance resource, each with a unique URI, one needs a process
definition which has a well known name in order to create the process
instances.  For each kind of service that is to be performed, a unique
process definition URI is provided.  Knowing the URI of the process
definition is all that is needed in order to run the most basic services.
Because the service generates a unique process instance resource for every
invocation of the service, it allows many invocations to be performed at
the same time, a very important feature when the service takes several
months to complete.

Observer:  The process instance resource knows very little about what
invoked it, but it needs a way to communicate when it completes.  The
process instance can be given a reference to an observer resource. The only
purpose of the observer interface is to provide a way for the process
instance to report that it is finished.  The URI of the observer resource
is given to the process instance.  When the perfomer is finished, it make a
request to the provided URI to inform that it is completed.  There can be
any number of observers on a particular process instance.  Besides
completion, there can be other occasions that will cause the perfomer to
make a request to the observer to inform it of the change in state or data.

3.2 ActivityObserver

ActivityObserver: An ActivityObserver tells about external work that the
process instance is waiting on.  Simple process instances will be self
contained, not relying upon any external process instances, and can be
interfaced to the web without using the ActivityObserver interface.  There
is, however, the case where in order to complete its task, a process
instance will call on external asynchronous services.  The ActivityObserver
resource is the way to indicate this.  The ActivityObserver will describe
what the process instance is waiting to have done, and will provide the URI
to the process instance if there is one.

The ActivityObserver forms a bridge between the process instance that it is
part of, and the sub-process instances that are doing work externally.  It
allows the currently open process instances to be browsed by a third party
in both directions -- both from a parent process to a child process, and
from a child process to a parent process.

For example, consider a process instance "Release Product", which is
waiting on an activity observer "Approve Final User Manual", which is being
performed by a process instance "Review Document".  A person, lets call him
Nick, might access "Release Product" process instance in order to determine
why the product has not been released yet.  The result will include the
activity observer "Approve Final User Manual" which tells him what is
needing to be done.  That activity observer also has the URI of the
performing process instance "Review Document" and uses this URI to find out
the status of that child process instance.  Similarly, a different person,
let's call her Sonya, has been working on the approval of the user manual,
and wants to find out why this document is being reviewed.  By accessing
the process instance Review Document" she can get the URI of the activity
observer, and can see that it has a description "Approve Final User Manual"
and can see that this is part of a process to "Release Product".

The question is often asked: "Why not cut out the activity observer
resource, and allow browsing directly from parent process instance to child
process instance."  The answer is not apparent until you consider issues
related to integrating two different workflow process definitions, designed
by different people into a single combined process.  The child process, in
the example above, is a generic document review process which is being used
for a user manual, but might be used for any number of different kinds of
documents, and therefor has a very generic description of what is being
done.  The activity observer describes the exact same activity, except it
does so from the point of view of the parent process, and as such helps to
describe the relationship between the parent and child processes.  Remember
that the parent process may be waiting for any number of child processes at
any given time.  Retrieving from the parent process instance a list of
child process instances directly may leave you with 5 instances of the
"Review Document" process.

The ActivityObserver resource also represents a view onto the process
instance that is appropriate for the activity. The data retrieved from the
activity reflects the schema of the invoked process.

3.3 WorkList / WorkItem

WorkItem: A WorkItem is a special kind of process instance that instead of
performing something, simply represents that activity being performed by a
person.  The WorkItems hold the references to the activities for the
people, who will search for and retrieve all of the WorkItems assigned to
themselves

WorkItemFactory: A WorkItem, which is a Process Instance, is created by a
WorkItemFactory, which is a Process Definition.  Each user of the system
will be associated with a particular WorkItemFactory so that all of their
WorkItems will be created and managed by that factory.  Users will be able
to search and retrieve all of the WorkItems that are asigned to them from
the WorkItemFactory.

3.4 URIs

Each resource has an URI address.  This URI should be treated as an opaque
value so that there is no requirements upon it.  A given implementation of
workflow has complete control over how it wishes to create the URI that
names the resource.  It must stick to a single method of producing these
URI names, so that the names can server as a unique id for the resource
involved.  The receiving program should treat it as an opaque value an not
assume anything about the format of the URI.

3.5 Method

Every interaction will specify a method of the request.  The method is a
standard HTTP header field that controls what the server does. The standard
methods for retrieving web pages is GET.  Methods used in this proposal
include PROPFIND, PROPPATCH, GETHISTORY, etc.

3.6 Parameters

Associated with a method will be any number of named values which form the
parameters of the method.  These will be represented in XML in the body of
the request.  Some parameters are optional and may be omitted.  In general,
extra parameters can be added for extensibility;  implementations should
ignore any parameters that it does not understand.

Part of standard http protocol includes the name and password of the person
making the request.  It is assumed that this is used to authenticate the
user, and that the user name is available to the routines that are doing
the processing, so that systems can be selective about whom they give data
to, and can even tailor the response to the requesting user.

3.7 Returned Values

The result of request is a block of data encoded in XML.  Each method
defines the values that it will return.  Some values are marked as optional
and are not required, the rest are required to be part of the return set.
An implementation of a method may return more than the required set of
named value, including new values unique to that implementation, as long as
ignoring those values has no effect on the usefulness of the required
values.  Clients of such implementation should be coded to properly handle
responses that do not include those extended values.

4.0 Protocol & Data Encoding

4.1 HTTP

HTTP/1.1 (RFC-2068) is a protocol that defines a simple way for two
programs to exchange information. The protocol consists of a client program
which initiates a request to a server program.  Any given program may be
capable of being both a client and a server; our use of these terms refers
only to the role being performed by the program for a particular
connection, rather than to the program's capabilities in general.  The
request involves the sending of a request message from the client to the
server.  The response involves the sending of a response message from the
server back to the client.  Both the request and response messages conform
to the RFC-822 message format, which means that they consist of consist of
a start-line, one or more header fields (also known as "headers"), an empty
line (i.e., a line with nothing preceding the CRLF) indicating the end of
the header fields, and an optional message-body.

Certain message may carry entities which can be understood as the
"information payload" of the message.  SWAP extends HTTP by specifying new
methods and entities.  An entity defines a set of entity headers and
(optionally) an entity-body.  The message-body is the entity-body after the
transfer encoding has been applied.

4.2 Message Headers

General headers: HTTP defines a set of general header fields which are
applicable to both request and response messages; these include
Cache-Control, Connection, Date, Pragma, Transfer-Encoding, Upgrade, and
Via. Since these headers are specific to the message, and not to the
entity, SWAP will not make any special requirements on these headers.

Request headers: HTTP defines a set of header fields that are present in a
request message.  These include Accept, Accept-Charset, Accept-Encoding,
Accept-Language, Authorization, From, Host, If-Modified-Since, If-Match,
If-None-Match, If-Range, If-Unmodified-Since, Max-Forwards, Method,
Proxy-Authorization, Range, Referer, User-Agent. SWAP will define new
values for the method header.  Standard methods OPTIONS, POST, PUT, DELETE,
TRACE are not necessarily allowed by SWAP resources. ??? Methods GET and
HEAD are required to be supported but it is not clear at this time what Get
should return.  The rest of the headers, since they pertain to the message
itself will not have any special requirements when used for SWAP.

Response headers: HTTP defines some standard response headers including:
Age, Location, Proxy-Authenticate, Public, Retry-After, Server, Vary,
Warning, WWW-Authenticate.  Since these pertain to the response message,
SWAP add no new requirements on these.

Entity headers: HTTP defines some standard entity headers: Allow,
Content-Base, Content-Encoding, Content-Language, Content-Length,
Content-Location, Content-MD5, Content-Range, Content-Type, ETag, Expires,
Last-Modified.  All SWAP messages exchange XML encoded content, which means
that the following Content-Type value is required on SWAP messages:

   * Content-Type: text/XML

4.3 XML Encoding

The actual entity data to and from the resource is a representation of a
tree structure.  Each node of the tree has any number of named attributes.
The value of an attribute may be a simple value, or may be another node
with more attributes. That tree of objects is encoded into tags with the
tag name being the attribute name, and the value of the attribute between
the start and end tags. Here is an example:


  <swap>
      <interfaces>ProcessInstance</interfaces>
      <key>http://myServer/app1?proc=889</key>
      <validStates>
          <li>open.notRunning</li>
          <li>open.running</li>
          </validStates>
      <state>open.notRunning</state>
      <data>
          <d:city>San Francisco</d:city>
          <d:state>California</d:state>
          </data>
      </swap>


In the example above the root node has the following attributes:
interfaces, key, validStates, state, and data.  The attributes of
interfaces, key, and state have simple values.  The attribute validStates
is a list of items, each item being a simple value.  The data attribute has
a list of fields each field expressed as a tag with the field name
containing the field value  (the "d:" is using the XML namespace mechanism
to prevent these names from colliding with the names of the other tags --
all of the tags will in practice have such prefixes).  This is an example
of the sort of data that might be sent either to or from a resource.  Each
method will specify what data needs to be sent to it, as well as what data
it will send back.  The specification of what data is needed for each
method is described lower in the document.  If a method returned the above
data, then the specification would describe this using a bulleted outline
such as this:


     * interfaces: string
     * key: the address of the resource
     * validStates: a list of items
          o li: a single possible state value
     * state: a string represeting the current state
     * data: a list of fields that rpresent the data that has provided to
       the process instance
          o field: the name of the field


Custom tags will be invented for the known fixed attributes associated with
standard objects and methods.  XML gives you the ability to define new tags
on the fly, and the parser can take those definitions in and extend the
parser so that it can actually enforce the syntax as you define it.  The
order of the named tags do not matter.  If an attribute is missing from the
list, it is treated identically as if it were present with a null value,
thus if a resource has a null value from an attribute it may simply be
omitted from the encoded version.   For strings, there is no distinction
made between a null value and a zero length string; a null will be
represented in the encoding as a zero length string.

4.4 Design Decisions about Methods

While the HTTP based protocol is light and easy to implement, the HTTP
server is usually a stateless server which may need to load information
about the resource which is being requested.  Beacuse of this, a single
large request is usually far more efficient than a series of small
requests. SWAP has been designed to take this into consideration, and in
general to to return as much information as possible in a single request.
For this reason all resources have a PropFind method which returns all of
the properties of an resource in a single call.

Furthermore, there are cases where an attribute on one resource returns a
collection of other resources which could be accessed individually.  In
these cases, along with the URI for for the resource the resulting data set
will include a certain number of other attributes for that resource.  For
example, a request for a list of ActivityObservers includes not only the
URI (which is useful for doing PropFind with) but also the name,
description, priority, etc. of the ActivityObserver.  What this means is
that in the initial listing you retrieve partial information about a
resource.  To get the complete information about a resource you have to
perform the PropFind request on the URI.  This spec must identify which
attributes are included in the partial information.

4.5 Size Limits

The HTTP protocol places no limit on the size of the result information for
a particular request, but in practice if the data gets to be too large,
there requests will tend to get very slow.  SWAP has a built in assumption
that all core data is returned with most requests to the process.  As a
practical limit, process instance should be designed to have a maximum of
64K of data total, and an average process instance handling only 5 to 10K
bytes.  If the process instance needs to handle more data than this, then
the larger pieces of data should be stored as separate documents on a web
server.

4.6 Exceptions

In all operations there will be an optional return value for the
exception.  This will generally be null or empty.  The presence of a value
will indicate that the operation did not complete successfully, and will
contain a description of what when wrong.  The description should not be
assumed to be a simple string value, but is most likely to be a complex
value created by combining several strings together.  For translation
purposes it is desirable to leave the message part of the exception
separate from the data of the exception.  The exception will have the
following attributes:

   * msg - this is the default (English) version of the error message.
     This is a required attribute
   * exception - this exception (error) may have been caused by another,
     lower-level attribute.  If so, the exception attribute contains this
     other lower level exception record.  This can be seen as a linked list
     of exceptions, where the lower level errors are explained or refined
     by higher level error messages.  This attribute is optional.
   * other attributes - attributes can be added that are specific to the
     particular error message.  For example, a "Can not open file" message
     might have an attribute of "filename" included in the exception
     record.  These values are sent separate from the message so that a
     translated version of the message can be substituted for the English
     one, but the date values, like the "filename", can still be included
     in the report to the user.

Issue: Need to consider whether there should be a standard way to encode
the substitution parameters into the error message.  For example, a message
like "Can not open file {filename}" the braces are used to indicate the
place to substiture in the filename attribute.  Java has a standard message
formatting capability that involves braces and numeric indicators; for
example: "Can not open file {0}" where the 0th parameter would be
substituted in.  In this case the attribute name would be "0" in the 'other
attributes' above.  This all sounds very reasonable, but should this be
part of the standard specification in order for interoperability to
succeed?

Issue: Should there be a unique ID attribute for the exception to make
lookup of localized versions of the message more efficient?

4.7 Extensibility

Actual implementations of these resources may extend the set of attributes
returned.  This document defines the required minimum set, as well as an
optional set.  Every implementation MUST return the required attributes.
The implementation may optionally return additional attributes.  Use of
extended attributes must be carefully considered because this may limit the
ability to interoperate with other systems;  in general no system should be
coded so as to require an extended attribute;  instead it should be able to
function is the extended attributes are missing.  Future versions of this
spec will cover the adoption of new attributes to be considered part of the
spec.

4.8 DataTypes

Since all data carried by XML must be encoded into a text format.

Date/time: All date/time values should be expressed in standard UTC format
as specified by ISO 8601.  A 24 hour clock is used, where the hour can
range from 0 to 23.  The year must be a 4 digit year, the month 2 digits,
and the day two digits.  An uppercase T separates the date from the time.
All times are rounded to the nearest second.  A date without a time value
will use 00:00:00 as the specified time.  An uppercase Z on the end
indicates UTC time.  This encoding is consistent with The IF4 MIME spec
requirements for date/time encoding.  Specifically, the following format
must be used where the underlined parts have values substituted into them:

   * yyyy-mm-ddThh:mm:ssZ

Numbers: Numeric values are expressed in text using standard ASNI-C literal
expressions.  The decimal separator for floating point numbers must be a
period character (".").

Boolean: values are encoded with "1" representing true, and "0"
representing false.

4.9 Security

HTTP provides for both authenticated as well as anonymous requests.
Because of the nature of workflow in controlling access to resources, many
operations will not be allowed unless accompanied by a valid and
authenticated user id.  There are two primary ways that this will be
provided:

  1. the first and most common method of authentication over HTTP is
     through the use of the Authorization header.  This header carries a
     user name and a password which can be used to validate against a user
     directory.  If the request is attempted but the authentication of the
     user fails, or the Authorization header field is not present, then the
     standard HTTP error "401 Unauthorized" is the response.  Within this,
     there are two authentication schemes:
        o basic involves carrying the name and password in the
          authorization field and is not considered secure.
        o A digest authentication for HTTP is specified in RFC-2069 which
          offers a way to securly authenticate without sending the password
          in the clear.
  2. encryption at the transport level, such as SSL, can provide
     certificate based authentication of the user making the request.  This
     is much more secure than the previous option, and should be used when
     high security is warranted.

Because the user id is being provided by the lower levels, SWAP does not
specify how to send the client user id.  The authenticated user ID can be
assumed to be present in the server at the time of handling the request.

Note that since most SWAP interactions are between programs that we would
normally consider to be servers (i.e. workflow engine to workflow engine)
the conclusion can be made that all such workflow engines will need a user
id and associated values (e.g. password or certificate) necessary to
authenticate themselves to other servers.  Servers must be configured with
the appropriate safeguards to assure that these associated values are
protected from view.  Under no circumstances should a set of workflow
engines be configured to make anonimous SWAP requests that update
information since the the only way to be sure that the request is coming
from a trustable source is through the authentication.

With the authentication requirements above, of either HTTP authorization
header field or SSL secure transport, SWAP should be able to protect and
safeguard sensitive data while allowing interoperability to and from any
part of the internet.

5.0 Interface Documentation

Below each of the methods will be specified using a table such as this
one.  Each section is explained here:

      Method:      This will be the name of the method and a short
                   description of what it does.
  Parameters:    * This is a list of the parameters for the method that
                   are encoded into the body of the request.  The order of
                   these parameters is unimportant.
 Result Page:    * This is a list of the return value incoded in the body
                   of the result.

After the table will be more general explanation of the function and other
things that should be known about it.

                       5.1 ProcessInstance Interface

The ProcessInstance interface must be implemented by all resources that
represent the execution of a long term asynchronous service, or in other
words to perform work.  The purpose of this interface is to allow the work
to proceed asynchronously from the caller.  The ProcessInstance represents
a unit of work, and a new instance of the ProcessInstance resource must be
created for every time the work is to be performed.

The performing of the work may take anywhere from minutes to months, so
there are a number of operations that may be called while the work is going
on.  While the work is proceeding, HTTP request can be used to check on the
state of the work.  If the input data has changed in the meantime, new
input values may be supplied to the ProcessInstance, though how it responds
to new data is determined by details about the actual task it is
performing.  Early values of the result data may be requested, which may or
may not be complete depending upon the details of the task being
performed.  The results are not final, until the unit of work is
completed.  When the state of the ProcessInstance changes, it can send
events to the Observer informing it of these changes.  The only event that
is absolutely required is the "completed" or "terminated" events which tell
the requesting resource that the results are final and the ProcessInstance
resource may be disappearing.

While a workflow process will implement ProcessInstance, it is important to
note that there are also many non-workflow resources which will implement
the ProcessInstance interface;  it will also be implemented on any discrete
task which needs to be performed asynchronously.  Thus a wrapper for a
legacy CICS transaction would implement the ProcessInstance interface so
that that legacy application could be called and controlled by any program
that speaks SWAP.  A driver for an actual physical device, such as a
numerical milling machine, would implement the ProcessInstance interface if
that device is to be controlled by SWAP.  Any program to be triggered by a
workflow system that takes a long time to perform should implement the
ProcessInstance interface, for example a program that automatically backs
up all the hard drives for a computer.  Since these resources represent
discrete units of work (which have no subunits represented within the
system) these resources will not need to have any ActivityObservers.

A ProcessInstance resource that is a workflow process is distinguished by
the fact that it contains active ActivityObserver resources.  A
ProcessInstance can contain any number of ActivityObservers.  These
ActivityObservers represent requests for parts of the work to be performed,
either from people or from other ProcessInstance resources.

      Method:      PROPFIND - this is a single method that returns all the
                   values of all the attributes of the resource.
  Parameters:    * resultDataAttributes: (optional) this is a list of
                   field names to specify which of all the result values
                   are to be returned.  If this is empty or missing than
                   all result data values are included.
 Result Page:    * interfaces: the names of the interfaces implemented on
                   this resource.  A resource may implement multiple
                   interfaces.  The purpose of this field is to tell
                   receives what kinds of requests can be made to the
                   resource.
                 * name: The name attribute holds is a human readable
                   identifier of the resource; the name of a resource is
                   unique within the scope of its parent.  The
                   ProcessInstance name is automatically generated by the
                   ProcessDefinition and is usually a simple unique
                   integer.
                 * key: the proper URI of this resource.  This is a
                   globally unique.  It is the one preferred URI for the
                   resource.
                 * subject: a short description of this instance of the
                   ProcessInstance.  Sort of like the subject of an email
                   message, it tells a little bit about this invocation of
                   the service.
                 * description: a longer description of the instance of
                   the ProcessInstance.  To find a description of what the
                   perfomer generically (as opposed to this instance) does
                   get the description of the process definition.
                 * state: a string value that denotes the current state of
                   the resource
                 * validStates: a collection of possible state values
                   allowed by this resource.
                 * definition: the URI of the process definition resource.
                 * activities: a list of records containing for each
                   active activity in the process:
                      o URI: the URI of the active ActivityObserver
                      o name: the name
                      o state: the state
                      o expirationDate: the (next) deadline date for this
                        activity
                      o assignees: a list of distinguished names of people
                        assigned to this activity
                      o creationDate: the date the activity became
                        available
                      o hasExpired: a boolean that states whether this
                        activity is beyond a deadline.
                 * observer: the observer URI that should be used to
                   notify about completion of the process instance, or
                   other events. Optional.
                 * resultData: the set of name value pairs that represents
                   the current result values; this list is not necessarily
                   complete until the ProcessInstance is in a completed
                   state.  A list of items:
                      o name:
                      o value:
                 * priority: The priority of a ProcessInstance defines its
                   relative importance. The values can range from 1 to 5
                   with 1 being highest priority (most important).
                   Default value is 3.  Optional.
                 * userInterface: the URI to the user interface of the
                   process instance.  Launching a web browser on this URI
                   would allow the user to view and manipulate the process
                   instance. Optional.
                 * creator: the globaly unique distinguished name of the
                   user that was authenticated in order to create the
                   process instance. Optional.
                 * lastModified: The 1061 encoded date of the last
                   modification. Optional.
                 * exception: if any, and if present, the above values may
                   be empty


      Method:      PROPPATCH - a uniform way to set any number of
                   attributes of a resource simultaneously.
  Parameters:    * subject: (optional) The short description of this
                   instance of  the resource.
                 * description: (optional) a longer description of the
                   instance of the resource
                 * state: (optional) the new state to change to.  The
                   state is specified as a string which must be one of the
                   allowed states of the resource.  Not all states are
                   reachable from the current state and so this operation
                   may return an exception if the desired state is not
                   reachable.
                 * priority: (optional) an integer  from 1 to 5, with 1
                   being highest priority.
                 * data: (optional) a collection of name value pairs that
                   represent the context of this ProcessInstance.  The
                   names of the fields are from the schema defined by this
                   resource.  The context is considered to be the union of
                   the previous context and these values, which means that
                   a partial set of values (e.g. a single name value pair)
                   can be used to update just those fields in the partial
                   set having no effect on fields not present in the
                   call.; a list of items:
                      o name:
                      o value:
 Result Page:    * returns the same thing that PropFind returns

All resources implement PROPPATCH and allow as parameters all of the
settable properties.  This method can be used to set at least the
displayable name, the description, or the priority of a workflow resource.
This is an abstract interface, and the resources that implement this
interface may have other properties that can be set in this manner.  All of
the parameters are optional, but to have any effect at least one of them
must be present.  Subclasses will naturally allow for more attributes to be
set.  This returns the complete info for the resource, just as the PropFind
method does, which will include any updated values. This behavior is
defined to be the same as the PROPPATCH method defined in the WebDAV
protocol.

      Method:      TERMINATE - cancel the execution of the process. Used
                   when the initiator is no longer interested in the
                   service being performed.
  Parameters:    * reason: a descriptive reason, if any, as to why this
                   process is being terminated prematurely for recording
                   in the log.
 Result Page:    * exception: if any, and if present, the above values are
                   empty

When a ProcessInstance is terminated that is waiting on other
ProcessInstances, then it should terminate those ProcessInstances that is
waiting on.

 5.1.1 Notification.

To allow scalability ProcessInstances will notify Observers when important
events occur.  Observers must register their URIs with the ProcessInstance
in order to be

      Method:      SUBSCRIBE - This is a way for other implementations of
                   the Observer interface to register themselves to
                   receive posts about changes in process instance state.
                   Not all ProcessInstance resources will support this;
                   those that do not will return an exception value that
                   will explains the error.
  Parameters:    * observer: an URI to a resource that both implements the
                   Observer interface and will receive the events.
 Result Page:    * exception: if any


      Method:      UNSUBSCRIBE - This is the opposite of the subscribe
                   method.   Resource removed from being listeners will no
                   longer get events from this resource.
  Parameters:    * observer: The URI of the resource to be removed from
                   the listeners list.  This must match exactly to an URI
                   already in the list; if it does, then that URI will be
                   removed;  if not, then there will be no change to the
                   process instance.
 Result Page:    * exception: if any


 5.1.2 Transactions

In the case of a synchronous service, the execution of a service would
normally be completely within a single transaction.  Asynchronous services
which have several ActivityObservers will normally have several
transactions.  It is important to distinguish between a transaction which
will normally be a single interaction with the ProcessInstance, and the
execution of the ProcessInstance which may span any number of
transactions.  Each HTTP request to the ProcessInstance will have an
identified user using standard HTTP authentication.  Any interactions that
causes a change in the ProcessInstance will probably need to be committed
and saved after the interaction since there can be any amount of time
before the next interaction.  Some services will keep a record of these
interactions, under whose authentication they ran, and what the results
were so that all this can be reviewed later.


      Method:      GETHISTORY - returns the list of all events that have
                   occurred on this resource.  Every interaction with the
                   service is a transaction and typical services will
                   record every transaction in a history log. There is no
                   requirement that the service keep a history log, but if
                   it does the history should be returned with this
                   method.
  Parameters:    * filter: the filter condition on the set of history
                   items.  If the filter is missing, then all history
                   items that pertain to this ProcessInstance will be
                   returned.
                 * filterType: an value that indicates what language the
                   filter is expressed in.
 Result Page:    * history: a list of event objects, each event object
                   contains:
                      o timestamp: UTC time of the event
                      o eventCode: an integer event code value. A list of
                        valid event codes is defined for work processes,
                        work activities and work items in their respective
                        sections below. Event codes 0...255 are reserved
                        for this purpose; vendor specific extensions may
                        use event codes outside of that range.
                      o eventType: a human readable description of the
                        type of the event; for event codes in the reserved
                        range the value of this attribute is ’WfMF’.
                      o responsible: the destinguished name of the
                        participant that caused the event.
                      o sourceKey: the URI of the resource that the event
                        is referring to.
                      o sourceName: the user friendly name of the source
                        resource
                      o containerKey: the URI of the containing resource,
                        if any
                      o oldState: if this was a state change event, then
                        this is the old state
                      o newState: if this was a state change event, then
                        this is the old state
                      o transition: if this was a state change event, the
                        name of the transition taken.
                      o changedData: if this was a dataChanged event, a
                        collection of name/value pairs that represent the
                        data items that were changed.
                      o changedRole: if this was a ParticipantChangedEvent
                        event, the name of the role that changed
                      o participants: if this was a
                        ParticipantChangedEvent event, the resulting list
                        of distinguished names of the participants of the
                        role.
                 * exception: if any
                      o the HistoryNotAvailable exception is raised if
                        access to history information is not supported for
                        the specific workflow resource.

Because history is potentially lengthy, it is not included in the PropFind
method results.  Instead it must be retrieved through the use of this
method.

Multi server transactions:  SWAP does not include any way for multiple
servers to participate in the same transactions.  It will be up to
individual systems to determine what happen if a SWAP request fails;  In
some cases it should be ignored, in some cases it should cause that
transaction to fail, and in some cases the operation should be queued to
repeat until it succeeds.

5.1.3 ProcessInstance States

ProcessInstance resources must implement the following states, as
consistent with the WfMC process instance states:

   * open.notRunning.notStarted - A workflow resource is in notStarted
     state when it has not yet actively participated in the enactment of a
     work process.
   * open.notRunning.suspended - When a workflow resource is suspended, no
     workflow resources contained in this element may be started.
   * open.running - In this state a workflow resource is performing its
     part in the overall execution of the workflow process.
   * closed.completed - When a workflow resource has finished its task in
     the overall workflow process it enters the completed state; it is
     assumed that all workflow resources contained in that element are
     completed when it enters this state.
   * closed.terminated - Execution of a workflow resource may be terminated
     before it completes its task. It is assumed that all workflow
     resources contained in this element are either completed or are
     terminated when it enters this state.
   * closed.aborted - A workflow resource may be aborted before it
     completes its task  (or even before it ever started performing its
     task). No assumptions on the state of workflow resources contained in
     this element are made when it enters this state.


                      5.2 ProcessDefinition Interface

The interface for resources that can create ProcessInstances. The
description of a process definition is the description of what the
ProcessInstance that it creates does.

      Method:      PROPFIND - this is a single method that returns all the
                   values of all the attributes of the resource.
  Parameters:    * (none)
 Result Page:    * interfaces: the names of the interfaces implemented on
                   this resource.
                 * name: The name attribute holds is a human readable
                   identifier of the  resource; the name of a resource is
                   unique within the scope of its parent.  In some cases
                   the name may be nothing more than a unique number.
                 * key: the proper URI of this resource.  This is a
                   globally unique.  It is the one preferred URI for the
                   resource.
                 * description: a longer description of this process
                   definition
                 * state: a string value that denotes the current state
                   value.
                 * validStates: a collection of possible state values
                   allowed by this resource
                 * contextDataInfo: meta-data information about what name
                   values pairs are expected to be put into this process
                   at start time; a list of items:
                      o name:
                      o type:
                 * resultDataInfo: meta-data information about what name
                   values pairs are expected to be returned by this
                   process upon completion; a list of items:
                      o name:
                      o type:
                 * exception: if any, and if present, the above values may
                   be empty


      Method:      CREATEPROCESSINSTANCE
  Parameters:    * observer: the URI to the Observer resource. If present,
                   then the process instance is expected to report state
                   changes, especially the transition to completed state,
                   to this resource
                 * name: the name of the process instance to create.  This
                   must be unique for all of this kind of ProcessInstance.
                   Process Definitions will attempt to use this value but
                   if not unique, they will either modify the value until
                   it is unique, or else generate a new value, so the use
                   of this value can not be counted upon
                 * subject: a short description of why the ProcessInstance
                   is being created
                 * description: a longer description of the
                   ProcessInstance.
                 * contextData: a collection of name/value pairs:
                      o name:
                      o value:
                 * startImmediately: (optional) a boolean "yes" or "no"
                   that specifies whether the newly created process should
                   be started immediately.  If not started, then the
                   process is in an "initial" state, and you have to call
                   the start operation on it.  Default is "yes"
 Result Page:    * key: The URI of the new ProcessInstance resource that
                   has been created.
                 * exception: if any, and if present, the above values are
                   empty

Given a process definition resource, this method is how instances of that
process are created.  There are two modes: create the process, with data,
and start it immediately; or just create it and put the data on it and
start it manually.

      Method:      LISTINSTANCES - return a collection of process
                   instances, each instance described by a few important
                   process instance attributes.
  Parameters:    * filter: a filter to specify what kinds of process
                   instance resource you are interested in.
                 * filterType: a value that indicates what language the
                   filter is expressed in.
 Result Page:    * instances: a list of values each containing
                      o key: the URI of the ProcessInstance resource
                      o name: the display name
                      o priority: the priority
                 * exception: if any, and if present, the above values are
                   empty


                           5.3 Observer Interface

This is an abstract interface for resources that can request work to be
done, and can receive events of their state changes.

      Method:      PROPFIND - gets all the attribute values for the
                   resource.
  Parameters:
 Result Page:    * interfaces: the names of the interfaces implemented on
                   this resource.
                 * key: the proper URI of this resource.  This is a
                   globally unique.  It is the one preferred URI for the
                   resource.
                 * data: (optional) A resource implementing the observer
                   interface may return the context data, which is a
                   collection of name value pairs which are process
                   attributes.  The distinction between the context and
                   the instanceData is that the context may have shifts in
                   the names of the attributes to accomodate the sub
                   process.  In otherwords, the context is in the schema
                   defined by the subprocess.
                      o name
                      o value
                 * performer: the list of URIs of the ProcessInstance(s)
                   of this Observer.
                 * exception: if any, and if present, the above values may
                   be empty

Remember that the implementation of the resource may cause it to return
other values as well;  PropFind always returns the union of all the
properties specified by all the interfaces that the resource implements.
The property above is a minimum set.

      Method:      PROPPATCH - a uniform way to set any number of
                   attributes with a single operation.  All of the
                   parameters are optional, but of course at least one
                   must be present for this method to do anything.
  Parameters:    * ProcessInstance: the URI of a process that is
                   performing this work, if it exists.  This is needed if
                   there is more than one ProcessInstance.
                 * resultData: (optional) a list of name value pairs that
                   are the result data from the ProcessInstance.
 Result Page:    * exception: if any

This is how the subprocess can communicate changes in the data back to the
observer resource before the time of completion, in order to keep the
attribute values of the two processes synchronized.

      Method:      COMPLETE - indicate that the ProcessInstance has
                   completed the work.  This is the 'normal' completion.
  Parameters:    * ProcessInstance: the URI of a process that is
                   performing this work, if it exists.  This is needed if
                   there is more than one ProcessInstance.
                 * exit: (optional) This tells which exit point was
                   reached
                 * resultData: a collection of name/value pairs that
                   represent the final set of data as of the time of
                   completion
 Result Page:    * exception: if any, and if present, the above values are
                   empty

This function signals to the observer resource that the started process is
completed its task, and will no longer be processing.  There is no
guarantee that the resource will persist after this point in time.

      Method:      TERMINATED - This is how the ProcessInstance indicates
                   that it is no longer running because someone has
                   terminated it before it reached completion.
  Parameters:    * reason: (optional) the reason that the process was
                   terminated prematurely, if available
 Result Page:    * exception: if any, and if present, the above values are
                   empty

This function allows the subprocess to communicate that is it abnormally
ended for any of a number of reasons.  The reason for the termination is
passed as a parameter, but this is a descriptive value much like the
exception values.  The resource is not guaranteed to exist after this call.


      Method:      NOTIFY - this method used to send an event to a
                   subscribed resource, particularly the Observer resource
                   for a process instance.
  Parameters:    * eventObject: The event object contains a number of
                   parameters, which may be extended by systems.
                      o timestamp: the UTC time that the event fired
                      o eventCode:
                      o eventType: one of an enumerated set of values to
                        specify event types.
                      o sourceKey:
                      o sourceName:
                      o containerKey:
                      o oldState: (optional) for a state change event,
                        this is the original state.
                      o newState: (optional) for a state change event,
                        this is the new state.
                      o transition: (optional) for a state change event,
                        this is the transition that was used.
                      o changedData: (optional) for a data changed event,
                        this specified the data that has changed, which is
                        a list of items:
                           + name
                           + value
                      o role: (optional) for a role changed event this
                        specifies the role.
                      o participants: (optional) a list of participants
                        that are now assigned to the role.
 Result Page:    * exception: if any, and if present, the above values are
                   empty

The ProcessInstance communicates to the observer via events.  This is the
method that is used to gives the other resource the event.

                       5.4 ActivityObserver Interface

The ActivityObserver is not a performer of work, but rather the requester,
and subsequent observer of work.  Instantiation of a ActivityObserver
resource is the way to ask a workflow system to perform work.  It may
internally have many levels of representation of that work, breaking it
into numerous tasks and subtasks.  Those internal levels are not the
subject of this version of standardization (but are good candidates for
version 2 of this spec.)  Eventually the workflow system breaks the tasks
out to the point where it needs to request work to be performed by a
exernal resource.  By external, we mean that the request will be
coordinated purely by the standard mechanisms outlined in this
specification.  In order for a workflow system to coordinate externally
performed work, it must have an instance of a resource that implements the
ActivityObserver interface.

ActivityObserver extends the Observer interface; it is a request for work
to be done which is part of a bigger process. A ActivityObserver does not
have to be performed by a subprocess, but can be performed by people using
a user interface that calls methods on the ActivityObserver resource
directly, for instance to indicate that the activity is completed, or to
send the result data values.  A ActivityObserver resource provides a way to
browse up to the ProcessInstance that it is contained by.

The primary purpose of the ActivityObserver resource is to indicate what
activities are currently being done within a process.  Given a reference to
the ProcessInstance resource, a method will return a collection of the
currently active activities.  From the ActivityObserver, one can discover
the sub ProcessInstance resources if any exist, which may contain more
current activities.  In this way, distributed workflow of any scale can be
navigated.

When a ActivityObserver is completed (it is told that the work is complete)
then the workflow system, through the use of internal logic, determines
what new activity is enabled.  It is important to note that this
specification does not include a definition of how that logic is configured
or how it executes;  this will presumably be the subject of future
specifications.  What matters though is that a ProcessInstance communicates
to an activity resource.

It is the responsibility of the ActivityObserver to conform to the
interface required by the ProcessInstance that is performing the work.
This means that the context data will be supplied to the ProcessInstance
using the fieldnames and meanings that it expects.  It means that as the
ActivityObserver resource receives data changed events, that data will be
expressed with the set of fields defined by the performing
ProcessInstance.  The overall effect of this is that the ProcessInstance
can be implemented without any knowledge of the resources that will call
it; but the ActivityObserver must have a certain minimal knowledge of the
process it is calling.  The ProcessDefinition interface supplies that
knowledge when requested.

      Method:      PROPFIND
  Parameters:    * (none)
 Result Page:    * interfaces: the names of the interfaces implemented on
                   this resource.
                 * name: The name attribute holds is a human readable
                   identifier of the  resource; the name of a resource is
                   unique within the scope of its parent.  In some cases
                   the name may be nothing more than a unique number.
                 * key: the proper URI of this resource.  This is a
                   globally unique.  It is the one preferred URI for the
                   resource.
                 * description: a longer description of the instance of
                   the resource
                 * state: a string value that denotes the current state
                   value.
                 * states: a collection of possible state values allowed
                   by this resource
                 * ProcessInstance: If the activity has a ProcessInstance
                   (sub-process) associated with it, then the URI of the
                   ProcessInstance is listed here
                 * container: this is the URI of the ProcessInstance
                   resource which contains this work activity.
                 * priority: like the priority on a ProcessInstance.
                 * contextData: The data as appropriate for this activity,
                   a list of item:
                      o name:
                      o value:
                 * assignees: a list of distinguished names of the person
                   or people assigned to this ActivityObserver.
                 * conclusions: a list of conclusion values which may be
                   used in the completed operation; these are the ways
                   that an activity can be completed.
                 * userInterface: the URI to a page which is the user
                   interface for this resource, if one exists.  This URI
                   is accessed using the GET method.
                 * expirationDate: the (next) deadline date for this
                   activity.  Presumably, when this date/time is reached
                   the system will do something, like escalate the
                   activity, or continue the process without this
                   activity.  Optional.
                 * hasExpired: a boolean value that tells whether this
                   activity is currently beyond a deadline date.
                   Optional.
                 * creationDate: the date this activity became available.
                 * conclusions: a list of values that can be used in the
                   completed operation in order to indicate how the
                   activity was completed.  For instance may systems ask
                   the user to specify "approved" or "not-approved".
                   These conclusions would be listed in this attribute.
                   It is important to note that completing an activity
                   with "not-approved" is not the same as terminating the
                   activity.  Thr former indicates that the process is
                   fine, but the subject needs rework, where the latter
                   (terminate) might indicate that the process is broken.
                 * exception: if any
 .

      Method:      PROPPATCH
  Parameters:    * priority: the priority of the work process.
                 * resultData: the data that resulted from the performing
                   of the activity.  This can be a partial set of the
                   data; a list of items:
                      o name:
                      o value:
 Result Page:    * (same results as PropFind)
                 * exception: if any


      Method:      COMPLETE
  Parameters:    * data: (optional) the set of name value pairs that
                   represent the result value of this work.; a list of
                   items:
                      o name:
                      o value:
                 * option: (optional) The completion option that was
                   chosen to complete the activity
 Result Page:    * exception: if any, and if present, the above values are
                   empty
This is how the workflow system is told that a work item has been completed


                           5.5 Servlet Interface

The servlet interface is not a necessary part of the SWAP protocol, but is
included here as a convenience for having a consistent way to package up
parameters and call a synchronous service via HTTP.  This interface is
based on that of the Java Servlet interface.  A generic synchronous
resource can implement the servlet interface, and a remote system will be
able to pass it parameters encoded in XML, invoke the operation, and get
the results encodedin XML.  There is only one method: RUN.  Each function
that you call will have its own Servlet resource with its own URI.

      Method:      RUN
  Parameters:    * (depends upon the function being called)
 Result Page:    * (depends upon the function being called)
                 * exception: if any


   * Issue: a search should be made to determine if this has already been
     defined in a different spec


                           5.6 WorkList Interface

The worklist is a ProcessDefinition, so it inherits all those functions.
Creating a workitem done by using the standard createProcessInstance
function.  A list of workitems is retrieved using the
listAllProcessInstances method.  The only thing unique about a WorkList is
that the ProcessInstances that it creates do not actually do anything, but
instead represent a person doing it.  They make it possible for the person
to search for an find all the workitem assigned to that person.

The scheme is that for each user, the user directory would list the URI of
the worklist server for that user.  A workflow system that assigns an
activity to a user, would look for the worklist server for that user, and
then create a workitem (ProcessInstance) that matches up with the activity.


                           5.7 WorkItem Interface

The ProcessInstances that are created (called workitems) are a little
different than normal ProcessInstances. Normally a ProcessInstance is
programmed to perform a particular task, and it can give you information
about that task.  The workitem does not have any preprogrammed activity
(other than simply "doit"). It instead picks up the description of the task
from the activity, which is something that other ProcessInstances rarely if
ever do.

WorkItems point a user to an activity.  They allow the user a place to
store the state of the activity, for example if the activity is paused this
could be indicated int he status of the workitem.  The user does not
interact with the workitem other than to find the activity.  Given the URI
of the activity, the user deals directly with the activity.  When the
activity is completed, the workflow system terminates the workitem, causing
it to disappear from the ther user's worklist.

                          5.8 EntryPoint Interface

The EntryPoint is a resource that describes a particular way that a process
instance may be started.  The ProcessDefinition resource provides a
collection of EntryPoints.  Each EntryPoint may have different requirements
of data to be provided.  Access to an entry point can be controlled by the
engine, for example an organization can have an 'internal' EntryPoint that
allows some fields to be specified, and an 'external' EntryPoint which is
more restrictive.  While EntryPoints provide some powerful capabilities for
starting process instances, they are not required, since process instances
can be started directly on the ProcessDefinition object.

      Method:      PROPFIND - this is a single method that returns all the
                   values of all the attributes of the resource.
  Parameters:    * (none)
 Result Page:    * interfaces: the names of the interfaces implemented on
                   this resource.
                 * name: The name attribute holds is a human readable
                   identifier of the  resource.
                 * key: the proper URI of this resource.  This is a
                   globally unique.  It is the one preferred URI for the
                   resource.
                 * description: a longer description of this process
                   definition
                 * conclusions: A list of 'conclusion' values that can be
                   used in the create process instance command.
                 * definition: the URI of the process definition.
                 * contextDataInfo: meta-data information about what name
                   values pairs are expected to be put into this process
                   at start time; a list of items:
                      o name:
                      o type:
                 * resultDataInfo: meta-data information about what name
                   values pairs are expected to be returned by this
                   process upon completion; a list of items:
                      o name:
                      o type:
                 * exception: if any, and if present, the above values may
                   be empty

The EntryPoint does not have any properties that can be set on it.
Furthermore, there is only a single operation, CreateProcessInstance.

      Method:      CREATEPROCESSINSTANCE
  Parameters:    * observer: the URI to the Observer resource. If present,
                   then the process instance is expected to report state
                   changes, especially the transition to completed state,
                   to this resource
                 * name: the name of the process instance to create.  This
                   must be unique for all of this kind of ProcessInstance.
                   Process Definitions will attempt to use this value but
                   if not unique, they will either modify the value until
                   it is unique, or else generate a new value, so the use
                   of this value can not be counted upon
                 * subject: a short description of why the ProcessInstance
                   is being created
                 * description: a longer description of the
                   ProcessInstance.
                 * contextData: a collection of name/value pairs:
                      o name:
                      o value:
                 * startImmediately: (optional) a boolean that specifies
                   whether the newly created process should be started
                   immediately.  "0" means don't start, while a "1" means
                   start immediately.  If not started, then the process is
                   in an "initial" state, and you have to call the start
                   operation on it.  Default is "1"
 Result Page:    * key: The URI of the new ProcessInstance resource that
                   has been created.
                 * exception: if any, and if present, the above values are
                   empty


  ------------------------------------------------------------------------

6.0 References

The following documents are relevant to this specification, and may be
referenced in the text:

[1] Workflow Terminology (English), The Workflow Management Coalition,
WFMC-TC-1011, version 2.0, June-1996, in PDF Format:
http://www.aiim.org/wfmc/standards/docs/glossary.pdf .  The terms used in
this document are consistent with those found in this glossary.  Also note
that glossaries in French and (soon) German are available at the same web
site.

[2] "Interoperability / Internet e-mail MIME Binding", The Workflow
Management Coalition, WFMC-TC-1018, 1.1, July 1998 describes interoperation
between workflow services using SMTP/MIME mail:
http://www.aiim.org/wfmc/standards/docs/if4-a.pdf.

[3] "Reference Model", The Workflow Management Coalition, WFMC-TC-1003,
29-Nov-94, 1.1 describes the major components of a workflow system:
http://www.aiim.org/wfmc/standards/docs/rmv1-16.pdf.

[4] "HTTP - Hypertext Transfer Protocol" the latest information about HTTP
can be found at http://www.w3.org/Protocols/

[5] "Hypertext Transfer Protocol -- HTTP/1.1", RFC-2068 the current
proposed standard:  http://www.w3.org/Protocols/rfc2068/rfc2068

[6] Crocker, D., "Standard for the Format of ARPA Internet Text Messages",
STD 11, RFC 822, UDEL, August 1982:
http://www.w3.org/Protocols/rfc822/rfc822.txt

[7] "An Extension to HTTP : Digest Access Authentication" RFC-2069, January
1997: http://www.w3.org/Protocols/rfc2069/rfc2069.txt

7.0 Version History and Notes

7. 1 Meeting May 4-5

This document was circulated for preliminary review with the goal of
meeting and discussing the contents on May 4-5 in Costa Mesa California.
The following URI was made available for up to date information about this
effort: http://www.ics.uci.edu/pub/ietf/swap/

7. 2 Update for WfMC meeting, May 6

The following changes were made to reflect the results of the May 5
meeting:

   * changed the term "performer" to be "process instance"
   * changed the term "performerFactory" to be "process definition"
   * changed the term "WaitActivity" to "ActivityObserver"
   * Expanded the explanation of the ActivityObserver and why it exists.
   * changed "command" to method and rewrote the description
   * updated the XML encoding section to reflect new information about this
   * changed "getInfo" to PropFind to be the method to get properties
   * receiveEvent changed to NOTIFY to conform with proposed notification
     service.
   * addListener and removeListener changed to SUBSCRIBE and UNSUBSCRIBE
   * removed the ProcessDirectory object as it is not needed.
   * added Servlet interface for synchronous interactions

7. 3 Update for July Version

   * changed URL to URI
   * changed PROPSWITCH to PROPPATCH
   * changed object to resource
   * added references, terminology, related documents
   * new section on HTTP, messages, and header fields
   * added a section on security

8.0  Acknowledgements

A number of people have participated in the development of this document
and the related ideas which come largely from earlier work:

Marc-Thomas Schmidt, IBM
Dan Matheson, CoCreate
Mike Marin, FileNET
George Buzsaki, Oracle Corp.
Surrendra Reddy, Oracle
Larry Masinter, Xerox PARC
Martin Adder
Mark Fisher, Thomson
Members of the Workflow Management Coalition
And many others...

9.0 Copyright

Copyright (C) The Internet Society 1998.  All Rights Reserved.

This document and translations of it may be copied and furnished to others,
and derivative works that comment on or otherwise explain it or assist in
its implmentation may be prepared, copied, published and distributed, in
whole or in part, without restriction of any kind, provided that the above
copyright notice and this paragraph are included on all such copies and
derivative works.  However, this document itself may not be modified in any
way, such as by removing the copyright notice or references to the Internet
Society or other Internet organizations, except as needed for the  purpose
of developing Internet standards in which case the procedures for
copyrights defined in the Internet Standards process must be followed, or
as required to translate it into languages other than English.

The limited permissions granted above are perpetual and will not be revoked
by the Internet Society or its successors or assigns.

This document and the information contained herein is provided on an "AS
IS" basis and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE
DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY
RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
PARTICULAR PURPOSE.

9.0 Author Contact Information

Keith Swenson
Netscape Communications Corporation
501 E. Middlefield Rd.
San Jose, CA, 94043
kswenson@ms2.com