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. &nbsp;&nbsp;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. &nbsp;Next the creates a new PortletInvoker object by passsing 
        the PortletDefinition which was extract from the PortletWindow via the PortletEntity.&nbsp;&nbsp; 
        In Jetspeed's case, the PortletInvoker will be an instance of o.a.j.container.invoker.ServletPortletInvoker. 
        &nbsp;The &nbsp;PortletInvoker.action() method is called passing in the 
        previously generated ActionRequest and ActionResponse.</li>
      <li>ServletPortletInvoker receives the ActionRequest and ActionResponse from 
        the container. &nbsp;From here the ServletPortletInvoker extracts the ServletRequest 
        and ServletResponse from the ActionRequest and ActionResponse respectively. 
        &nbsp;</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.&nbsp;&nbsp;</li>
      <li>With the name of the webapp ServletPortletInvoker no dispatches the request 
        to the actual web application represented by the context path.&nbsp;&nbsp;NOTE: 
        &nbsp;All portlet applications must contain a definition in its web.xml 
        for the o.a.j.container.JetspeedContainerPortlet.&nbsp;&nbsp;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. &nbsp;The container gets the redirection 
        location from the response using ActionResponse.getRedirectLocation().&nbsp;&nbsp;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.&nbsp;&nbsp;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&gt;</li>
    </ol>
    <p>&nbsp;</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