You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jetspeed-dev@portals.apache.org by ta...@apache.org on 2004/05/18 21:50:03 UTC
cvs commit: jakarta-jetspeed-2/design-docs/src/decorations portlet-decorations.dia
taylor 2004/05/18 12:50:03
Added: design-docs/src/aggregation AggregationModel.png
AggregationModel.dia PageAggregationDesign.txt
design-docs/src/components J2ServiceFramework.rtf
design-docs/src/preferences PreferencesDesignNotes.txt
design-docs/src/entities PortletEntity.dia PortletEntity.png
EntityPreferences.txt
design-docs/src/objectmodel ObjectModelOpenIssues.txt
design-docs/src/security securitySchema_v1.1.pdf
SecurityDesignNotes.txt
design-docs/src/navigations NavigationalStateProposal.txt
design-docs/src/pipeline request_lifcycle.htm
jetspeedPipeline_v1.0.pdf RequestSequence.jpg
design-docs/src/capabilities CapabilityHandlingJ2.pdf
design-docs/src/decorations portlet-decorations.dia
Removed: design-docs/src/uml .cvsignore AggregationModel.png
PortletEntity.png AggregationModel.dia
RequestSequence.jpg PortletEntity.dia
design-docs/src request_lifcycle.htm portlet-decorations.dia
jetspeedPipeline_v1.0.pdf
Log:
re-org of design documentation
break down design documentation by component category
PR:
Obtained from:
Submitted by:
Reviewed by:
CVS: ----------------------------------------------------------------------
CVS: PR:
CVS: If this change addresses a PR in the problem report tracking
CVS: database, then enter the PR number(s) here.
CVS: Obtained from:
CVS: If this change has been taken from another system, such as NCSA,
CVS: then name the system in this line, otherwise delete it.
CVS: Submitted by:
CVS: If this code has been contributed to Apache by someone else; i.e.,
CVS: they sent us a patch or a new module, then include their name/email
CVS: address here. If this is your work then delete this line.
CVS: Reviewed by:
CVS: If we are doing pre-commit code reviews and someone else has
CVS: reviewed your changes, include their name(s) here.
CVS: If you have not had it reviewed then delete this line.
Revision Changes Path
1.1 jakarta-jetspeed-2/design-docs/src/aggregation/AggregationModel.png
<<Binary file>>
1.1 jakarta-jetspeed-2/design-docs/src/aggregation/AggregationModel.dia
<<Binary file>>
1.1 jakarta-jetspeed-2/design-docs/src/aggregation/PageAggregationDesign.txt
Index: PageAggregationDesign.txt
===================================================================
Copyright 2004 The Apache Software Foundation
Licensed 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.
-----------------------------------
Page Aggregation Redesign Overview
------------------------------------
Authors: Raphael Luta, David Sean Taylor
** Goals **
1. Refactor PSML Model and introduce a new Page model, fixing defects in old model
2. To reimplement the page aggregation features
3. Simplify storage and manipulation of all aggregation data strucures
Clean separation of profiling information from page storage
4. Support storing page information in a relational database
5. Single threaded and multiple threaded aggregation
6. Provide simple and clear 'hooks' for other components to manipulate Page components
such as Page Selection, Layout Customization, and Content Caching)
** Defects in J1 Page Aggregation **
1. PSML couples preferences and user info with layout.
2. PSML has confusing terminology 'controls' 'controllers'
3. Aggregation process in Jetspeed-1 model was tied to Turbine framework via modules
** Solution Summary **
1. Seperation of Layout from Preferences and User Information
The new model removes all preferences and user information from the design
Preferences and User Information are specified in the Java Portlet Spec
J2 stores preferences separately from layout
2. New Model Terminology Introduced
'Controls' are now called 'Decorators'
'Controllers' are now called 'Layouts'
'Portlets' collections are now called 'Fragments'
'Desktop' describes the entire Page layout comparable with Turbine layout+navigation
3. Jetspeed-2 no longer relies on Turbine.
Turbine modules and all Turbine dependencies are not in Jetspeed-2.
We now have the concept of a Desktop which has a layout component, a theme, and a current page.
A page is the aggregated content of portlets.
-----------------------------------
Page Aggregation Model
------------------------------------
The new aggregation code is composed of the following elements:
1. pipeline stages in the main Jetspeed pipeline:
Profiler --> Layout --> Aggregator
2. New OM model under tentatively (org.apache.jetspeed.om.page)
3. New service for storing and retrieving pages (PageManager)
with two implementation (database/file system)
4. a PortletRenderer component
------------------------
Pipeline in more Detail
------------------------
1. Profiler valve
|
|-- find Desktop
|-- find Page
The Profiler finds a desktop and page dependent on the associated profiling rule associated with the current principal. A principal can have one profiling rule associated with it. Two rules are currently identified:
a. Standard Profiling Rule - applies J1 profiling rules based on the standard J1 profiling criteria (user, mediatype, language, country, pagename, role, group)
b. Role-based Fallback - applies J1 role-based fallback algorithm
Design goals for Profiling Rules:
aa. pluggable algorithms
bb. generic engine based on Profiling Rule and Criteria model
cc. Support Profiling Types to generically map request parameters without programming
- standard
- request parameters, attributes, properties
- CCPP properties
- User properties
c. The profiler finds both Desktops and Pages which are then put into the request context to be used by the next pipeline valve
2. Layout valve
|
|-- compile and build the layout for the Desktop
|-- compile and build the layout for the Desktop
The layout valve is the first pass of a two pass aggregation (layout, render)
Layout algorithm (Raphael Luta):
lStack = new Stack();
push page root layout element on lStack
while lStack is not empty
do
cElement = pop lStack
if cElement is hidden
do nothing
else
put cElement in request attributes
find Portlet registered under cElement name
invoke Portlet in LAYOUT mode (through a sub-request to Portlet)
retrieve from portlet response attributes a list of portlet and
layout
elements to display
discard any other output from portlet
put only layout elements retrieved from response in lStack
for all retrieved portlet elements
do
if portlet element is visible
invoke PortletRenderer for retrieved portlet element with
current
request (asynchronous mode)
end if
done
end if
done
The goal of this algorithm is to launch the rendering process in asynchronous mode but only for those elements that are going to actually be displayed in the aggregated page. The idea is thus to allow the layout elements that
actually control the rendering to have a look at the page structure and
return what elements they will actually render when they are invoked in RENDER mode. Using a Jetspeed specific LAYOUT Portlet mode is a way to avoid defining Jetspeed specific Layout interfaces at the price of handling a sub-request within the main RENDER phase. It's also simply possible to define a PortletLayout interface that Portlet that want to be recognized as Layout elements need to implement and inovke a doLayout() method through this interface (this avoids having to manipulate the PortletRequest portletMode)
This is an important performance optimization in multi-threaded parallel
aggregation mode to avoid rendering some components for nothing because they are not visible in the final page.
Also note that layout elements themselves are not sent to the Renderer
in the layout phase because they will most likely not be able to output meaningful content without access the actual portlet content and should not cause a major performance issue if ther rendering is serialized.
In summary:
- layout elements are never parallelized or cached
- visible portlet elements are sent to the rendering process in the Layout pipeline valve
3. Portlet Render valve
The next valve in the process is the Aggregate valve that simply retrieves the root element of the page and invoke the PortletRenderer sevice in synchronous mode with this element
and request. This is enough to trigger the cascaded rendering all all elements that need to be displayed and aggregated. Exactly how
a Layout Portlet is expected to access the other rendered elements is
explained in more details in the PortletRenderer service description.
---------------------------------
PortletRenderer service
----------------------------------
This is the core of aggregation engine. It's responsible for rendering the
Portlet themselves and make the rendered content available to other portlets for inclusion.
This service only provides 3 public methods:
/** Render the specified Page fragment using pInstance as the portlet to
invoke and PortletRequest as the request to pass to pInstance. Result is returned in the PortletResponse.
*/
public void renderNow(Fragment fragment,
PortletInstance pInstance,
RenderRequest request,
RenderResponse rsp)
/** Render the specified Page fragment using pInstance and PortletRequest.
The method returns before rendering is complete, rendered content can be accessed through the
ContentDispatcher
*/
public void render(Fragment fragment,
PortletInstance pInstance,
RenderRequest request)
/** Retrieve the ContentDispatcher for the specified request
*/
public ContentDispatcher getDispatcher(PortletRequest request)
From an implementation perspective, the renderNow() method is pretty
straightforward but the multi-threaded
rendering is more involved.
Here are my current impelmentation thoughts (I've not yet fully
explored the
problem though because it would
probably require some working code running to check for all possible
bottlenecks and deadlocks):
The RendererService implementation needs to have:
- a rendering queue rQueue where are queued all the pending rendering
requests. This queue needs to provided
a thread-safe element retrieval method like Stack.pop() and push() (in
fact I was planning to use the default
Stack implementation even though it's not FIFO as this queue should
be)
- a pool of Worker threads that can render synchronously portlets
- a WorkerMonitor for controlling the worker threads and recycling them
into
the pool
- a ContentDispatcher that gives access to generated content. A
ContentDispatcher is basically a wrapper around
a Hashtable of PortletResponses keyed to fragment Ids.
Each time render() is invoked it would create a new RenderingRequest
that
contains:
- a reference to the Fragment to render
- a reference to the Portlet Instance
- a thead-safe wrapper to the PortletRequest
- a simple PortletResponse implementation that writes to a buffer
It then adds the PortletResponse to the current session
ContentDispatcher
(creating the ContentDispatcher if no
dispatcher is found within the current session), keyed to the Fragment
ID.
It the puts the RenderingRequest in the rQueue and returns
The WorkerMonitor would continuously monitor the rQueue for new
elements to
render and whenever a new element
is added to the queue, it dispatches it to an idle worker if any. When
the
Worker is done rendering, it explicitely commits the
PortletResponse to signal to the ContentDispatcher that the content is
available and complete.
Finally the ContentDispatcher simply provides an include(Fragment ID,
PortletRequest, PortletResponse) method that copies its
stored buffered content into the provided PortletResponse output
stream. If
content is not available when include() is
called, the ContentDispatcher either pauses until the content is
availale
(for example, by periodically polling the
PortletResponse keyed to the ID is committed) or triggers a synchronous
rendering of the Fragment (for example if
no PortletResponse is currently keyed to this ID)
Layout portlets
---------------------
The Layout portlets are simple JSR 168 portlets that implement 2
Jetspeed specific features:
- the LAYOUT mode and its associated raquest and response attribute
names (or the LayoutPortlet interface if you think a custom mode is too cumbersome)
- they need to know how to get hold of the ContentDispatcher, either through
a request attribute (possibly the simplest way) or through the RendererService.
1.1 jakarta-jetspeed-2/design-docs/src/components/J2ServiceFramework.rtf
Index: J2ServiceFramework.rtf
===================================================================
{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f2\fmodern\fcharset0\fprq1{\*\panose 02070309020205020404}Courier New;}
{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f6\fmodern\fcharset0\fprq1{\*\panose 00000000000000000000}Courier;}{\f14\fnil\fcharset2\fprq2{\*\panose 05000000000000000000}Wingdings;}
{\f16\fswiss\fcharset0\fprq2{\*\panose 020b0604030504040204}Verdana;}{\f17\fnil\fcharset0\fprq0{\*\panose 00000000000000000000}CourierNewPS-BoldMT;}{\f62\froman\fcharset238\fprq2 Times New Roman CE;}{\f63\froman\fcharset204\fprq2 Times New Roman Cyr;}
{\f65\froman\fcharset161\fprq2 Times New Roman Greek;}{\f66\froman\fcharset162\fprq2 Times New Roman Tur;}{\f67\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f74\fmodern\fcharset238\fprq1 Courier New CE;}
{\f75\fmodern\fcharset204\fprq1 Courier New Cyr;}{\f77\fmodern\fcharset161\fprq1 Courier New Greek;}{\f78\fmodern\fcharset162\fprq1 Courier New Tur;}{\f79\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f158\fswiss\fcharset238\fprq2 Verdana CE;}
{\f159\fswiss\fcharset204\fprq2 Verdana Cyr;}{\f161\fswiss\fcharset161\fprq2 Verdana Greek;}{\f162\fswiss\fcharset162\fprq2 Verdana Tur;}{\f163\fswiss\fcharset186\fprq2 Verdana Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;
\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;
\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\widctlpar\adjustright \cgrid \snext0 Normal;}{\*\cs10 \additive Default Paragraph Font;}{\s15\widctlpar
\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\adjustright \f2\fs20\cgrid \sbasedon0 \snext15 HTML Preformatted;}{\s16\sb100\sa100\widctlpar\adjustright \f16\cgrid \sbasedon0 \snext16
Normal (Web);}{\*\cs17 \additive \b \sbasedon10 Strong;}{\*\cs18 \additive \b\ulnone\cf11\animtext0 \sbasedon10 Hyperlink;}{\s19\widctlpar\tqc\tx4320\tqr\tx8640\adjustright \cgrid \sbasedon0 \snext19 header;}{\s20\widctlpar
\tqc\tx4320\tqr\tx8640\adjustright \cgrid \sbasedon0 \snext20 footer;}{\*\cs21 \additive \sbasedon10 page number;}{\*\cs22 \additive \ul\cf12 \sbasedon10 FollowedHyperlink;}}{\*\listtable{\list\listtemplateid-212805934{\listlevel\levelnfc23\leveljc0
\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\cf0\fbias0 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext
\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\cf0\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel
\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0
{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li4320\jclisttab\tx4320 }
{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360
\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li6480
\jclisttab\tx6480 }{\listname ;}\listid470829199}{\list\listtemplateid634537694{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720 }
{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0
{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880
\jclisttab\tx2880 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360
\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040
\jclisttab\tx5040 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360
\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid666979323}{\list\listtemplateid732594012{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0
{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\cf0\fbias0 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440 }
{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360
\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600
\jclisttab\tx3600 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1
\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0
\fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid687220948}
{\list\listtemplateid-1794340466{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\leveljc0\levelfollow0
\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}
\f14\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23\leveljc0
\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext
\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040 }
{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0
{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid702949394}{\list\listtemplateid-860193376{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'01\u-3913 ?;}{\levelnumbers;}\f3\fs20\fbias0 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fs20\fbias0 \fi-360\li1440\jclisttab\tx1440 }
{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fs20\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fs20\fbias0 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fs20\fbias0
\fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fs20\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\leveljc0\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fs20\fbias0 \fi-360\li5040\jclisttab\tx5040 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}
\f3\fs20\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fs20\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid816724434}
{\list\listtemplateid1725580720{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\cf0\fbias0 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\leveljc0\levelfollow0
\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}
\f14\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23\leveljc0
\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext
\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040 }
{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0
{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid1068960038}{\list\listtemplateid-1552667082{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'02\'00.;}{\levelnumbers\'01;}\fbias0 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc4\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'01.;}{\levelnumbers\'01;}\fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc2
\leveljc2\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'02.;}{\levelnumbers\'01;}\fi-180\li2160\jclisttab\tx2160 }{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'03.;}{\levelnumbers
\'01;}\fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc4\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'04.;}{\levelnumbers\'01;}\fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc2\leveljc2\levelfollow0\levelstartat1
\levelspace0\levelindent0{\leveltext\'02\'05.;}{\levelnumbers\'01;}\fi-180\li4320\jclisttab\tx4320 }{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'06.;}{\levelnumbers\'01;}\fi-360\li5040
\jclisttab\tx5040 }{\listlevel\levelnfc4\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'07.;}{\levelnumbers\'01;}\fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc2\leveljc2\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\'02\'08.;}{\levelnumbers\'01;}\fi-180\li6480\jclisttab\tx6480 }{\listname ;}\listid1129206702}{\list\listtemplateid-1899329646{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext
\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel
\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0
{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600 }
{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360
\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760
\jclisttab\tx5760 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid1162237517}{\list\listtemplateid-2113111624
{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0
{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li2160\jclisttab\tx2160 }
{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360
\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li4320
\jclisttab\tx4320 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1
\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0
\fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid1271161232}{\list\listtemplateid-1514663960{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li720
\jclisttab\tx720 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360
\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880
\jclisttab\tx2880 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360
\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040
\jclisttab\tx5040 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360
\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid1473328273}{\list\listtemplateid-2060835934{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0
{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\cf0\fbias0 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440 }
{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360
\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600
\jclisttab\tx3600 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1
\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0
\fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid1527597182}
{\list\listtemplateid2097596550{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fs20\fbias0 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\leveljc0\levelfollow0
\levelstartat1\levelspace0\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fs20\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}
\f14\fs20\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23
\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li5040\jclisttab\tx5040
}{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0
\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fs20\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid1750346992}{\list\listtemplateid-662681146{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0
{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\cf0\fbias0 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440 }
{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360
\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600
\jclisttab\tx3600 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1
\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0
\fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid1785267926}
{\list\listtemplateid-2113111624{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li720\jclisttab\tx720 }{\listlevel\levelnfc23\leveljc0\levelfollow0
\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li1440\jclisttab\tx1440 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3929 ?;}{\levelnumbers;}
\f14\fbias0 \fi-360\li2160\jclisttab\tx2160 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li2880\jclisttab\tx2880 }{\listlevel\levelnfc23\leveljc0
\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li3600\jclisttab\tx3600 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext
\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li4320\jclisttab\tx4320 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li5040\jclisttab\tx5040 }
{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0{\leveltext\'01o;}{\levelnumbers;}\f2\fbias0 \fi-360\li5760\jclisttab\tx5760 }{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace360\levelindent0
{\leveltext\'01\u-3929 ?;}{\levelnumbers;}\f14\fbias0 \fi-360\li6480\jclisttab\tx6480 }{\listname ;}\listid2060593476}}{\*\listoverridetable{\listoverride\listid816724434\listoverridecount0\ls1}{\listoverride\listid1750346992\listoverridecount0\ls2}
{\listoverride\listid1785267926\listoverridecount0\ls3}{\listoverride\listid1068960038\listoverridecount0\ls4}{\listoverride\listid1129206702\listoverridecount0\ls5}{\listoverride\listid1527597182\listoverridecount0\ls6}{\listoverride\listid470829199
\listoverridecount0\ls7}{\listoverride\listid687220948\listoverridecount0\ls8}{\listoverride\listid2060593476\listoverridecount0\ls9}{\listoverride\listid1271161232\listoverridecount0\ls10}{\listoverride\listid702949394\listoverridecount0\ls11}
{\listoverride\listid1473328273\listoverridecount0\ls12}{\listoverride\listid1162237517\listoverridecount0\ls13}{\listoverride\listid666979323\listoverridecount0\ls14}}{\info{\title Proposal for Jetspeed 2 Service Framework}{\author David Le Strat}
{\operator Jeremy Ford}{\creatim\yr2003\mo12\dy27\hr18\min4}{\revtim\yr2004\mo3\dy18\hr10\min6}{\version19}{\edmins192}{\nofpages7}{\nofwords1168}{\nofchars6662}{\*\company Home}{\nofcharsws8181}{\vern113}}
\widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\hyphcaps0\formshade\viewkind1\viewscale100\pgbrdrhead\pgbrdrfoot \fet0\sectd \linex0\endnhere\sectlinegrid360\sectdefaultcl {\header \pard\plain \s19\qc\widctlpar
\tqc\tx4320\tqr\tx8640\adjustright \cgrid {\b DRAFT
\par }}{\footer \pard\plain \s20\qc\widctlpar\tqc\tx4320\tqr\tx8640\adjustright \cgrid {\cs21 - }{\field{\*\fldinst {\cs21 PAGE }}{\fldrslt {\cs21\lang1024 1}}}{\cs21 -}{
\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}
{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8
\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \qc\widctlpar\adjustright \cgrid {\b\fs28 Proposal for Jetspeed 2 Service Framework
\par
\par }\pard \widctlpar\adjustright {\f2\highlight8\cgrid0 Copyright 2004 The Apache Software Foundation}{\f2\cgrid0 }{\f2\highlight8\cgrid0 Licensed under the Apache License, Version 2.0 (the "License");}{\f2\highlight8\cgrid0 }{\f2\highlight8\cgrid0
you may not use this file except in compliance with the }{\f2\highlight8\cgrid0 L}{\f2\highlight8\cgrid0 icense.}{\f2\highlight8\cgrid0 }{\f2\highlight8\cgrid0 You may obtain a copy of the License at}{\f2\cgrid0
\par
\par }{\f2\highlight8\cgrid0 http://www.apache.org/licenses/LICENSE-2.0}{\f2\cgrid0
\par
\par }{\f2\highlight8\cgrid0 Unless required by applicable law or agreed to in writing, software}{\f2\highlight8\cgrid0 }{\f2\highlight8\cgrid0 distributed under the License is distributed on an "AS IS" BASIS,}{\f2\highlight8\cgrid0 }{\f2\highlight8\cgrid0
WITHOUT WARRANTIES OR CONDITIONS OF ANY}{\f2\highlight8\cgrid0 KIND, either }{\f2\highlight8\cgrid0 express or implied.}{\f2\cgrid0 }{\f2\highlight8\cgrid0 See the License for the specific language governing permissions and}{\f2\cgrid0 }{
\f2\highlight8\cgrid0 limitations under the License.}{\b\fs28
\par }{
\par }{\b\ul Introduction:
\par }{
\par \ldblquote Inversion of Control is about software components doing what they are told, when they are told. Your OO application could well become unmaintainable without it.\rdblquote
\par }\pard \qr\widctlpar\adjustright {Paul Hammant, ThoughtWorks
\par }\pard \qj\widctlpar\adjustright {
\par
\par }\pard \widctlpar\adjustright {The purpose of Inversion of Control (IoC) is to promote the use of interfaces instead of classes and therefore produce much cleaner and maintainable code. The goals of a service framework leveraging IoC are to make:
\par
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\ls3\adjustright {Testing become easy,
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}Maintenance become easy,
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}Configuration become easy,
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}Reuse become easy.
\par }\pard \widctlpar\adjustright {
\par As part of Jetspeed 2 redesign, it is paramount to select a service framework that will provide Jetspeed with a flexible and non intrusive foundation.
\par
\par }{\b\ul Goals of J2 Service Framework:
\par }{
\par Jetspeed 2 service framework goals should be:
\par
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\ls4\adjustright {Non-intrusive service framework which requires as little as possible framework specific code.
\par {\listtext\pard\plain\f2\cgrid \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \fi-360\li1440\widctlpar\jclisttab\tx1440\ls4\ilvl1\adjustright {Provide a framework that support an interface and its implementation without framework specific code involved.
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\ls4\adjustright {A framework that can be extended to provide:
\par {\listtext\pard\plain\f2\cgrid \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \fi-360\li1440\widctlpar\jclisttab\tx1440\ls4\ilvl1\adjustright {Transparent JMX support of deployed modules.
\par {\listtext\pard\plain\f2\cgrid \hich\af2\dbch\af0\loch\f2 o\tab}Hot deployment and configuration.
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\ls4\adjustright {A framework that allows deploying self contained components/ self configurable components.
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}The service framework can be extended to enable components as web services.
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}The service framework can be extended to provide performance monitoring of components.
\par }\pard \widctlpar\adjustright {
\par }{\b\ul Proposed Service Framework:
\par }{
\par A combination of Picocontainer and Aspect Oriented Programming. When service orchestration is required, Cornerstone could be used as the orchestration framework.
\par \page
\par }{\ul 1. Why Picocontainer?
\par }{
\par PicoContainer is the simplest container for IoC:
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\ls6\adjustright {Pico implements IoC type 3 \endash constructors.
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}Pico components are assembled by registration.
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}Pico components can optionally implement lifecycle methods (start, stop, dispose)
\par }\pard \widctlpar\adjustright {
\par PicoContainer can be easily wrapped with a service manager to provide configurable components. Services could therefore follow the structure:
\par
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\ls7\adjustright {MyService
\par {\listtext\pard\plain\f2\cgrid \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \fi-360\li1440\widctlpar\jclisttab\tx1440\ls7\ilvl1\adjustright {src
\par {\listtext\pard\plain\f14\cgrid \loch\af14\dbch\af0\hich\f14 \'a7\tab}}\pard \fi-360\li2160\widctlpar\jclisttab\tx2160\ls7\ilvl2\adjustright {api
\par {\listtext\pard\plain\f14\cgrid \loch\af14\dbch\af0\hich\f14 \'a7\tab}impl
\par {\listtext\pard\plain\f2\cgrid \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \fi-360\li1440\widctlpar\jclisttab\tx1440\ls7\ilvl1\adjustright {conf
\par {\listtext\pard\plain\f14\cgrid \loch\af14\dbch\af0\hich\f14 \'a7\tab}}\pard \fi-360\li2160\widctlpar\jclisttab\tx2160\ls7\ilvl2\adjustright {jetspeed-service.xml
\par }\pard \widctlpar\adjustright {
\par Which would get deployed as:
\par
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\ls11\adjustright {MyService
\par {\listtext\pard\plain\f2\cgrid \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \fi-360\li1440\widctlpar\jclisttab\tx1440\ls11\ilvl1\adjustright {META-INF
\par {\listtext\pard\plain\f14\cgrid \loch\af14\dbch\af0\hich\f14 \'a7\tab}}\pard \fi-360\li2160\widctlpar\jclisttab\tx2160\ls11\ilvl2\adjustright {jetspeed-service.xml
\par {\listtext\pard\plain\f2\cgrid \hich\af2\dbch\af0\loch\f2 o\tab}}\pard \fi-360\li1440\widctlpar\jclisttab\tx1440\ls11\ilvl1\adjustright {org.apache.jetspeed
\par }\pard \widctlpar\adjustright {
\par The service manager can be a singleton object responsible for instantiating the various services or leverage Aspect Oriented Programming (see below).
\par
\par }\pard \qj\widctlpar\adjustright {\ul 2. Differences with Other Service Frameworks
\par }\pard \widctlpar\adjustright {
\par }{\b IoC type 0 \endash No IoC
\par }{
\par }{\f6\fs20 public class Girl implements Servicable \{
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 Kissable kissable;
\par
\par public void service(ServiceManager mgr) \{
\par }\pard \fi720\li720\widctlpar\adjustright {\f6\fs20 kissable = new Boy();
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 \}
\par
\par public void kissYourKissable() \{
\par }\pard \fi720\li720\widctlpar\adjustright {\f6\fs20 kissable.kiss();
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 \}
\par }\pard \widctlpar\adjustright {\f6\fs20 \}
\par }{
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\ls11\adjustright {No meta data, but the dependencies cannot be changed.
\par }\pard \widctlpar\adjustright {
\par \page
\par }{\b IoC type 1 - Avalon
\par }{
\par }{\f6\fs20 public class Girl implements Servicable \{
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 Kissable kissable;
\par public void service(ServiceManager mgr) \{
\par }\pard \fi720\li720\widctlpar\adjustright {\f6\fs20 kissable = (Kissable) mgr.lookup(\ldblquote kissable\rdblquote );
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 \}
\par
\par public void kissYourKissable() \{
\par }\pard \fi720\li720\widctlpar\adjustright {\f6\fs20 kissable.kiss();
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 \}
\par }\pard \widctlpar\adjustright {\f6\fs20 \}
\par
\par <container>
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 <classloader>
\par }\pard \fi720\li720\widctlpar\adjustright {\f6\fs20 <classpath> \'85 </classpath>
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 </classloader>
\par <component name=\ldblquote kissable\ldblquote class=\ldblquote Boy">
\par }\pard \fi720\li720\widctlpar\adjustright {\f6\fs20 <configuration> \'85 </configuration>
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 </component>
\par <component name=\ldblquote girl" class=\ldblquote Girl" />
\par }\pard \widctlpar\adjustright {\f6\fs20 </container>
\par }{
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\ls11\adjustright {Dependencies are fetched from a ServiceManager and hooked up with meta-data.
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}In the case of Avalon, the container must be loaded for to access services outside the Avalon container.
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}The class must implement any of the lifecycle interfaces. A component cannot be looked up without loading the container up. To so extent intrusive.
\par }\pard \widctlpar\adjustright {
\par }{\b IoC type 2 \endash Spring
\par }{
\par }{\f6\fs20 public class Girl \{
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 Kissable kissable;
\par
\par public void setKissable(Kissable kissable) \{
\par }\pard \fi720\li720\widctlpar\adjustright {\f6\fs20 this.kissable = kissable;
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 \}
\par
\par public void kissYourKissable() \{
\par }\pard \fi720\li720\widctlpar\adjustright {\f6\fs20 kissable.kiss();
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 \}
\par }\pard \widctlpar\adjustright {\f6\fs20 \}
\par
\par <beans>
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 <bean id=\ldblquote boy" class=\ldblquote Boy"/>
\par <bean id=\ldblquote girl\ldblquote class=\ldblquote Girl">
\par <property name=\ldblquote kissable">
\par }\pard \fi720\li720\widctlpar\adjustright {\f6\fs20 <ref bean=\ldblquote boy"/>
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 </property>
\par </bean>
\par }\pard \widctlpar\adjustright {\f6\fs20 </beans>
\par }{
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\ls12\adjustright {Dependencies provided by JavaBean setters. Meta-data is needed.
\par }\pard \widctlpar\adjustright {
\par }\pard \qj\widctlpar\adjustright {\b Ioc type 3 \endash Pico
\par }{
\par
\par }\pard \widctlpar\adjustright {\f6\fs22 public class Girl \{
\par }\pard \fi720\widctlpar\adjustright {\f6\fs22 Kissable kissable;
\par
\par public Girl(Kissable kissable) \{
\par }\pard \fi720\li720\widctlpar\adjustright {\f6\fs22 this.kissable = kissable;
\par }\pard \fi720\widctlpar\adjustright {\f6\fs22 \}
\par
\par public void kissYourKissable() \{
\par }\pard \fi720\li720\widctlpar\adjustright {\f6\fs22 kissable.kiss();
\par }\pard \fi720\widctlpar\adjustright {\f6\fs22 \}
\par }\pard \widctlpar\adjustright {\f6\fs22 \}
\par
\par }{A ServiceManager singleton loads up the components:
\par }{\f6\fs20
\par PicoContainer container = new DefaultPicoContainer();
\par container.registerComponentImplementation(clazz);
\par
\par }{The ServiceManager provide access to the service.
\par }{\f6\fs20
\par Girl girl = (Girl)
\par }\pard \fi720\widctlpar\adjustright {\f6\fs20 ServicesManager.getInstance().getService(Girl.class);
\par }\pard \widctlpar\adjustright {\f6\fs20
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\ls12\adjustright {Minimal metadata is required, interface are recommended but not required.
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}The implementation dependencies on the framework are minimized.
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}JMX and aspect integrations are provided through Nanocontainer.
\par }\pard \qj\widctlpar\adjustright {
\par }{\b Ioc type 3 \endash Hivemind (IP Issues)
\par }{Though a great potential candidate, Hivemind has not been evaluated given the on-going Intellectual Property issue.
\par
\par }{\b Cornerstone:
\par }{
\par A service orchestration framework.
\par
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \qj\fi-360\li720\widctlpar\jclisttab\tx720\ls13\adjustright {One method per \ldblquote Service\rdblquote
\par }\pard \qj\widctlpar\adjustright {
\par }{\f6\fs20 public String invokeDirect(String timeZone,
\par }\pard \qj\fi360\widctlpar\adjustright {\f6\fs20 String dateStyle) throws ServiceException
\par }\pard \qj\widctlpar\adjustright {\f6\fs20 \{
\par }\pard \qj\fi360\widctlpar\adjustright {\f6\fs20 \'85
\par }\pard \qj\widctlpar\adjustright {\f6\fs20 \}
\par
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \qj\fi-360\li720\widctlpar\jclisttab\tx720\ls13\adjustright {Service invocation based on configuration of service:
\par }\pard \qj\widctlpar\adjustright {
\par }{\f6\fs20 Service =
\par }\pard \qj\fi720\widctlpar\adjustright {\f6\fs20 Cornerstone.getServiceManager()
\par .createServiceByName(serviceName);
\par }\pard \qj\widctlpar\adjustright {\f6\fs20 context = new BaseContext();
\par context.setValue("tz102", "GMT-0800");
\par context.setValue("tz103", "GMT+0800");
\par context.setValue("df103", DateService.DATE_FORMAT_SHORT);
\par String lastDateString = (String) service.invoke(context);
\par }{
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \qj\fi-360\li720\widctlpar\jclisttab\tx720\ls13\adjustright {Service configuration defines the sequence and the parameters.
\par }\pard \qj\widctlpar\adjustright {
\par
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \qj\fi-360\li720\widctlpar\jclisttab\tx720\ls13\adjustright {Cornerstone customization vision is real but intrusive. Could it be used to orchestrate Pico services when needed?
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}Integrated with JMX.
\par }\pard \qj\widctlpar\adjustright {
\par }{\ul 3. The Use of AOP.
\par }{
\par AOP could be used to greatly enhanced the flexibility of J2. Examples of possible aspects are:
\par
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \qj\fi-360\li720\widctlpar\jclisttab\tx720\ls14\adjustright {Logging aspect (}{\field{\*\fldinst { HYPERLINK "http://aspectwerkz.codehaus.org/examples_2.html#Logging" }{\fs20
{\*\datafield
00d0c9ea79f9bace118c8200aa004ba90b020000001f0000003800000068007400740070003a002f002f006100730070006500630074007700650072006b007a002e0063006f006400650068006100750073002e006f00720067002f006500780061006d0070006c00650073005f0032002e00680074006d006c0023004c00
6f006700670069006e0067000000e0c9ea79f9bace118c8200aa004ba90b6000000068007400740070003a002f002f006100730070006500630074007700650072006b007a002e0063006f006400650068006100750073002e006f00720067002f006500780061006d0070006c00650073005f0032002e00680074006d006c
000000080000004c006f006700670069006e006700000000000000}}}{\fldrslt {\cs18\b\cf11 http://aspectwerkz.codehaus.org/examples_2.html#Logging}}}{): To log method entry point and exit points.
\par }\pard \qj\li720\widctlpar\adjustright {\field{\*\fldinst { HYPERLINK "http://www.developer.com/java/other/article.php/10936_3109831_1" }{\fs20 {\*\datafield
00d0c9ea79f9bace118c8200aa004ba90b02000000170000004000000068007400740070003a002f002f007700770077002e0064006500760065006c006f007000650072002e0063006f006d002f006a006100760061002f006f0074006800650072002f00610072007400690063006c0065002e007000680070002f003100
30003900330036005f0033003100300039003800330031005f0031000000e0c9ea79f9bace118c8200aa004ba90b8000000068007400740070003a002f002f007700770077002e0064006500760065006c006f007000650072002e0063006f006d002f006a006100760061002f006f0074006800650072002f006100720074
00690063006c0065002e007000680070002f00310030003900330036005f0033003100300039003800330031005f00310000000000}}}{\fldrslt {\cs18\b\cf11 http://www.developer.com/java/other/article.php/10936_3109831_1}}}{
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \qj\fi-360\li720\widctlpar\jclisttab\tx720\ls14\adjustright {Caching aspect (}{\field{\*\fldinst { HYPERLINK "http://aspectwerkz.codehaus.org/examples_2.html#Caching" }{\fs20
{\*\datafield
00d0c9ea79f9bace118c8200aa004ba90b020000001f0000003800000068007400740070003a002f002f006100730070006500630074007700650072006b007a002e0063006f006400650068006100750073002e006f00720067002f006500780061006d0070006c00650073005f0032002e00680074006d006c0023004300
61006300680069006e0067000000e0c9ea79f9bace118c8200aa004ba90b6000000068007400740070003a002f002f006100730070006500630074007700650072006b007a002e0063006f006400650068006100750073002e006f00720067002f006500780061006d0070006c00650073005f0032002e00680074006d006c
00000008000000430061006300680069006e006700000000000000}}}{\fldrslt {\cs18\b\cf11 http://aspectwerkz.codehaus.org/examples_2.html#Caching}}}{). To cache rendered portlets.
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}Security aspect (}{\field{\*\fldinst { HYPERLINK "http://blogs.codehaus.org/people/jboner/" }{\fs20 {\*\datafield
00d0c9ea79f9bace118c8200aa004ba90b02000000170000002900000068007400740070003a002f002f0062006c006f00670073002e0063006f006400650068006100750073002e006f00720067002f00700065006f0070006c0065002f006a0062006f006e00650072002f000000e0c9ea79f9bace118c8200aa004ba90b
5200000068007400740070003a002f002f0062006c006f00670073002e0063006f006400650068006100750073002e006f00720067002f00700065006f0070006c0065002f006a0062006f006e00650072002f00000000770000}}}{\fldrslt {\cs18\b\cf11 http://blogs.codehaus.org/people/jboner/}}}{)
leveraging JAAS to authenticate and authorize user to use portal resources.
\par }\pard \widctlpar\adjustright {\f17\fs20\cf1
\par
\par }{\ul\cf1 4. Pico and AOP Combined.
\par }{\f17\fs20\cf1
\par }{\cf1 AOP can be used to intercept the invocation of the class constructor and return the service. Basically doing}{\f17\fs20\cf1 }{\f6\fs20 ServicesManager.getInstance().getService(clazz);}{ when the constructor is invoked.
\par
\par See:
\par {\listtext\pard\plain\f3\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li720\widctlpar\jclisttab\tx720\ls7\adjustright {\field{\*\fldinst { HYPERLINK "http://wiki.codehaus.org/picocontainer/UseScriptingToWireAndConfigureComponents" }{\fs20
{\*\datafield
00d0c9ea79f9bace118c8200aa004ba90b02000000170000005000000068007400740070003a002f002f00770069006b0069002e0063006f006400650068006100750073002e006f00720067002f007000690063006f0063006f006e007400610069006e00650072002f005500730065005300630072006900700074006900
6e00670054006f00570069007200650041006e00640043006f006e0066006900670075007200650043006f006d0070006f006e0065006e00740073000000e0c9ea79f9bace118c8200aa004ba90ba000000068007400740070003a002f002f00770069006b0069002e0063006f006400650068006100750073002e006f0072
0067002f007000690063006f0063006f006e007400610069006e00650072002f0055007300650053006300720069007000740069006e00670054006f00570069007200650041006e00640043006f006e0066006900670075007200650043006f006d0070006f006e0065006e00740073000000000100}}}{\fldrslt {
\cs18\b\cf11 http://wiki.codehaus.org/picocontainer/UseScriptingToWireAndConfigureComponents}}}{\cf1\lang9
\par {\listtext\pard\plain\f3\lang9\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field{\*\fldinst {\cf1\lang9 HYPERLINK "http://www.jroller.com/page/tirsen" }{\fs20\cf1\lang9 {\*\datafield
00d0c9ea79f9bace118c8200aa004ba90b02000000170000002300000068007400740070003a002f002f007700770077002e006a0072006f006c006c00650072002e0063006f006d002f0070006100670065002f00740069007200730065006e000000e0c9ea79f9bace118c8200aa004ba90b460000006800740074007000
3a002f002f007700770077002e006a0072006f006c006c00650072002e0063006f006d002f0070006100670065002f00740069007200730065006e000000016100}}}{\fldrslt {\cs18\b\cf11\lang9 http://www.jroller.com/page/tirsen}}}{\cf1\lang9
\par {\listtext\pard\plain\f3\lang9\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field{\*\fldinst {\cf1\lang9 HYPERLINK "http://lists.codehaus.org/pipermail/picocontainer-dev/2003-September/001090.html" }{\fs20\cf1\lang9 {\*\datafield
00d0c9ea79f9bace118c8200aa004ba90b02000000170000005100000068007400740070003a002f002f006c0069007300740073002e0063006f006400650068006100750073002e006f00720067002f00700069007000650072006d00610069006c002f007000690063006f0063006f006e007400610069006e0065007200
2d006400650076002f0032003000300033002d00530065007000740065006d006200650072002f003000300031003000390030002e00680074006d006c000000e0c9ea79f9bace118c8200aa004ba90ba200000068007400740070003a002f002f006c0069007300740073002e0063006f006400650068006100750073002e
006f00720067002f00700069007000650072006d00610069006c002f007000690063006f0063006f006e007400610069006e00650072002d006400650076002f0032003000300033002d00530065007000740065006d006200650072002f003000300031003000390030002e00680074006d006c0000000000}}}{\fldrslt
{\cs18\b\cf11\lang9 http://lists.codehaus.org/pipermail/picocontainer-dev/2003-September/001090.html}}}{\cf1\lang9
\par {\listtext\pard\plain\f3\lang9\cgrid \loch\af3\dbch\af0\hich\f3 \'b7\tab}}{\field{\*\fldinst {\cf1\lang9 HYPERLINK "http://lists.codehaus.org/pipermail/picocontainer-dev/2003-August/000957.html" }{\fs20\cf1\lang9 {\*\datafield
00d0c9ea79f9bace118c8200aa004ba90b02000000170000004e00000068007400740070003a002f002f006c0069007300740073002e0063006f006400650068006100750073002e006f00720067002f00700069007000650072006d00610069006c002f007000690063006f0063006f006e007400610069006e0065007200
2d006400650076002f0032003000300033002d004100750067007500730074002f003000300030003900350037002e00680074006d006c000000e0c9ea79f9bace118c8200aa004ba90b9c00000068007400740070003a002f002f006c0069007300740073002e0063006f006400650068006100750073002e006f00720067
002f00700069007000650072006d00610069006c002f007000690063006f0063006f006e007400610069006e00650072002d006400650076002f0032003000300033002d004100750067007500730074002f003000300030003900350037002e00680074006d006c0000000100}}}{\fldrslt {\cs18\b\cf11\lang9
http://lists.codehaus.org/pipermail/picocontainer-dev/2003-August/000957.html}}}{\cf1\lang9
\par }\pard \widctlpar\adjustright {\cf1
\par The 2 solutions combined provide a great amount of flexibility.
\par
\par Code sample with AspectJ:
\par
\par }\pard \widctlpar\tx916\tx1832\tx2748\tx3664\tx4580\tx5496\tx6412\tx7328\tx8244\tx9160\tx10076\tx10992\tx11908\tx12824\tx13740\tx14656\adjustright {\f6\fs20\lang9 privileged public aspect ConfigureServiceManager
\par \{
\par \tab public pointcut createServiceManager(ServiceManager manager) :
\par \tab \tab execution (protected ServiceManager.new())
\par \tab \tab && this(manager);
\par
\par \tab after(ServiceManager manager) : createServiceManager(manager)
\par \tab \{
\par \tab \tab final MutablePicoContainer container =
\par \tab \tab \tab manager._container;
\par
\par
\par \tab \tab container.registerComponentImplementation(
\par \tab \tab \tab Dispatcher.class,
\par \tab \tab \tab SMTPDispatcher.class);
\par \tab \tab container.registerComponentImplementation(
\par \tab \tab \tab MailerService.class);
\par \tab \}
\par }\pard \widctlpar\adjustright {\f6\fs20\lang9 \}}{\f6\fs20
\par }}
1.1 jakarta-jetspeed-2/design-docs/src/preferences/PreferencesDesignNotes.txt
Index: PreferencesDesignNotes.txt
===================================================================
Copyright 2004 The Apache Software Foundation
Licensed 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.
---------------------------------------------------------------
- Preferences design considerations.
---------------------------------------------------------------
java.util.prefs.Preferences implementation.
The preferences implementation has been designed to be able to persist the
following preferences structure:
<preferences EXTERNAL_XML_VERSION="1.0">
<root type="user">
<map />
<node name="user">
<map />
<node name="principal1">
<map />
<node name="propertyset1">
<map>
<entry key="set1prop1" value="256" />
<entry key="set1prop2" value="314" />
<entry key="set1prop3" value="540" />
<entry key="set1prop4" value="63" />
</map>
</node>
<node name="propertyset2">
<map>
<entry key="set2prop1" value="256" />
<entry key="set2prop2" value="314" />
<entry key="set2prop3" value="540" />
<entry key="set2prop4" value="63" />
</map>
</node>
</node>
<node name="principal2">
<map />
<node name="propertyset1">
<map>
<entry key="set1prop1" value="256" />
<entry key="set1prop2" value="314" />
<entry key="set1prop3" value="540" />
<entry key="set1prop4" value="63" />
</map>
</node>
<node name="propertyset2">
<map>
<entry key="set2prop1" value="256" />
<entry key="set2prop2" value="314" />
<entry key="set2prop3" value="540" />
<entry key="set2prop4" value="63" />
</map>
</node>
</node>
-----
etc.
-----
</node>
<node name="group">
<map />
<node name="groupid1">
<map />
<node name="propertyset1">
<map>
<entry key="set1prop1" value="256" />
<entry key="set1prop2" value="314" />
<entry key="set1prop3" value="540" />
<entry key="set1prop4" value="63" />
</map>
</node>
<node name="propertyset2">
<map>
<entry key="set2prop1" value="256" />
<entry key="set2prop2" value="314" />
<entry key="set2prop3" value="540" />
<entry key="set2prop4" value="63" />
</map>
</node>
</node>
<node name="groupid1">
<map />
<node name="propertyset1">
<map>
<entry key="set1prop1" value="256" />
<entry key="set1prop2" value="314" />
<entry key="set1prop3" value="540" />
<entry key="set1prop4" value="63" />
</map>
</node>
<node name="propertyset2">
<map>
<entry key="set2prop1" value="256" />
<entry key="set2prop2" value="314" />
<entry key="set2prop3" value="540" />
<entry key="set2prop4" value="63" />
</map>
</node>
</node>
-----
etc.
-----
</node>
</node>
</root>
</preferences>
The idea is to be able to persist group or user principals properties
where properties are logically grouped into property sets.
Therefore, we could have preferences nodes of type user such as:
1. /user/userprincipal1/propertyset1 where propertyset1 contains properties
according to a property set definition.
2. /group/groupprincipal1/propertyset2 where propertyset1 contains properties
according to a property set definition.
Good preferences article: http://www.onjava.com/pub/a/onjava/synd/2001/10/17/j2se.html
---------------------------------------------------------------
- Implementation notes.
---------------------------------------------------------------
- Added the following method to the OJB persistence plugin:
In org.apache.jetspeed.services.perisistence
LookUpCriteria: add(String, java.util.Collection)
PersistencePlugin: deleteByQuery(java.lang.Object)
In org.apache.jetspeed.services.perisistence.impl
OjbLookUpCriteria: add(String, java.util.Collection)
AbstractOJBPersistencePlugin: deleteByQuery(java.lang.Object)
The test were modified to test deleteByQuery.
- Documentation and javadoc can be found under design-docs and docs.
- Implemented java.util.prefs.Preferences spi.
- Updated to checkstyle 3.0.
1.1 jakarta-jetspeed-2/design-docs/src/entities/PortletEntity.dia
<<Binary file>>
1.1 jakarta-jetspeed-2/design-docs/src/entities/PortletEntity.png
<<Binary file>>
1.1 jakarta-jetspeed-2/design-docs/src/entities/EntityPreferences.txt
Index: EntityPreferences.txt
===================================================================
Copyright 2004 The Apache Software Foundation
Licensed 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.
Entity
(
entityid
--------------------------------------
Portlet Preference Lookup Algorithm
--------------------------------------
(a) Look for authenticated principal's PortletPreference for the given entity
if Found
Return PortletPreference
End if
(b) Look for PortletPreference for this entity window, not associated to a principal
if Found
Return PortletPreference
End
(c) Look for default PortletPreference for the portlet
if Found
Return default PortletPreference
End
Return Not Found
-----------------------------
Model
-----------------------------
Page 1 has
Portlet-1, entity id = 51
Portlet-2, entity id = 52
Portlet-3, entity id = 53
Portlet-1, entity id = 54
Username = David
RELATIONSHIPS
(a) Stored in PREF_NODE table with NODE_NAME =
for entity 51: /user/David/portletprefs/51
52: /user/David/portletprefs/52
53: /user/David/portletprefs/53
54: /user/David/portletprefs/54
(b) Considering window 51, the pref doesn't exist for user David,
Stored in PREF_NODE table with NODE_NAME =
for entity 51: /System/Jetspeed/entities/51
(c) fallback to Portlet Registry
-----------------------------
Associations
-----------------------------
TABLE ENTITY_WINDOW_ASSOC
(
ENTITY_ID INTEGER REFERENCES ENTITY,
WINDOW_ID INTEGER REFERENCES FRAGMENT
)
TABLE ENTITY_PREF_ASSOC
(
ENTITY_ID INTEGER REFERENCES ENTITY,
PREFS_NODE INTEGER REFERENCES PREFS_NODE
)
1.1 jakarta-jetspeed-2/design-docs/src/objectmodel/ObjectModelOpenIssues.txt
Index: ObjectModelOpenIssues.txt
===================================================================
Copyright 2004 The Apache Software Foundation
Licensed 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.
=====================================
Object Model Open Issue List
=====================================
Pluto doesn't provide full-fidelity of the portlet.xml
A lot of short-cuts are taken
This document lists all known issues
PortletDefinition
-----------------
1. expirationCache, why String? (Pluto)
2. Display Name doesn't have language support (array)
Look at Paul's Castor implementation, already solved
see old model: org.apache.jetspeed.om.common.base.BaseDisplayName
3. Description is missing
It also uses an array based on language
see old model: org.apache.jetspeed.om.common.impl.CastorJdoPortletDescription
4. Supports ID is not stored
<supports id="Minimal support">
5. Not tested or mapped
<xs:element name="supported-locale" type="portlet:supported-localeType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="resource-bundle" type="portlet:resource-bundleType" minOccurs="0"/>
<xs:element name="security-role-ref" type="portlet:security-role-refType" minOccurs="0" maxOccurs="unbounded"/>
1.1 jakarta-jetspeed-2/design-docs/src/security/securitySchema_v1.1.pdf
<<Binary file>>
1.1 jakarta-jetspeed-2/design-docs/src/security/SecurityDesignNotes.txt
Index: SecurityDesignNotes.txt
===================================================================
Copyright 2004 The Apache Software Foundation
Licensed 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.
* Design Goals:
1. Implement Jetspeed security using JAAS.
2. Use AOP/interception when appropriate for authorization.
Approach:
A user is represented by a combination of Subject (java.security.auth.Subject) and Preferences (java.util.prefs.Preferences).
The UserPrincipal provide the link between Subject and Preferences as user preferences are stored under:
/user/${UserPrincipal}
-----------------------------------
Authentication
-----------------------------------
Authentication leverage JAAS.
Jetspeed default implementation provide an RdbmsLoginModule that allows
user authentication against user credentials stored in a database.
Upon authentication a Subject is created with the following principals:
- UserPrincipal (e.g. /user/theUsername)
- RolePrincipal
- GroupPrincipal
-----------------------------------
Authorization
-----------------------------------
* What are we securing:
Many portal resources are being secured: pages, portlets, tabs, etc.
Portal resources have various security policy associated to them for the following type of Principals:
- UserPrincipal
- RolePrincipal
- GroupPrincipal
* How are we securing it:
Securing resources will leverage a custom policy implementation and permissions. The custom policy implementation
(o.a.j.security.auth.RdbmsPolicy) will allow to apply policies as follow:
grant principal o.a.j.security.UserPrincipal "theUserPrincipal" {
permission o.a.j.security.PagePermission "mypage", "view";
permission o.a.j.security.PortletPermission "myportlet", "view,edit,minimize,maximize";
permission o.a.j.security.TabPermission "mytab", "view";
};
grant principal o.a.j.security.RolePrincipal "theRolePrincipal" {
permission o.a.j.security.PagePermission "mypage", "view";
permission o.a.j.security.PortletPermission "myportlet", "view,edit,minimize,maximize";
permission o.a.j.security.TabPermission "mytab", "view";
};
grant principal o.a.j.security.GroupPrincipal "theGroupPrincipal" {
permission o.a.j.security.PagePermission "mypage", "view";
permission o.a.j.security.PortletPermission "myportlet", "view,edit,minimize,maximize";
permission o.a.j.security.TabPermission "mytab", "view";
};
* The following permission are anticipated:
TODO
* How do we access it:
Given that a user is authenticated that the current subject is the one of that user, we would check for permission
doing:
Subject.doAs(loginContext.getSubject(), new PrivilegedAction()
{
public Object run()
{
PortletPermission perm1 = new PortletPermission("myportlet", "view");
System.out.println("\t\t[TestRdbmsPolicy] Check perm1.");
AccessController.checkPermission(perm1);
return null;
}
});
* Configuring the new policy
The java security provider is set at runtime through the Policy.setPolicy()
static access.
Check the TestRdbmsPolicy and javadoc for more info.
* The RDBMS policy implementation:
The assumption is made that policies will always look like:
grant principal ...
Therefore the RDBMS policy implementation will grant access for all classes.
Codebase support and CodeSource support is NOT implemented.
* Link between the Security and Preferences services:
The link between the Security service and the Preferences services is performed using
security_principal.name and pref_node.full_path
The name of a user principal in the security layer should match the full path of that user
preferences root in the prefs layer:
e.g: /user/theUserPrincipal
* Managing groups and roles:
Use java.util.prefs.Preferences to store roles and groups as user preferences.
<preferences EXTERNAL_XML_VERSION="1.0">
<root type="user">
<map />
<node name="group1">
<map />
<node name="groupid1.1">
<map />
<node name="groupid1.1.1">
<map />
</node>
</node>
</node>
<node name="role1">
<map />
<node name="roleid1.1">
<map />
<node name="roleid1.1.1">
<map />
</node>
</node>
</node>
</root>
This defines the following group and role hierarchy:
/group1/groupid1.1/groupid1.1.1
and
/role1/roleid1.1/roleid1.1.1
Where map can define group or role custom properties
E.g: For roles, we could have a rule custom property (or a pointer to a rule) that allow rule based role definition tied to some rule engine (Drools for instance) and is validated when the isInRole method is invoked.
For group, a portal could use group to describe organization and have custom property such as address, city, etc associated with the organization/group.
Readings:
http://java.sun.com/j2se/1.4.2/docs/api/index.html
http://www.ufr-info-p7.jussieu.fr/hf/jdk1.3/docs/guide/security/Acl.html
http://www.theserverside.com/resources/AspectJreview.jsp
http://java.sun.com/j2se/1.4.2/docs/guide/security/spec/security-spec.doc2.html
http://www-106.ibm.com/developerworks/library/j-jaas/?n-j-442
1.1 jakarta-jetspeed-2/design-docs/src/navigations/NavigationalStateProposal.txt
Index: NavigationalStateProposal.txt
===================================================================
Copyright 2004 The Apache Software Foundation
Licensed 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.
Navigational State and Jetspeed Path Proposal
The URL path is a common way to track navigation state.
Pluto does this, as does Websphere.
Jetspeed has the concepts of folders, and pages.
Folders contain pages or more folders. A typical tree hierarchy.
Users can navigate through the portal by specifying folders and pages.
Jetspeed Folders and Pages also represent navigational state,
however they are not directly covered by the Portlet specification.
We are proposing specifying the Jetspeed Paths and Folders directly in the URL path, not the request parameters.
This solves the issues of locating the correct page at all times, as long as Jetspeed rewrites the URL.
The Jetspeed URL rewriter must always rewrite the Page into the URL.
Of course there are still default pages for users, which do not need to be in the URL.
Example URLs:
http://localhost/portal/jetspeed/nfl/afc/chiefs/passing-stats.psml
where "nfl/afc/chiefs/passing-stats.psml" is the complete path.
and passing-stats is either a page or folder.
".psml" helps the profiler figure out that its a page.
Otherwise it will first look for a page with that name, then a folder.
NOTE: we are not using path pairs
This will introduce problems for other path params that require pairs.
Most notably, Navigation State.
Navigation State is currently implemented with Pluto-like pairs of parameters.
In order for this to continue to function, we would enhance the path parsing code to find
the end of the path locator and then start parsing.
Navigational state must be written after the folder/page path.
Window Navigational State will be enhanced:
1. abstract all navigational state to use interfaces
2. provide 2 implementations
1. URL path state
2. session-based state
note: i don't think its possible to use request params to keep nav state
1.1 jakarta-jetspeed-2/design-docs/src/pipeline/request_lifcycle.htm
Index: request_lifcycle.htm
===================================================================
<!--
Copyright 2004 The Apache Software Foundation
Licensed 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>
<head>
<title>Portlet Action Request Life Cycle</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body bgcolor="#FFFFFF" text="#000000">
<div width="600">
<ol>
<li> The o.a.j.container.ContainerValve receives the request.</li>
<li>The request is then inspected by the o.a.j.engine.core.PortalControlParameter.getPortletWindowOfAction()
to see whether or not a portlet action has been requested.</li>
<li>If an action has been found the o.a.j.request.RequestContext.setActionWindow()
is passed that action window, if not it is passed null.</li>
<li>Next the ActionValve checks to see if the there is an action window defined,
if the there is there, the PortletContainer.processPortletAction() is called
by passing in the action window and HttpServletRequest aand httpServletResponse
objects. The request and response objects are actually wrappers
around the original request and response objects which can parse action
and/or render parameters for a specific PortletWindow. These wrappers are
generated by calling RequestContext.getRequestForWindow() and RequestContext.getResponseForWindow()
respectively.</li>
<li>The container now handles the request. The container is responsible to
generating an ActionRequest and an ActionResponse for the portlet action
to be invoked. Next the creates a new PortletInvoker object by passsing
the PortletDefinition which was extract from the PortletWindow via the PortletEntity.
In Jetspeed's case, the PortletInvoker will be an instance of o.a.j.container.invoker.ServletPortletInvoker.
The PortletInvoker.action() method is called passing in the
previously generated ActionRequest and ActionResponse.</li>
<li>ServletPortletInvoker receives the ActionRequest and ActionResponse from
the container. From here the ServletPortletInvoker extracts the ServletRequest
and ServletResponse from the ActionRequest and ActionResponse respectively.
</li>
<li>The PortletDefintion (which was provided at creation time to the ServletPortletInvoker)
is queried for the WebApplication object which has the context path of the
web app that controls this portlet. </li>
<li>With the name of the webapp ServletPortletInvoker no dispatches the request
to the actual web application represented by the context path. NOTE:
All portlet applications must contain a definition in its web.xml
for the o.a.j.container.JetspeedContainerPortlet. However, Jetspeed's
deployment tool will generally take care of this for you.</li>
<li>Once the JetspeedContainerServlet receives the request, it invokes Portlet.processAction(ActionRequest,
ActionResponse) on your portlet.</li>
<li>After the PortletInvoker and the JetspeedContainerServlet are finished
the container once again takes control. The container gets the redirection
location from the response using ActionResponse.getRedirectLocation(). The
ActionResponse is now checked to see if the state or the mode of the portlet
has changed and communicates this information PortletWindow we are invoking
the action on. These changes are also applied to the rediretion
location and passed to the current ServletResponse.sendRedirect() method
so that all the encoded portlet state information is preserved in the URL></li>
</ol>
<p> </p>
bottom
</div>
</body>
</html>
1.1 jakarta-jetspeed-2/design-docs/src/pipeline/jetspeedPipeline_v1.0.pdf
<<Binary file>>
1.1 jakarta-jetspeed-2/design-docs/src/pipeline/RequestSequence.jpg
<<Binary file>>
1.1 jakarta-jetspeed-2/design-docs/src/capabilities/CapabilityHandlingJ2.pdf
<<Binary file>>
1.1 jakarta-jetspeed-2/design-docs/src/decorations/portlet-decorations.dia
<<Binary file>>
---------------------------------------------------------------------
To unsubscribe, e-mail: jetspeed-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jetspeed-dev-help@jakarta.apache.org