This section contains information about architectural decision that have been taken. This document will continuously be updated as the project moves on and further insights into the problem are gained.
The ProcessController is the core of the engine
and contains the execution logic for every BPEL activity. The
ProcessController needs to be thread-safe as several
threads may use it simultaneously.
The DispatcherThread's sole responsibility is to call the
dispatchMessage() method on the
ProcessController in a new thread.
The ProcessInstanceFactory is responsible for creating
a new ProcessInstance. This happens by looking up the
BPELProcess and the ProcessContext that
is associated with the incoming message.
Given an incoming message, the BPELProcessLocator is
responsible for looking up the appropriate deployed
BPELProcess.
Analogous to the BPELProcessLocator, the
ProcessContextLocator is responsible for looking up the a
ProcessContext object that matches the incoming message.
This might include comparing CorrelationSets.
The ProcessInstance contains no logic at all but merely
serves as a container for encapsulating a ProcessContext
instance and its corresponding BPELProcess reference.
Thus the fusion of the ProcessContext and the
BPELProcess together form a ProcessInstance.
A new ProcessContext will be created for every new
process instance. The ProcessContext contains state
information about a very specific process instance. This includes:
ProcessController to be
able to resume asynchronous process execution. Another optional use
of this information might be a later process execution tracing (e.g.
for graphical representations of an executing or finished process).
The ProcessContext should be made persistent.
A BPELProcess is basically the blueprint of a business
process. There exists exactly one BPELProcess object
per deployed BPEL document.
The BPELProcess interface needs to foresee methods such
as how to obtain the next Activity in a process. How this
will be achieved exactly, depends on the underlying implementation.
The BPELProcess is tightly coupled with the
Process object representing the <process> element
in a BPEL document.
Upon deployment a BPELProcess needs to be made
persistent.
A BPELProcessFactory follows the GoF Abstract Factory
Pattern to create different BPELProcess implementations.
A BPELProcessTreeFactory is a concrete factory
implementing the BPELProcessFactory interface to create a
BPELProcessTree instance.
A BPELProcessTree implements the BPELProcess
interface given a tree structure.
The package bexee.model contains a number of classes that
map directly to the elements in a BPEL document and thus enable a
object representation of the BPEL document. The classes don't provide
any logic and the objects are used as pure value objects.
The package bexee.model.impl contains classes
implementing the interfaces in package bexee.model. The
default bexee implementation uses a tree structure to represent a
BPELProcess and thus the implementing classes will also
implement the Vertex interface, because they will be the
nodes of the process tree.
Some elements such as Sequence are special vertices,
because they have the ability to expand their children. Note that this
functionality is specific to a given BPEL activity, but not
incorporated into the Vertex public interface. Thus the
Vertex interface doesn't provide functions to expand an
element, but the tree containing the vertices must provide this
functionality given a Vertex.