Author: craigmcc
Date: Mon Nov 21 14:51:42 2005
New Revision: 348006

URL: http://svn.apache.org/viewcvs?rev=348006&view=rev
Log:
Flesh out description of the Application Manager feature.

Modified:
    struts/shale/trunk/xdocs/features-application-manager.xml

Modified: struts/shale/trunk/xdocs/features-application-manager.xml
URL: 
http://svn.apache.org/viewcvs/struts/shale/trunk/xdocs/features-application-manager.xml?rev=348006&r1=348005&r2=348006&view=diff
==============================================================================
--- struts/shale/trunk/xdocs/features-application-manager.xml (original)
+++ struts/shale/trunk/xdocs/features-application-manager.xml Mon Nov 21 
14:51:42 2005
@@ -10,7 +10,168 @@
     <section name="Shale Application Manager">
     <a name="application"/>
 
-      <p>FIXME - Describe application manager feature.</p>
+      <a name="application-introduction"/>
+      <subsection name="Introduction">
+
+        <p>Much has been made of the fact that JavaServer Faces promotes
+        a <em>page oriented</em> architecture for applications, typically
+        associating a request scoped "backing bean" with each page to contain
+        event handlers and/or submitted values.  Indeed, Shale itself offers
+        extended support for this paradigm by virtue of its
+        <a href="features-view-controller.html">View Controller</a> feature.
+        This is in contrast to the <em>action oriented</em> architecture
+        typically found in web application frameworks ike
+        <a href="http://struts.apache.org/";>Struts 1.x</a>.</p>
+
+        <p>A second aspect of action oriented frameworks, however, is also
+        useful.  They typically implement an application level
+        <em>controller</em> (in the sense of the Model/View/Controller
+        design pattern) through which <strong>all</strong> HTTP requests to
+        the application are funneled.  Various frameworks offer mechanisms
+        to customize the lifecycle processing that is performed, for example:
+        </p>
+        <ul>
+        <li>In Struts 1.1-1.2, you subclass <code>RequestProcessor</code>
+            and override the processXxx() series of methods that perform the
+            actual processing of the request.</li>
+        <li>In Struts 1.3, you customize the Commons Chain command pipeline
+            that implements the standard request processing lifecycle.</li>
+        <li>In JavaServer Faces, you can insert <code>PhaseListener</code>
+            instances that receive control before or after the standard
+            phases of the request processing lifecycle, which can exert
+            control over what happens next.</li>
+        </ul>
+
+        <p>Shale, being based upon JavaServer Faces, supports the standard
+        <code>PhaseListener</code> approach to customizing the request
+        processing lifecycle.  However, it also supports <em>Application
+        Manager</em> functionality that can customize processing before
+        or after the standard JavaServer Faces lifecycle, as described below.
+        </p>
+
+      </subsection>
+
+      <a name="application-services"/>
+      <subsection name="Services Provided">
+
+        <p>The <em>Application Manager</em> feature of Shale
+        provides application wide services as described below:</p>
+
+        <h4>(A) Standard Per-Request Processing</h4>
+
+        <p>As described in <a href="using.html#using-configuring">Configuring
+        Your Application For Shale</a>, you are requested to configure a
+        <em>Servlet Filter</em>
+        (<code>org.apache.shale.faces.ShaleApplicationFilter</code>) and
+        map it to process incoming URLs (typically using the URL pattern
+        <code>/*</code> to process all requests to this application).
+        This filter receives control both <strong>before</strong> and
+        <strong>after</strong> the standard JavaServer Faces request
+        processing lifecycle (which is implemented as a servlet).</p>
+
+        <p><code>ShaleApplicationFilter</code> imposes a standard request
+        processing lifecycle using
+        <a href="http://jakarta.apache.org/commons/chain/";>Commons Chain</a>
+        technology, which provides both preprocessing and postprocessing
+        hooks where the application developer can plug in additional
+        behavior at these two points in time.  The following processing
+        is performed for each request:</p>
+        <ul>
+        <li>Construct an instance of <code>ShaleWebContext</code> (which
+            implements the Commons Chain <code>Context</code> interface)
+            to represent the current request.  This instance will be passed
+            in to any Commons Chain commands involved in processing
+            the current request.</li>
+        <li>Store the <code>ShaleWebContext</code> instance as a request
+            scope attribute under the key identified by manifest constant
+            <code>ShaleApplicationFilter.CONTEXT_ATTR</code> so that it
+            is available to later processing stages.</li>
+        <li>Check for a Commons Chain <code>Command</code> instance named
+            <code>preprocess</code> in the <code>shale</code> catalog.  If
+            such a command (or chain) exists:
+            <ul>
+            <li>Execute the command or chain, rethrowing any
+                exception that might occur.</li>
+            <li>If the executed command or chain returned <code>true</code>
+                (indicating that processing for the entire request should
+                be considered complete), remove the request scope attribute
+                that was added and earlier, and exit.</li>
+            </ul></li>
+        <li>Call <code>doFilter()</code> on the <code>FilterChain</code>
+            argument passed in, which will ultimately trigger the standard
+            JavaServer Faces processing when the incoming URL is mapped to
+            <code>FacesServlet</code>.</li>
+        <li>Check for a Commons Chain <code>Command</code> instance named
+            <code>postprocess</code> in the <code>shale</code> catalog.
+            If such a command (or chain) exists, execute it.</li>
+        <li>Clean up the request scope attribute stored earlier.</li>
+        </ul>
+
+        <h4>(B) Preprocess and Postprocess Basic Implementations</h4>
+
+        <p>In addition to the standard request processing lifecycle described
+        in the previous section, Shale offers an abstract base class
+        <a 
href="shale-core/apidocs/org/apache/shale/application/AbstractRegExpFilter.html">
+        org.apache.shale.application.AbstractReqExpFilter</a>
+        suitable for developing <code>preprocess</code> commands that perform
+        request filtering based on matching incoming request values to
+        regular expressions.  See the Javadocs for this class for more
+        information.</p>
+
+        <p>Three concrete implementations based on this abstract base class
+        are also provided:</p>
+        <ul>
+        <li><a 
href="shale-core/apidocs/org/apache/shale/application/ContextRelativePathFilter.html">
+            ContextRelativePathFilter</a> - Filters requests by matching the
+            context relative portion of the path (i.e. starting with the slash
+            after the context path itself) against one or more regular
+            expressions.</li>
+        <li><a 
href="shale-core/apidocs/org/apache/shale/application/RemoteAddrFilter.html">
+            RemoteAddrFilter</a> - Filters requests by matching the IP address
+            of the remote client against one or more regular expressions.</li>
+        <li><a 
href="shale-core/apidocs/org/apache/shale/application/RemoteHostFilter.html">
+            RemoteHostFilter</a> - Filters requests by matching the hostname
+            of the remote client against one or more regular expressions.</li>
+        </ul>
+
+      </subsection>
+
+      <a name="application-using"/>
+      <subsection name="Using Application Manager">
+
+        <p>The <em>Use Cases</em> example application incorporates the
+        <code>ContextRelativePathFilter</code> described above, using it
+        to disallow direct access to JSP pages by URLs manually typed in
+        to the browser.  This is accomplished by the following configuration
+        stored in the <code>WEB-INF/chain-config.xml</code> resource:</p>
+
+<source>
+  &lt;catalogs&gt;
+
+    &lt;catalog name="shale"&gt;
+
+      ...
+
+      &lt;command 
className="org.apache.shale.application.ContextRelativePathFilter"
+       includes="\S*\.xml,\S*\.faces,\S*\.html,\S*\.gif,\S*\.jpg,index\.jsp"
+       excludes="\S*\.jsp,\S*\.jspf"/>
+
+      ...
+
+    &lt;/catalog&gt;
+
+  &lt;/catalogs&gt;
+</source>
+
+<p>The <code>ContextRelativePathFilter</code> instance is configured to pass
+through context relative paths that match one of the regular expressions in
+the <code>includes</code> attribute, while disallowing access for context
+relative paths that match one of the regular expressions in the
+<code>excludes</code> list.  With these settings, direct access to any URL
+ending in <code>.jsp</code> or <code>.jspf</code> (other than to a resource
+named <code>index.jsp</code>) will be prevented.</p>
+
+      </subsection>
 
     </section>
 



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to