blob: 8ba36c5530d745696c58245fe9c924d7ebe2d05f [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta name="generator" content=
"HTML Tidy for Windows (vers 1st July 2003), see www.w3.org" />
<title>Whiteboard notes for Chain of Responsibility
Package</title>
</head>
<body bgcolor="white">
<div align="center">
<h1>Whiteboard notes for <em>Chain of Responsibility</em>
Package</h1>
</div>
<h3>Agility</h3>
<p>Agility is a working project name for a business applications
framework based on the Commons Chain package.</p>
<p>The core idea behind Agility that is as much work as possible
should be pushed up to the business layer. Input and output is
encapsulated with a Context object that is passed to and from
Agility using a ProtocolAdaptor. Depending on its implementation,
a ProtocolAdaptor may collect input and deliver output directly
from the native platform or from a presentation framework.</p>
<p>Agility is a Request/Response framework: for each request
there is a response. The request is encapsulated in a Context
object, which includes a Command identifier. Each request must
correspond to a Command, which may also be a Chain of Commands.
Commands may nest or chain other Commands as needed. The request
Command is referred to as the "Action".</p>
<p>When a request comes in from the presentation layer (or a
presentation framework), it is received by a ProtocolAdaptor. The
ProtocolAdaptor extracts the Action Command name from the native
request and consults with a ContextFactory to generate a Context
for the request. The request Context is then passed to the
RequestProcessor for the given protocol.</p>
<p>The RequestProcessor is a Command Chain which includes (at a
minimum) an Action Command. Each protocol can have its own
RequestProcessor, which may be a combination of protocol-specific
and generic commands. The Action Command (or Chain) is the core
unit of work for the request.</p>
<p>The Action Command may consult business rules and the
persistence layer to complete the unit of work. Any output or
messages generated by the Action may be added to the Context
under predetermined keys. If the Action completes normally, an
attribute is added to the Context to signify the outcome of the
Action. The value of the outcome attribute is arbitrary and
defined by application implementing the framework ("success",
"failure", "xylophone").</p>
<p>When the RequestProcessor Chain completes, the Context is
returned to the ProtocolAdaptor. Agility defines the
ProtocolAdaptor interface but does not provide an implementation.
If the ProtocolAdaptor is a simple Servlet, it may forward to a
server page by munging the outcome value. If the ProtocolAdaptor
is a presentation layer framework, it may pass the value to an
internal mechanism that selects or assembles a server page, or
generates a dynamic response. A ProtocolAdaptor might even
utilitize its own "ResponseProcessor" to execute a series of
Commands to assemble an approriate response.</p>
</body>
</html>